예제 #1
0
        public void Delete(GameObject[] gameObjects)
        {
            if (gameObjects == null || gameObjects.Length == 0)
            {
                return;
            }

            if (!Undo.Enabled)
            {
                for (int i = 0; i < gameObjects.Length; ++i)
                {
                    GameObject go = gameObjects[i];
                    if (go != null)
                    {
                        ExposeToEditor exposed = go.GetComponent <ExposeToEditor>();

                        if (exposed == null || exposed.CanDelete)
                        {
                            Destroy(go);
                        }
                    }
                }

                if (ObjectsDeleted != null)
                {
                    ObjectsDeleted(gameObjects);
                }

                return;
            }

            ExposeToEditor[] exposeToEditor = gameObjects.Select(o => o.GetComponent <ExposeToEditor>()).Where(exposed => exposed != null && exposed.CanDelete).OrderByDescending(o => o.transform.GetSiblingIndex()).ToArray();
            if (exposeToEditor.Length == 0)
            {
                return;
            }

            HashSet <GameObject> removeObjectsHs = new HashSet <GameObject>(exposeToEditor.Select(exposed => exposed.gameObject));
            bool isRecording = Undo.IsRecording;

            if (!isRecording)
            {
                Undo.BeginRecord();
            }

            if (Selection.objects != null)
            {
                List <UnityEngine.Object> selection = Selection.objects.ToList();
                for (int i = selection.Count - 1; i >= 0; --i)
                {
                    if (removeObjectsHs.Contains(selection[i]))
                    {
                        selection.RemoveAt(i);
                    }
                }

                Selection.objects = selection.ToArray();
            }

            Undo.DestroyObjects(exposeToEditor);

            if (!isRecording)
            {
                Undo.EndRecord();
            }

            if (ObjectsDeleted != null)
            {
                ObjectsDeleted(gameObjects);
            }
        }
예제 #2
0
        private void TryToAddColliders(ExposeToEditor obj)
        {
            if (obj == null)
            {
                return;
            }

            if (obj.Colliders == null || obj.Colliders.Length == 0)
            {
                List <Collider> colliders = new List <Collider>();
                Rigidbody       rigidBody = obj.BoundsObject.GetComponentInParent <Rigidbody>();

                bool isRigidBody = rigidBody != null;
                if (obj.EffectiveBoundsType == BoundsType.Any)
                {
                    if (obj.MeshFilter != null)
                    {
                        if (obj.AddColliders && !isRigidBody)
                        {
                            MeshCollider collider = obj.BoundsObject.AddComponent <MeshCollider>();
                            collider.convex     = isRigidBody;
                            collider.sharedMesh = obj.MeshFilter.sharedMesh;
                            colliders.Add(collider);
                        }
                    }
                    else if (obj.SkinnedMeshRenderer != null)
                    {
                        if (obj.AddColliders && !isRigidBody)
                        {
                            MeshCollider collider = obj.BoundsObject.AddComponent <MeshCollider>();
                            collider.convex     = isRigidBody;
                            collider.sharedMesh = obj.SkinnedMeshRenderer.sharedMesh;
                            colliders.Add(collider);
                        }
                    }
                    else if (obj.SpriteRenderer != null)
                    {
                        if (obj.AddColliders && !isRigidBody)
                        {
                            BoxCollider collider = obj.BoundsObject.AddComponent <BoxCollider>();
                            collider.size = obj.SpriteRenderer.sprite.bounds.size;
                            colliders.Add(collider);
                        }
                    }
                }
                else if (obj.EffectiveBoundsType == BoundsType.Mesh)
                {
                    if (obj.MeshFilter != null)
                    {
                        if (obj.AddColliders && !isRigidBody)
                        {
                            MeshCollider collider = obj.BoundsObject.AddComponent <MeshCollider>();
                            collider.convex     = isRigidBody;
                            collider.sharedMesh = obj.MeshFilter.sharedMesh;
                            colliders.Add(collider);
                        }
                    }
                }
                else if (obj.EffectiveBoundsType == BoundsType.SkinnedMesh)
                {
                    if (obj.SkinnedMeshRenderer != null)
                    {
                        if (obj.AddColliders && !isRigidBody)
                        {
                            MeshCollider collider = obj.BoundsObject.AddComponent <MeshCollider>();
                            collider.convex     = isRigidBody;
                            collider.sharedMesh = obj.SkinnedMeshRenderer.sharedMesh;
                            colliders.Add(collider);
                        }
                    }
                }
                else if (obj.EffectiveBoundsType == BoundsType.Sprite)
                {
                    if (obj.SpriteRenderer != null)
                    {
                        if (obj.AddColliders && !isRigidBody)
                        {
                            BoxCollider collider = obj.BoundsObject.AddComponent <BoxCollider>();
                            collider.size = obj.SpriteRenderer.sprite.bounds.size;
                            colliders.Add(collider);
                        }
                    }
                }
                else if (obj.EffectiveBoundsType == BoundsType.Custom)
                {
                    if (obj.AddColliders && !isRigidBody)
                    {
                        Mesh box = RuntimeGraphics.CreateCubeMesh(Color.black, obj.CustomBounds.center, 1, obj.CustomBounds.extents.x * 2, obj.CustomBounds.extents.y * 2, obj.CustomBounds.extents.z * 2);

                        MeshCollider collider = obj.BoundsObject.AddComponent <MeshCollider>();
                        collider.convex = isRigidBody;

                        collider.sharedMesh = box;
                        colliders.Add(collider);
                    }
                }

                obj.Colliders = colliders.ToArray();
            }
        }
