如何通过Unity中的实例ID访问GameObject

时间:2017-05-17 06:28:21

标签: unity3d unity5 unityscript

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

GetInstanceID ()

虽然实例id可能与GameObjects不同,但是通过实例id获取GameObject的函数

InstanceIDToObject()

仅在EditorUtility中提供,不能在发布中使用。

据我所知,使用 HashTable 可能是达到这个目标的方法,但是这里有其他方法可以实现吗?

2 个答案:

答案 0 :(得分:3)

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

不直接,但您可以使用InstanceID重命名对象,然后使用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/

答案 1 :(得分:1)

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;
    }
}