所以我一直在尝试访问场景中的游戏对象(已禁用),以启用它们。但我收到一个错误:“对象引用没有设置为对象的实例”
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);
}
}
}
答案 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”的脚本