如何逐个启用数组元素(C#)Unity

时间:2017-01-29 16:37:43

标签: c# unity3d

此代码为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);
  }
}

任何人都可以帮忙。

以下是我的截图:

Here

1 个答案:

答案 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)。