【发布时间】:2012-07-07 19:19:46
【问题描述】:
在这个问题中,我想知道这是否以及如何实现。这种技术似乎是非常糟糕的做法,但我正在使用的 API(UnityEditor)似乎正在做这样的事情,我只是好奇。
如果对同一个对象有多个引用,是否可以在同一个内存槽中实例化一个新对象,使之前的所有引用都指向新对象?
我发现唯一可行的方法是使用非托管 C++。基本上发生了以下情况:
// Original prefab
GameObject prefab = x;
prefab.tag = "Untagged";
// A copy of the original prefab
GameObject prefabCopy = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
prefabCopy.tag = "EditorOnly"; // Change from initial value "Untagged"
Debug.Log(prefab.tag); // "Untagged" - expected
Debug.Log(prefabCopy.tag); // "EditorOnly" - expected
// Replace contents of prefab file with `prefabCopy`
PrefabUtility.ReplacePrefab(prefabCopy, prefab);
// Destroy the copy
DestroyImmediate(prefabCopy);
Debug.Log(prefab.tag); // "EditorOnly" - whoa?
prefab 现在如何指向不同的对象?
注意:请记住,Unity 是在 Mono 风格的 .NET 之上构建的
【问题讨论】:
-
PrefabUtility.ReplacePrefab(prefabCopy, prefab);内部发生了什么? -
@dtryon
PrefabUtility.ReplacePrefab调用内部方法(根据程序集浏览器)。
标签: c# memory pointers reference unity3d