此代码为C#,我正在使用Unity游戏引擎。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class CollisionDetectionForQuest : MonoBehaviour {
public GameObject[] Garbages;
public GameObject[] GarbagesDummy;
public bool activateInactive;
//public GameObject[] Counter;
void Start(){
Garbages = GameObject.FindGameObjectsWithTag("Trash");
foreach (GameObject garb in Garbages) {
}
GarbagesDummy = GameObject.FindGameObjectsWithTag ("TrashDummy");
foreach(GameObject dummy in GarbagesDummy){
dummy.gameObject.SetActive (false);
}
}
void OnCollisionEnter(Collision obj){
if (obj.gameObject.CompareTag ("Trash")) {
obj.gameObject.SetActive (false);
activateInactive = true;
//in this line i want to activate my GarbageDummy 1 by 1 base on
//every Trash i put in my collider.
foreach(GameObject a in GarbagesDummy){
a.gameObject.SetActive (true);
}
}
所以基本上我想在我放在碰撞机上的每个垃圾上逐一激活 garbagedummy 游戏对象。但我试过这个并没有用:
foreach(GameObject dummy in GarbageDummy){
for(int i = 0; i < GarbageDummy.Length; i++){
dummy.gameobject.setActive(true);
}
}
任何人都可以帮忙。
以下是我的截图:
答案 0 :(得分:1)
如果你想激活一个垃圾虚拟对象(数组中的任何一个),那么你不想在那里使用循环。相反,请跟踪您已激活的那个字段,如下所示:
public int ActivatedDummyIndex; // Add this!
public GameObject[] Garbages;
public GameObject[] GarbagesDummy;
...
然后每当添加一个垃圾对象时,增加该数字并将其用作GarbagesDummy数组中的索引:
void OnCollisionEnter(Collision obj){
if (obj.gameObject.CompareTag ("Trash")) {
obj.gameObject.SetActive (false);
activateInactive = true;
// Get the next dummy:
GameObject dummy = GarbagesDummy[ActivatedDummyIndex];
// Increase the index for next time:
ActivatedDummyIndex++;
// Activate that dummy:
dummy.SetActive(true);
}
}
这假设虚拟对象的数量与垃圾对象的数量相同。如果您有更多垃圾对象并将它们全部添加,您最终会获得索引超出范围异常(因为它会&#34;用完&#34;要使用的虚拟对象)。
虽然这应该回答你的问题,但值得一提的是这不是典型的方法。您不必拥有固定数量的隐藏虚拟对象并在需要时显示一个虚拟对象,而是通常实例化一个新的虚拟对象(使用GameObject.Instantiate)。