我正在使用C#在Unity 5.4.0f3中创建动物园模拟游戏。我试图产生一个熊预制克隆,做一些数学,等待一段时间,做一些数学,然后在一个函数中销毁克隆对象。这就是我现在所拥有的。我想在WaitForBearLife()中尝试做的数学运算不会发生。提前谢谢!
using UnityEngine;
using System.Collections;
public class BuyBearButton : MonoBehaviour
{
[SerializeField] GameManager gameManager;
[SerializeField] GameObject bearPrefab;
[SerializeField] Visitor visitor;
GameObject bearClone;
float xMin = -15;
float xMax = 15;
float yMin = 5;
float yMax = 6;
public void BuyBear()
{
Vector2 pos = new Vector2 (Random.Range (xMin, xMax), Random.Range (yMin, yMax));
if (gameManager.myMoney >= gameManager.bearCost)
{
gameManager.numberOfBears++;
gameManager.myMoney = gameManager.myMoney - gameManager.bearCost;
visitor.spawnTime = visitor.spawnTime / visitor.bearAttraction;
bearClone = (GameObject) Instantiate (bearPrefab, pos, transform.rotation);
StartCoroutine (WaitForBearLife ());
Destroy (bearClone, gameManager.bearLife);
}
}
IEnumerator WaitForBearLife()
{
yield return new WaitForSeconds (gameManager.bearLife);
visitor.spawnTime = visitor.spawnTime * visitor.bearAttraction;
}
}
答案 0 :(得分:1)
您需要将Destroy功能从BuyBear移动到WaitForBearLife
问题是现在StartCouroutine调用立即返回,并且立即调用Destroy()
答案 1 :(得分:0)
我刚刚将您的代码复制到一个空项目中,并为GameManager和Visitor创建了占位符类,只需在此脚本中需要的变量中使用随机值。它工作得很好......真的。所以,我会给你一些问题(因为我还没有在你的帖子中发表评论的声誉......)
首先,熊预制件中有任何类型的脚本吗?
这是因为可能有可能会中断协程的东西。这似乎不太可能,但在你尝试之前你无法确定。
接下来,访客和GameManager的声明如何?
一开始,当您定义类名等时。事实上,我想了解更多关于你使用的变量,比如gameManager.bearLife等。
现在,让我们看看值。
我试过了:
public int myMoney = 50000;
public int bearCost = 50;
public int numberOfBears = 0;
public float bearLife = 2.0f;
在GameManager中。和
public float spawnTime = 5;
public float bearAttraction = 2;
在访客中。它做了一些奇怪的数学运算,我想这个脚本本身的逻辑现在正在开发中。但关键是,它有效,并且有了这个:
IEnumerator WaitForBearLife()
{
yield return new WaitForSeconds (gameManager.bearLife);
print (visitor.spawnTime);
visitor.spawnTime = visitor.spawnTime * visitor.bearAttraction;
print (visitor.spawnTime);
}
如果我只点击一次,我会在对应的打印件中获得2.5和5。一些印刷品(如@ Benjamin-lecomte所述)可以帮助您了解它是否正在执行该部分。
现在,如果不了解更多,我无法帮助你。所以我会等你的回答。