예제 #3
0
        private void OnMarkAsDestroyedChanging(ExposeToEditor obj)
        {
            if (m_editor.IsPlaying)
            {
                if (obj.HasChildren(true))
                {
                    ExposeToEditor[] children = obj.GetComponentsInChildren <ExposeToEditor>(true);
                    if (obj.MarkAsDestroyed)
                    {
                        for (int i = 0; i < children.Length; ++i)
                        {
                            ExposeToEditor child = children[i];
                            m_playModeCache.Remove(child);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < children.Length; ++i)
                        {
                            ExposeToEditor child = children[i];
                            m_playModeCache.Add(child);
                        }
                    }
                }
                else
                {
                    if (obj.MarkAsDestroyed)
                    {
                        m_playModeCache.Remove(obj);
                    }
                    else
                    {
                        m_playModeCache.Add(obj);
                    }
                }
            }
            else
            {
                if (obj.HasChildren(true))
                {
                    ExposeToEditor[] children = obj.GetComponentsInChildren <ExposeToEditor>(true);
                    if (obj.MarkAsDestroyed)
                    {
                        for (int i = 0; i < children.Length; ++i)
                        {
                            ExposeToEditor child = children[i];
                            m_editModeCache.Remove(child);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < children.Length; ++i)
                        {
                            ExposeToEditor child = children[i];
                            m_editModeCache.Add(child);
                        }
                    }
                }
                else
                {
                    if (obj.MarkAsDestroyed)
                    {
                        m_editModeCache.Remove(obj);
                    }
                    else
                    {
                        m_editModeCache.Add(obj);
                    }
                }
            }

            if (MarkAsDestroyedChanging != null)
            {
                MarkAsDestroyedChanging(obj);
            }
        }
예제 #4
0
 private static bool IsExposedToEditor(ExposeToEditor exposeToEditor)
 {
     return(exposeToEditor != null &&
            !exposeToEditor.MarkAsDestroyed &&
            (exposeToEditor.hideFlags & HideFlags.HideInHierarchy) == 0);
 }
