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); } }
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(); } }
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); } }
private static bool IsExposedToEditor(ExposeToEditor exposeToEditor) { return(exposeToEditor != null && !exposeToEditor.MarkAsDestroyed && (exposeToEditor.hideFlags & HideFlags.HideInHierarchy) == 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); }
private void OnBeforeTransformParentChanged() { m_oldParent = GetParent(); }