zoukankan      html  css  js  c++  java
  • 4. 在Inspector面板中显示类中变量+ 拓展编辑器

    1. C#脚本如下:

    using UnityEngine;
    using System.Collections;
    
    public class MyTest : MonoBehaviour {
    
        public int ta = 0;
        public int tb = 0;
    
        [System.Serializable]
        public class TestOne
        {
            public int a=0;
            public int b=0;      
        }
        //在此处实例化之后,才会在Inspector中显示TestOne中的变量
        public TestOne tOne;   
    
    
        [System.Serializable]
        public class Equipment
        {
            public Texture2D texure;
            public string tip;
            public rectangle rec;
        }
    
        [System.Serializable]
        public class rectangle
        {
            public int x;
            public int y;
        }
        public Equipment[] m_Equipment;
     
    }
    View Code

    2. 将脚本赋给Hierarchy视图中的物体,例如我新建的一个"_Cube"

    注意点:

      ①需要用 public 设置为公用变量

      ②需要用 [System.Serializable] 进行序列化

      ③类中的变量显示时需要进行实例化

    3. 将Equipment中Size设为1,观察新增Element0等属性

    ==================================== 拓展编辑器 ===============================================

      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 对象了。当然也可以是你定义的任意对象。

      最后是本文的下载 http://vdisk.weibo.com/s/xbzrt

      欢迎大家踊跃留言,一起讨论学习。

     

    原文链接:http://www.xuanyusong.com/archives/2202

  • 相关阅读:
    图文详解AO打印(端桥模式)
    ubuntu svn下载代码出错
    zip error: Invalid command arguments
    秒杀系统设计与实现
    聊聊技术选型
    分布式事务,第三方接口一致性问题
    单系统下的分布式数据库事务方案(拓展spring的事务管理器)AgileBPM多数据的解决方案
    activiti flowable 开源工作流引擎项目整合开发实施实践总结
    java map循环的最优写法(之前写过好多种,这个听说最好记住就行)
    eclipse中maven项目交付svn忽略配置文件(转)
  • 原文地址:https://www.cnblogs.com/code1992/p/3607593.html
Copyright © 2011-2022 走看看