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 }