在编辑器模式下,运行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
}

 

转载于:https://www.cnblogs.com/kuluodisi/p/9213956.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值