启用游戏对象

时间:2015-07-07 10:37:19

标签: c# unity3d gameobject

所以我一直在尝试访问场景中的游戏对象(已禁用),以启用它们。但我收到一个错误:“对象引用没有设置为对象的实例”

private List<Character> characters = new List<Character>();
private List<GameObject> characterGameObjects = new List<GameObject> ();

public void loadSceneCharacters(){

    if (characters != null) {
        for(int i = 0; i < characters.Count; i++){
            characterGameObjects.Add(GameObject.Find(characters[i].CharacterName));
            characterGameObjects[i].SetActive(true);
        }
    }
}

4 个答案:

答案 0 :(得分:1)

您无法找到已禁用的游戏对象。 解决方案是在检查器中引用它们,或者在启用它们时首先找到它们,然后禁用那些不需要它们。

答案 1 :(得分:0)

我认为你的角色列表是空的。

如果你没有Instantiate GameObjects,你可以通过拖放来填充字符列表,这样你就可以改变这样的代码。

public List<Character> characters = new List<Character>();   ///Thanks to public 
                                              //you can see list in Unity Editor
private List<GameObject> characterGameObjects = new List<GameObject> ();

public void loadSceneCharacters(){

    if (characters != null) {
        for(int i = 0; i < characters.Count; i++){
            characterGameObjects.Add(characters[i]));  //get and add gameobject
            characterGameObjects[i].SetActive(true);
        }
    }
}

如果您已动态创建了GameObjects,则可以使用GameObject.Find("CharacterName");

填充列表

但是,我不建议找到每个带有名字的游戏对象。相反,在Instantiate状态期间,您可以将新的gameObject实例添加到角色列表中。

答案 2 :(得分:0)

即使字符列表为空,此代码也不会引发异常。

问题可能是你找不到使用find方法的禁用游戏对象(至少那是我的经验,如果我错了,请纠正我)。

我通常做的解决方法是搜索而不是搜索是通过拖放添加游戏对象。如果无法做到这一点,您可以在Awake或Start中搜索游戏对象,将它们添加到列表中并禁用它们。或者在实例化时进行某种添加......基本上,在禁用它们之前,你必须以某种方式获得对游戏对象的引用。

希望这有帮助。

答案 3 :(得分:0)

可以帮助你的是创建一个空对象,然后将所有字符放在空对象中......然后按代码执行以下操作:

foreach(Character c in MyEmptyObject.GetComponentsInChildren(Character, true))//the true in this 
//line indicates that it should search for inactive objects
{
  c.gameObject.SetActive(true);
}

这假设您的角色有一个名为“Character”的脚本