private static void CopyRecursive(GameObject src, GameObject dst, ObjCopy.IsAssignable assignable, bool addIfMissing) { CopyComponentValues(src, dst, assignable, addIfMissing); Dictionary <string, Transform> dstMap = new Dictionary <string, Transform>(); foreach (Transform d in dst.transform) { dstMap[d.name] = d; } foreach (Transform s in src.transform) { Transform d = null; if (dstMap.TryGetValue(s.name, out d)) { CopyRecursive(s.gameObject, d.gameObject, assignable, addIfMissing); } else { Debug.LogWarning(string.Format("No GameObject '{0}'", s.name)); } } }
private static void CopyComponentValues(GameObject src, GameObject dst, ObjCopy.IsAssignable assignable, bool addIfMissing) { if (src.name != dst.name) { Debug.LogWarning(string.Format("Name is different. {0} <-> {1}", src.name, dst.name)); } ObjCopy copy = new ObjCopy(true, assignable); copy.ExcludeType("UnityEngine.Component", "UnityEngine.Object"); copy.ExcludeField("UnityEngine.Transform", "hasChanged"); foreach (Component s in src.GetComponents <Component>()) { Component d = dst.GetComponent(s.GetType()); if (addIfMissing && d == null) { d = dst.AddComponent(s.GetType()); } if (d != null) { List <MemberInfo> changed = copy.SetValue(s, d); EditorUtil.SetDirty(d); StringBuilder str = new StringBuilder(); foreach (MemberInfo m in changed) { str.Append(dst.name).Append(".").Append(m.Name).Append("\n"); } if (str.Length > 0) { Debug.LogWarning(str.ToString()); } } else { Debug.LogWarning(string.Format("Source has {0} but Missing in Dest", s.GetType().FullName)); } } EditorUtil.SetDirty(dst); }