Ersetzen-Objekt-Instanz durch eine andere in C#

In dieser Frage möchte ich herausfinden, ob und wie das möglich ist. Diese Technik scheint sehr schlechte Praxis, aber es scheint, dass die API (UnityEditor), die ich verwende, ist etwas wie das zu tun und ich bin einfach nur neugierig.

Wenn es mehrere Referenzen auf das gleiche Objekt, ist es möglich zu instanziieren eines neuen Objektes in der gleichen Speicher-slot, so dass alle bisherigen Verweise zeigen auf das neue Objekt?

Ich herausgefunden, dass die einzige praktikable Möglichkeit, dies zu tun ist durch die Verwendung von nicht verwaltetem C++. Im wesentlichen ist Folgendes passiert:

//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?

Einige, wie prefab zeigt jetzt auf ein anderes Objekt?

Hinweis: Bedenken Sie, dass die Einheit gebaut ist, auf der Oberseite des Mono-Geschmack .NET

Was passiert im PrefabUtility.ReplacePrefab(prefabCopy, prefab);?
PrefabUtility.ReplacePrefab ruft eine interne Methode (nach der assembly-browser).

InformationsquelleAutor Lea Hayes | 2012-07-07

Schreibe einen Kommentar