Example #1
0
        public static bool IsMergeSwitchers()
        {
            var sel = Selection.gameObjects;
            var doesAllSelectionHaveSwitcher = sel.FindAll(s => s.GetComponent <Switcher>()).Count == sel.Length;

            return(sel.Length > 1 && doesAllSelectionHaveSwitcher && GameObjectDiff.IsChildrenMatches(sel.ConvertAll(o => o.transform)));
        }
Example #2
0
        public static string CreateSwitcher(List <GameObject> roots)
        {
            var duplicates = GameObjectDiff.GetDuplicateSiblingNames(roots);

            if (duplicates.Count > 0)
            {
                return("Duplicate sibling names: " + duplicates.Join(","));
            }
            else
            {
                if (!GameObjectDiff.IsChildrenMatches(roots.ConvertAll(o => o.transform)))
                {
                    var parents = roots.ConvertAll(o => o.transform);
                    GameObjectDiff.CreateMissingChildren(parents);
                }
                var err = GameObjectDiff.GetComponentMismatch(roots.ConvertAll(o => o.transform));
                if (err.Count == 0)
                {
                    Undo.RecordObjects(roots.ToArray(), "Diff");
                    ExtractDiff(roots);
                    return(null);
                }
                else
                {
                    return("Component Mismatch\n" + err.Join(","));
                }
            }
        }
Example #3
0
        private static void ExtractDiff(List <GameObject> roots)
        {
            // just set data for the first object
            var root0  = roots[0];
            var diffs  = GameObjectDiff.CreateDiff(roots.ToArray());
            var tDiffs = GameObjectDiff.FindAll <TransformData>(diffs);

            // remove TransformData from diffs
            for (int i = 0; i < diffs.Length; ++i)
            {
                diffs[i] = diffs[i].FindAll(d => !(d.GetType() == typeof(TransformData)));
            }

            var switcher = root0.GetComponent <Switcher>();

            if (switcher != null)
            {
                switcher.Clear();
            }
            else
            {
                switcher = root0.AddComponent <Switcher>();
                Undo.RegisterCreatedObjectUndo(switcher, root0.name);
            }
            // Get Visibility Diffs
            var vDiffs = new List <List <TransformData> >();

            for (int i = 0; i < tDiffs.Length; ++i)
            {
                vDiffs.Add(new List <TransformData>());
            }
            for (int c = 0; c < tDiffs[0].Count; ++c)
            {
                bool diff = false;
                for (int i = 1; i < tDiffs.Length && !diff; ++i)
                {
                    diff |= tDiffs[0][c].active != tDiffs[i][c].active;
                }
                if (diff)
                {
                    for (int i = 0; i < tDiffs.Length; ++i)
                    {
                        vDiffs[i].Add(tDiffs[i][c]);
                    }
                }
            }
            switcher.objs = vDiffs[0].ConvertAll(v => v.target.gameObject);

            // Get Position Diffs
            var posDiffs = new List <List <TransformData> >();

            for (int i = 0; i < tDiffs.Length; ++i)
            {
                posDiffs.Add(new List <TransformData>());
            }
            for (int c = 0; c < tDiffs[0].Count; ++c)
            {
                if (!tDiffs[0][c].isRoot)
                {
                    bool diff = false;
                    for (int i = 1; i < tDiffs.Length && !diff; ++i)
                    {
                        diff |= !tDiffs[0][c].TransformEquals(tDiffs[i][c]);
                    }
                    if (diff)
                    {
                        for (int i = 0; i < tDiffs.Length; ++i)
                        {
                            posDiffs[i].Add(tDiffs[i][c]);
                        }
                    }
                }
            }

            for (int i = 0; i < roots.Count; ++i)
            {
                var s = new SwitchSet();
                s.name = roots[i].name;
#if UNITY_2019_1_OR_NEWER
                s.data = diffs[i];
#endif
                s.trans      = posDiffs[i].ConvertAll(t => t.trans);
                s.pos        = posDiffs[i].ConvertAll(t => t.pos);
                s.visibility = vDiffs[i].ConvertAll(t => t.enabled);
                switcher.switches.Add(s);
            }
            EditorUtility.SetDirty(switcher);
            //diffList.serializedProperty.ClearArray();
        }