【发布时间】:2016-05-20 05:21:11
【问题描述】:
我在 Unity 中使用 C# 进行基本游戏时遇到了两难境地 - 我需要在随机位置生成 10 个立方体,但是一旦生成了一个立方体,如果它检测到与此脚本中的另一个游戏对象发生碰撞,我会销毁它 附加到立方体对象:
void OnCollisionStay(Collision col){
if (col.gameObject.tag == "Maze" || col.gameObject.tag == "Player") {
//Destroy cube
Destroy(this.gameObject);
spawnCubes.numCubesExist--;
Debug.Log ("touching!!" + spawnCubes.numCubesExist);
spawnCubes.touchedMaze = true;
}
}
在我场景的另一个脚本中,我在这里生成立方体。我正在使用 public static int numCubesExist 来枚举场景中的立方体数量(尽管这不起作用)并使用 NUMTOBESPAWNED 来设置场景中应该最终出现的立方体数量。
在多维数据集脚本中,如果检测到碰撞,numCubesExist 会减 1,并且当产生多维数据集时,cubeSpawner (); 会增加。我的逻辑是,我的 while 语句将继续产生 UNTIL numCubesExist == NUMTOBESPAWNED 但这不会发生。
void Start () {
while(numCubesExist <= NUMTOBESPAWNED)
{
cubeSpawner ();
}
}
void cubeSpawner()
{
//Random textures
switch (Random.Range (0, 3)) {
case 0:
cube.GetComponent<Renderer> ().material = color1;
break;
case 1:
cube.GetComponent<Renderer> ().material = color2;
break;
case 2:
cube.GetComponent<Renderer> ().material = color3;
break;
case 3:
cube.GetComponent<Renderer> ().material = color4;
break;
}
//Random positions
if (UIManagerScript.sceneNum == 0) {
position = new Vector3 (Random.Range (7.0F, 26.0F), (float)1.4, Random.Range (-9.0F, 10.0F));
Debug.Log (position);
}
else if(UIManagerScript.sceneNum == 1) {
position = new Vector3 (Random.Range (7.0F, 47.0F), (float)1.4, Random.Range (-9.0F, 10.0F));
Debug.Log (position);
}
else if(UIManagerScript.sceneNum == 2) {
position = new Vector3 (Random.Range (-4.7F, 44.0F), (float)1.4, Random.Range (-23.0F, 25.0F));
Debug.Log (position);
}
//spawn
Instantiate (cube, position, Quaternion.identity);
Debug.Log ("spawned it!"+numCubesExist);
numCubesExist++;
}
在打印所有生成语句之后打印多维数据集脚本碰撞中的我的 Debug.Log 语句,所以我看到的是多维数据集生成正确的数字,然后其中一半被销毁而不是被替换OnCollisionStay。所以我的立方体总是比NUMTOBESPAWNED 少。
我是 Unity 新手——实现这一目标的最佳方法是什么?我应该在哪里调用我的 while 循环(更新只会产生一百万个立方体)?
编辑枚举多维数据集:
GameObject[] allObjects = GameObject.FindGameObjectsWithTag("blueCube");
foreach (GameObject go in allObjects) {
cubesInScene++;
}
【问题讨论】:
-
让我直说。立方体在 OnCollisionStay 中生成和销毁,但您希望场景中的立方体数量始终为 NUMTOBESPAWNED 数量?
-
不 - 只是最初。当我开始场景时,我希望在所有生成和销毁完成后有 NUMTOBESPAWNED 立方体。 (我在碰撞时破坏的唯一原因是因为否则我会在墙内生成立方体)
-
您可能有赛车状况。假设你想要 5 个立方体。您的 while 循环会生成所有 5 个,这意味着立方体的数量与预期相符。 while 循环结束,然后其中一个立方体检测到它与某物发生碰撞并将其自行移除。此时立方体的数量为 4,但 while 循环已经结束。
-
只是为了澄清您基本上已经注意到的内容:
Start()总是在第一个OnCollisionStay()之前调用。您可以在此处查看事件的全部顺序:docs.unity3d.com/Manual/ExecutionOrder.html -
@NickOtten 是的——你有什么建议可以解决这个问题?