11using System.Collections.Generic;
12using System.Reflection;
21 public static class EditorUtils {
23 private class SceneReference<T> where T :
UnityObject {
24 SerializedObject objectContainingReference;
25 SerializedProperty reference;
33 public static void ReplaceSceneReferences<T>(T a, T b) where T :
UnityObject {
34 var aId = a.GetInstanceID();
35 var refType = typeof(T);
37 var curScene = SceneManager.GetActiveScene();
38 var rootObjs = curScene.GetRootGameObjects();
39 foreach (var rootObj
in rootObjs) {
40 var transforms = rootObj.GetComponentsInChildren<Transform>();
41 foreach (var transform
in transforms) {
42 var components = transform.GetComponents<
Component>();
44 var objectChanges =
new List<Action>();
45 foreach (var component
in components) {
47 var fieldInfos = compType.GetFields(BindingFlags.Instance
48 | BindingFlags.FlattenHierarchy | BindingFlags.NonPublic
49 | BindingFlags.Public);
50 foreach (var fieldInfo
in fieldInfos.Query()
51 .Where(fi => fi.FieldType.IsAssignableFrom(refType))) {
52 var refValue = fieldInfo.GetValue(component) as T;
53 if (refValue.GetInstanceID() == aId) {
54 objectChanges.Add(() => {
55 fieldInfo.SetValue(fieldInfo, b);
60 if (objectChanges.Count > 0) {
61 Undo.RecordObject(transform.gameObject,
62 "Swap " + transform.name +
" references from " + a.name +
" to " + b.name);
63 foreach (var change
in objectChanges) {
UnityEngine.Component Component
UnityEngine.Object UnityObject