在编辑器模式下,运行MonoBehaviours

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
}

猜你喜欢

转载自www.cnblogs.com/kuluodisi/p/9213956.html