예제 #5
0
        private void OnPlaymodeStateChanging()
        {
            if (m_editor.IsPlaying)
            {
                m_playModeCache   = new HashSet <ExposeToEditor>();
                m_enabledObjects  = m_editModeCache.Where(eo => eo != null && eo.gameObject.activeSelf && !eo.MarkAsDestroyed).ToArray();
                m_selectedObjects = m_editor.Selection.objects;

                HashSet <GameObject> selectionHS       = new HashSet <GameObject>(m_editor.Selection.gameObjects != null ? m_editor.Selection.gameObjects : new GameObject[0]);
                List <GameObject>    playmodeSelection = new List <GameObject>();

                GameObject fakeRoot = new GameObject("FakeRoot");
                fakeRoot.SetActive(false);
                foreach (ExposeToEditor editorObj in m_editModeCache.OrderBy(eo => eo.transform.GetSiblingIndex()))
                {
                    if (editorObj.GetParent() != null)
                    {
                        continue;
                    }

                    editorObj.gameObject.SetActive(false);
                    editorObj.transform.SetParent(fakeRoot.transform);
                }

                GameObject fakeRootPlayMode = Instantiate(fakeRoot);
                for (int i = 0; i < fakeRootPlayMode.transform.childCount; ++i)
                {
                    ExposeToEditor playModeObj = fakeRootPlayMode.transform.GetChild(i).GetComponent <ExposeToEditor>();
                    ExposeToEditor editorObj   = fakeRoot.transform.GetChild(i).GetComponent <ExposeToEditor>();

                    playModeObj.SetName(editorObj.name);
                    playModeObj.Init();
                    m_playModeCache.Add(playModeObj);

                    ExposeToEditor[] editorObjAndChildren   = editorObj.GetComponentsInChildren <ExposeToEditor>(true);
                    ExposeToEditor[] playModeObjAndChildren = playModeObj.GetComponentsInChildren <ExposeToEditor>(true);
                    for (int j = 0; j < editorObjAndChildren.Length; j++)
                    {
                        if (selectionHS.Contains(editorObjAndChildren[j].gameObject))
                        {
                            playmodeSelection.Add(playModeObjAndChildren[j].gameObject);
                        }
                    }
                }


                fakeRoot.transform.DetachChildren();
                fakeRootPlayMode.transform.DetachChildren();
                Destroy(fakeRoot);
                Destroy(fakeRootPlayMode);

                foreach (ExposeToEditor playModeObj in m_playModeCache.ToArray())
                {
                    playModeObj.gameObject.SetActive(true);
                }

                bool isEnabled = m_editor.Undo.Enabled;
                m_editor.Undo.Enabled      = false;
                m_editor.Selection.objects = playmodeSelection.ToArray();
                m_editor.Undo.Enabled      = isEnabled;
                m_editor.Undo.Store();
            }
            else
            {
                foreach (ExposeToEditor playObj in m_playModeCache)
                {
                    if (playObj != null)
                    {
                        playObj.SendMessage("OnRuntimeDestroy", SendMessageOptions.DontRequireReceiver);
                        DestroyImmediate(playObj.gameObject);
                    }
                }

                for (int i = 0; i < m_enabledObjects.Length; ++i)
                {
                    ExposeToEditor editorObj = m_enabledObjects[i];
                    if (editorObj != null)
                    {
                        editorObj.gameObject.SetActive(true);
                    }
                }

                bool isEnabled = m_editor.Undo.Enabled;
                m_editor.Undo.Enabled      = false;
                m_editor.Selection.objects = m_selectedObjects;
                m_editor.Undo.Enabled      = isEnabled;
                m_editor.Undo.Restore();

                m_playModeCache   = null;
                m_enabledObjects  = null;
                m_selectedObjects = null;
            }
        }
        public void Duplicate(GameObject[] gameObjects)
        {
            if (gameObjects == null || gameObjects.Length == 0)
            {
                return;
            }

            if (!Undo.Enabled)
            {
                for (int i = 0; i < gameObjects.Length; ++i)
                {
                    GameObject go = gameObjects[i];
                    if (go != null)
                    {
                        ExposeToEditor exposed = go.GetComponent <ExposeToEditor>();
                        if (exposed == null || exposed.CanDuplicate)
                        {
                            Instantiate(go, go.transform.position, go.transform.rotation);
                        }
                    }
                }

                if (ObjectsDuplicated != null)
                {
                    ObjectsDuplicated(gameObjects);
                }

                return;
            }

            List <GameObject> duplicates = new List <GameObject>();

            for (int i = 0; i < gameObjects.Length; ++i)
            {
                GameObject go = gameObjects[i];
                if (go == null)
                {
                    continue;
                }

                ExposeToEditor exposed = go.GetComponent <ExposeToEditor>();
                if (exposed != null && !exposed.CanDuplicate)
                {
                    continue;
                }

                GameObject duplicate = Instantiate(go, go.transform.position, go.transform.rotation);
                duplicate.SetActive(true);
                duplicate.SetActive(go.activeSelf);
                if (go.transform.parent != null)
                {
                    duplicate.transform.SetParent(go.transform.parent, true);
                }

                duplicates.Add(duplicate);
            }

            if (duplicates.Count > 0)
            {
                ExposeToEditor[] exposeToEditor = duplicates.Select(o => o.GetComponent <ExposeToEditor>()).OrderByDescending(o => o.transform.GetSiblingIndex()).ToArray();
                Undo.BeginRecord();
                Undo.RegisterCreatedObjects(exposeToEditor);
                Selection.objects = duplicates.ToArray();
                Undo.EndRecord();
            }

            if (ObjectsDuplicated != null)
            {
                ObjectsDuplicated(gameObjects);
            }
        }
 private static bool IsExposedToEditor(ExposeToEditor exposeToEditor)
 {
     return(exposeToEditor != null &&
            !exposeToEditor.MarkAsDestroyed &&
            exposeToEditor.hideFlags != HideFlags.HideAndDontSave);
 }
예제 #8
0
 private void OnBeforeTransformParentChanged()
 {
     m_oldParent = GetParent();
 }