UnityEngine中的Attribute中有很多有用的屬性,比如這個ExecuteInEditMode就能讓MonoBehaviour在編輯器模式下運行。
ExecuteInEditMode
使編輯模式下的腳本的所有實例都可以執行。
默認情況下,MonoBehaviours僅在播放模式下執行。通過添加此屬性,MonoBehaviour的任何實例都將在編輯器未處於播放模式時執行其回調函數。
需要注意的是,函數的調用時機跟運行模式下有所不同
The functions are not called constantly like they are in play mode.
- Update is only called when something in the scene changed.
- OnGUI is called when the Game View recieves an Event.
- OnRenderObject and the other rendering callback functions are called on every repaint of the Scene View or Game View.
---------------------------------------分割線-------------------------------------------------
使用此屬性,讓我們很方便的使我們在編輯器狀態下,使用MonoBehaviour。
比如像下邊一樣,下邊並沒有貼出所有代碼,但是這個類的目的是為了在編輯器中繪制出一個地圖的樣子。
大概是這個樣子
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif using System.Collections; using System.Collections.Generic; using ClashGame; [ExecuteInEditMode] public class SceneEdit : MonoBehaviour { static int m_iColumns = 48;//GDefine.SceneWidth; static int m_iRows = 48;//GDefine.SceneHeight; static int xDirection = m_iColumns; static int yDirection = m_iRows; public int m_iUnitLength = 1; private int[,] m_CellArray = new int[xDirection, yDirection]; private int m_iCount = 0; private int m_iType = 7; public Color m_LineColor = Color.green; public bool m_bEditorMode = true; public bool m_bLine = false; private static bool bMouseClick = false; private static UnityEngine.GameObject tempObj = null; private static BuildingManager bdm = null; private MapEdit mapEdit = null; // Use this for initialization void Start() { #if UNITY_EDITOR init(); #else gameObject.SetActive(false); #endif } #if UNITY_EDITOR void OnDestroy() { //m_CellManager = null; } void init() { if (Application.isPlaying) { gameObject.SetActive(false); return; } mapEdit = gameObject.GetComponent<MapEdit>(); if (mapEdit == null) mapEdit = gameObject.AddComponent<MapEdit>(); m_CellArray = mapEdit.GetArray(); } #endif // Update is called once per frame void Update() { } #if UNITY_EDITOR void OnDrawGizmos() { if (Application.isPlaying) { return; } init(); //Debug.EnableLog = true; if (!m_bLine) { for (int i = 0; i < xDirection; i++) { for (int j = 0; j < yDirection; j++) { switch (m_CellArray[i, j]) { case 0: Gizmos.color = Color.white; break; case 1: Gizmos.color = Color.red; break; case 2: Gizmos.color = Color.blue; break; case 3: Gizmos.color = Color.gray; break; case 4: Gizmos.color = Color.yellow; break; case 5: Gizmos.color = Color.magenta; break; case 6: Gizmos.color = Color.green; break; } Gizmos.DrawCube(new Vector3((i + 0.5f) * m_iUnitLength, 0, (j + 0.5f) * m_iUnitLength), new Vector3(m_iUnitLength, 0.01f, m_iUnitLength)); } } } else { Gizmos.color = m_LineColor; for (int i = 0; i <= xDirection; i++) { Gizmos.DrawLine(new Vector3(i * m_iUnitLength, 0, 0), new Vector3(i * m_iUnitLength, 0, yDirection * m_iUnitLength)); } for (int i = 0; i <= yDirection; i++) { Gizmos.DrawLine(new Vector3(0, 0, i * m_iUnitLength), new Vector3(xDirection * m_iUnitLength, 0, i * m_iUnitLength)); } } OnInput(); } void OnInput() { if (!m_bEditorMode) return; if (Event.current.button == 0 && Event.current.isMouse) { // Debug.Log(Event.current.ToString()); if (!bMouseClick && Event.current.type == EventType.MouseUp) { bMouseClick = true; //OnLeftClick(); } } else if (Event.current.button == 1) { if (!bMouseClick) { bMouseClick = true; //OnRightClick(); } } else { bMouseClick = false; } } void RemoveObj(Vector2 cellindex) { tempObj = null; } public void SaveBuilding() { //EditorApplication.SaveScene(); List<BuildingData> bdList = new List<BuildingData>(); Transform building = GameObject.Find("Eve/Building").transform; if(building == null) { Debug.LogError("buliding is null"); return; } foreach(Transform child in building) { BuildingData bd = new BuildingData(); bd.Camp = (eCampType)int.Parse(child.name.Substring(child.name.Length - 1,1)); bd.PosX = child.position.x; bd.PosY = child.position.y; bd.PosZ = child.position.z; bd.RotY = child.position.y; bd.DBobjID = child.GetComponent<BuildingObj>().m_ObjDBID; bdList.Add(bd); } if(bdm == null) bdm = new BuildingManager(); bdm.SaveFile(bdList); } public void LoadBuilding() { if (bdm == null) bdm = new BuildingManager(); bdm.LoadFile(); } #endif }