gpt4 book ai didi

c# - 在没有 GameObject.Find 的情况下找到 Gameobjects 的更好方法

转载 作者:行者123 更新时间:2023-11-30 13:54:00 30 4
gpt4 key购买 nike

我正在使用 Unity 开发一款游戏,其中所有带有特定标签的 Gameobjects 都会相当规律地消失/重新出现(平均每 10 秒一次)。我使用 GameObject.FindGameObjectsWithTag() 创建一个 Gameobject[],每次需要使对象可见/不可见时,我都会通过它进行枚举。我不能在开始时调用它一次,因为在玩游戏时会创建新的 Gameobjects。我认为每次创建/销毁某些东西时访问和更改 Gameobject[] 会更糟。有没有更好的方法来处理这个问题。我知道 GameObject.Find 方法对性能的影响有多严重...

最佳答案

是的,有更好的方法来做到这一点。有一个带有可以存储游戏对象的 List 变量的脚本。使其成为单例更好但不是必需的。

这个单例脚本应该附加到一个空的游戏对象上:

public class GameObjectManager : MonoBehaviour
{
//Holds instance of GameObjectManager
public static GameObjectManager instance = null;
public List<GameObject> allObjects = new List<GameObject>();

void Awake()
{
//If this script does not exit already, use this current instance
if (instance == null)
instance = this;

//If this script already exit, DESTROY this current instance
else if (instance != this)
Destroy(gameObject);
}
}

现在,编写一个脚本,将自身注册到 GameObjectManager 脚本中的 List。它应该在 Awake 函数中注册自己,并在 OnDestroy 函数中注销自己。

此脚本必须附加到您要添加到列表中的每个预制件。只需从编辑器中执行此操作即可:

public class GameObjectAutoAdd : MonoBehaviour
{
void Awake()
{
//Add this GameObject to List when it is created
GameObjectManager.instance.allObjects.Add(gameObject);
}

void OnDestroy()
{
//Remove this GameObject from the List when it is about to be destroyed
GameObjectManager.instance.allObjects.Remove(gameObject);
}
}

如果 GameObjects 不是预制件而是通过代码创建的 GameObjects,只需在创建后将 GameObjectAutoAdd 脚本附加到它们:

GameObject obj = new GameObject("Player");
obj.AddComponent<GameObjectAutoAdd>();

您现在可以使用 GameObjectManager.instance.allObjects[n]; 访问列表中的 GameObjects,其中 n 是索引号,您不必再使用任何 Find 函数来查找 GameObject。

关于c# - 在没有 GameObject.Find 的情况下找到 Gameobjects 的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49715785/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com