• Unity3D研究院之在开始学习拓展编辑器


    Unity拥有非常丰富的拓展编辑器接口,如果是在网上下载过别人写的插件,你会发现为什么它的监测面板视图和普通的不一样?其实是他通过代码自己绘制的监测面板,这篇博文MOMO带大家来学习编辑器。如下图所示,这是我通过代码拓展的面板视图。

    下一条简单的脚本,绑定挂在摄像机上。

    using UnityEngine;
    using System.Collections;
     
    public class Test : MonoBehaviour
    {
        public Rect mRectValue ;
    	public Texture texture;
    }
    

    如图所示,在监测面板视图中它是一个很普通的结构。

    下面我们需要在代码中动态的编辑它。请在你的Project视图中创建一个Editor文件夹,如果有的话就不用创建。把脚本MyEditor放进Editor文件夹中。

    MyEditor.cs

    using UnityEditor;
    using UnityEngine;
     
    //自定义Tset脚本
    [CustomEditor(typeof(Test))] 
    //在编辑模式下执行脚本,这里用处不大可以删除。
    [ExecuteInEditMode]
    //请继承Editor
    public class MyEditor : Editor 
    {
    	//在这里方法中就可以绘制面板。
        public override void OnInspectorGUI() 
    	{
    		//得到Test对象
            Test test = (Test) target;
    		//绘制一个窗口
    		test.mRectValue = EditorGUILayout.RectField("窗口坐标",
    				test.mRectValue);
    		//绘制一个贴图槽
    		test.texture =  EditorGUILayout.ObjectField("增加一个贴图",test.texture,typeof(Texture),true) as Texture;
     
    	}
    }
    

    编辑器的用法非常简单,OnInspectorGUI()方法中可以绘制控件,EditorGUI和EditorGUILayout可创建编辑器控件,和GUI的用法非常相像。如图所示,在回到Test的面板中,新的面板已经映入眼帘。对于其它控件的使用,大家可以自行去API中查阅。原理都差不多。

    值得一提的是C#语言提供了一个非常赞的方法,它可以让你的数据更加的安全,并且可以在Get Set方法中监听到你获取与赋值的操作,推荐使用这种方法。简单的改一下Test.cs

    using UnityEngine;
    using System.Collections;
     
    public class Test : MonoBehaviour
    {
     
    	[HideInInspector][SerializeField] Rect pRectValue ;
        public Rect mRectValue 
    	{
            get
    		{
    			return pRectValue; 
    		}
            set 
    		{
                pRectValue = value;
            }
        }
     
    	[HideInInspector][SerializeField] Texture pTexture ;
        public Texture texture 
    	{
            get
    		{
    			return pTexture; 
    		}
            set 
    		{
                pTexture = value;
            }
        }
     
    }
    

      

    举例说明一下 [HideInInspector][SerializeField] 隐藏数据在面板,并且序列化。它可以帮我们永久保存数据,如果不加的话数值就会重置。就好比我先添加了一个贴图,一运行游戏刚刚添加的贴图就变成null了。还是以texture为例,当我们使用texture对象的时候,它会进入get板块快获取私有变量pTexture的值。当编辑器更改texture的时候,会进入set版块,将数值保存在pTexture中。这样你的数据会更加安全,因为这里操作的是当前类中的一个私有变量。也可以在get/set版块中加入一些特殊的代码。

    最后在update()或者OnGUI中就可以直接用texture 对象了。当然也可以是你定义的任意对象。

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/luxishi/p/6397301.html
Copyright © 2020-2023  润新知