如何在 Unity 中按实例 ID 访问游戏对象



在Unity中,它提供了一个函数来获取GameObject的实例

GetInstanceID ()

虽然实例 ID 可能与游戏对象不同,但通过实例 ID 获取游戏对象的函数

InstanceIDToObject()

仅在编辑器实用程序中提供,不能在发行版中使用。

据我所知,使用HashTable也许是一种实现这一目标的方法,但是这里没有其他方法可以实现这一目标吗?

解决方案可以在 Unity 论坛上找到,为了方便起见,我将引用。

不是直接的,但您可以使用实例 ID 重命名对象,然后使用 InstanceID 执行 GameObject.Find 以这种方式访问对象。

gameObject.name = GetInstanceID().ToString();
var foo = 38375; // A made-up InstanceId...in actual code you'd get this from a real object...you can store the instance ids in an array or something
GameObject.Find(foo.ToString()).transform.position = whatever;

我还有一个哈希表,并使用实例 ID 作为哈希表的键,以便访问每个对象。您可以自己检查并分配对象一个标识符,但由于每个对象都有一个唯一的 InstanceID((,因此如果情况需要,不妨使用它。

来源: https://forum.unity3d.com/threads/can-i-use-instanceid-to-access-an-object.12817/

public static GameObject getObjectById(int id)
{
    Dictionary<int, GameObject> m_instanceMap = new Dictionary<int, GameObject>();
    //record instance map
    m_instanceMap.Clear();
    List<GameObject> gos = new List<GameObject>();
    foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)))
    {
        if (gos.Contains(go))
        {
            continue;
        }
        gos.Add(go);
        m_instanceMap[go.GetInstanceID()] = go;
    }
    if (m_instanceMap.ContainsKey(id))
    {
        return m_instanceMap[id];
    }
    else
    {
        return null;
    }
}

最新更新