using System; using System.Collections.Generic; using UnityEngine; using UnityEditor; using qtools.qhierarchy.pcomponent.pbase; using qtools.qhierarchy.pdata; using qtools.qhierarchy.phierarchy; namespace qtools.qhierarchy.pcomponent { public class QStaticComponent: QBaseComponent { // PRIVATE private Texture2D staticButtonOn; private Texture2D staticButtonOff; private Texture2D staticButtonHalf; private StaticEditorFlags staticFlags; private GameObject[] gameObjects; // CONSTRUCTOR public QStaticComponent() { staticButtonOn = QResources.getInstance().getTexture(QTexture.QStaticOnButton); staticButtonHalf = QResources.getInstance().getTexture(QTexture.QStaticHalfButton); staticButtonOff = QResources.getInstance().getTexture(QTexture.QStaticOffButton); QSettings.getInstance().addEventListener(QSetting.ShowStaticComponent, settingsChanged); QSettings.getInstance().addEventListener(QSetting.ShowStaticComponentDuringPlayMode, settingsChanged); settingsChanged(); } // PRIVATE private void settingsChanged() { enabled = QSettings.getInstance().get(QSetting.ShowStaticComponent); showComponentDuringPlayMode = QSettings.getInstance().get(QSetting.ShowStaticComponentDuringPlayMode); } // DRAW public override void layout(GameObject gameObject, QObjectList objectList, ref Rect rect) { rect.x -= 14; rect.width = 14; staticFlags = GameObjectUtility.GetStaticEditorFlags(gameObject); } public override void draw(GameObject gameObject, QObjectList objectList, Rect selectionRect, Rect curRect) { bool isStatic = gameObject.isStatic; GUI.DrawTexture(curRect, isStatic ? ((int)staticFlags == -1 ? staticButtonOn : staticButtonHalf) : staticButtonOff); } public override void eventHandler(GameObject gameObject, QObjectList objectList, Event currentEvent, Rect curRect) { if (currentEvent.isMouse && currentEvent.type == EventType.MouseDown && currentEvent.button == 0 && curRect.Contains(currentEvent.mousePosition)) { currentEvent.Use(); int intStaticFlags = (int)staticFlags; gameObjects = Selection.Contains(gameObject) ? Selection.gameObjects : new GameObject[] { gameObject }; GenericMenu menu = new GenericMenu(); menu.AddItem(new GUIContent("Nothing" ), intStaticFlags == 0, staticChangeHandler, 0); menu.AddItem(new GUIContent("Everything" ), intStaticFlags == -1, staticChangeHandler, -1); menu.AddItem(new GUIContent("Lightmap Static" ), (intStaticFlags & (int)StaticEditorFlags.LightmapStatic) > 0, staticChangeHandler, (int)StaticEditorFlags.LightmapStatic); menu.AddItem(new GUIContent("Occluder Static" ), (intStaticFlags & (int)StaticEditorFlags.OccluderStatic) > 0, staticChangeHandler, (int)StaticEditorFlags.OccluderStatic); menu.AddItem(new GUIContent("Batching Static" ), (intStaticFlags & (int)StaticEditorFlags.BatchingStatic) > 0, staticChangeHandler, (int)StaticEditorFlags.BatchingStatic); menu.AddItem(new GUIContent("Navigation Static" ), (intStaticFlags & (int)StaticEditorFlags.NavigationStatic) > 0, staticChangeHandler, (int)StaticEditorFlags.NavigationStatic); menu.AddItem(new GUIContent("Occludee Static" ), (intStaticFlags & (int)StaticEditorFlags.OccludeeStatic) > 0, staticChangeHandler, (int)StaticEditorFlags.OccludeeStatic); menu.AddItem(new GUIContent("Off Mesh Link Generation" ), (intStaticFlags & (int)StaticEditorFlags.OffMeshLinkGeneration) > 0, staticChangeHandler, (int)StaticEditorFlags.OffMeshLinkGeneration); #if UNITY_5 menu.AddItem(new GUIContent("Reflection Probe Static" ), (intStaticFlags & (int)StaticEditorFlags.ReflectionProbeStatic) > 0, staticChangeHandler, (int)StaticEditorFlags.ReflectionProbeStatic); #endif menu.ShowAsContext(); } } // PRIVATE private void staticChangeHandler(object result) { StaticEditorFlags resultStaticFlags = (StaticEditorFlags)result; for (int i = gameObjects.Length - 1; i >= 0; i--) { GameObject gameObject = gameObjects[i]; Undo.RecordObject(gameObject, "Change Static Flags"); GameObjectUtility.SetStaticEditorFlags(gameObject, resultStaticFlags); EditorUtility.SetDirty(gameObject); } } } }