Tanoda
EditorUtils.cs
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (C) Ultraleap, Inc. 2011-2020. *
3 * *
4 * Use subject to the terms of the Apache License 2.0 available at *
5 * http://www.apache.org/licenses/LICENSE-2.0, or another agreement *
6 * between Ultraleap and you, your company or other organization. *
7 ******************************************************************************/
8
9using Leap.Unity.Query;
10using System;
11using System.Collections.Generic;
12using System.Reflection;
13using UnityEditor;
14using UnityEngine;
15using UnityEngine.SceneManagement;
16
17namespace Leap.Unity {
18
19 using UnityObject = UnityEngine.Object;
20
21 public static class EditorUtils {
22
23 private class SceneReference<T> where T : UnityObject {
24 SerializedObject objectContainingReference;
25 SerializedProperty reference;
26 }
27
33 public static void ReplaceSceneReferences<T>(T a, T b) where T : UnityObject {
34 var aId = a.GetInstanceID();
35 var refType = typeof(T);
36
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>();
43
44 var objectChanges = new List<Action>();
45 foreach (var component in components) {
46 var compType = typeof(Component);
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);
56 });
57 }
58 }
59 }
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) {
64 change();
65 }
66 }
67 }
68 }
69 }
70
71 }
72
73}
UnityEngine.Component Component
UnityEngine.Object UnityObject
Definition: EditorUtils.cs:19