4. 在Inspector面板中显示类中变量+ 拓展编辑器
1. C#脚本如下:
using UnityEngine;
using System.Collections; public class MyTest : MonoBehaviour { public int ta = ;
public int tb = ; [System.Serializable]
public class TestOne
{
public int a=;
public int b=;
}
//在此处实例化之后,才会在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; }
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
4. 在Inspector面板中显示类中变量+ 拓展编辑器的更多相关文章
- 后盾网lavarel视频项目---2、phpstorm显示类中的方法快捷键
后盾网lavarel视频项目---2.phpstorm显示类中的方法快捷键 一.总结 一句话总结: ctrl + f12 1.npm安装js插件? npm install hdjs 2.phpstor ...
- c++中在一个类中定义另一个只有带参数构造函数的类的对象
c++中在一个类中定义另一个只有带参数构造函数的类的对象,编译通不过 #include<iostream> using namespace std; class A { public: ...
- Java中主类中定义方法加static和不加static的区别
Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用(类名.方法),后者必须先实例化后用实例调用) 知识点:1.Getter and Setter 的应用 ...
- python---Django中模型类中Meta元对象了解
Django中模型类中Meta元对象了解 1.使用python manage.py shell 进入编辑命令行模式,可以直接进入项目(为我们配置好了环境) python manage.py shell ...
- C++中若类中没有默认构造函数,如何使用对象数组
前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: #include <memory> #include <iostream> ...
- IntelliJ IDEA 环境设置——侧栏显示类中所有方法
myeclipse默认会在右侧栏显示类的所有方法框,但是IDEA里并没有这样的初始化设置 那么怎样显示这个功能? 1.点击工具栏View-->Tool Windows-->Structur ...
- 转载:java 中对类中的属性使用set/get方法的意义和用法
经常看到有朋友提到类似:对类中的属性使用set/get方法的作用?理论的回答当然是封闭性之类的,但是这样对我们有什么作用呢?为什么要这样设计?我直接使用属性名来访问不是更直接,代码更简洁明了吗?下面我 ...
- 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)
java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...
- python中的类中属性元素加self.和不加self.的区别
在类中,self只能在函数中使用,表示的是实例属性,就是每个实例可以设置不值,而不相互影响.如果在类级别使用没有self的属性,是类属性,一般作为全局变量来用的.事实上:就是一个是类属性 一个是对象属 ...
随机推荐
- RabbitMQ 原文译1.2--"Hello Word"
本系列文章均来自官网原文,属于个人翻译,如有雷同,权当个人归档,忽喷. .NET/C# RabbitMQ 客户端下载地址:https://github.com/rabbitmq/rabbitmq-do ...
- Sqlserver基于流程控制
流程控制语句只能在单个批处理段,用户自定义函数和存储过程中使用不能夸多个批处理或者用户自定义函数或者存储过程 批处理:一个或者多个语句组成的一个批处理,是因为所有语句一次性地被提交到一个sql实例,如 ...
- ios code style
注释 建议使用VVDocumenter插件 多行注释 格式: /** 注释内容 */ 单行注释 格式: ///在对文件.类.函数进行注释时推荐使用多行注释,在函数体内对代码块进行注释时,使用单行注释 ...
- 第五篇、常用的SQL语句和函数介绍
简介: 在使用到sqlite3的时候,常常需要写一些SQL语句,现将常用到的部分语句稍微总结以下,由于个人习惯,关键字用大写. 附: /*简单约束*/ CREATE TABLE IF NOT EXIS ...
- WPF的TextBox的焦点获取与失去焦点的死循环解决方案
在WPF中实现一个弹出层自动获取焦点,弹出层实现是通过其UserControl的依赖属性Visibility的绑定实现的,让UserControl上的TextBox获取焦点,初始实现代码如下: pub ...
- HDU 1058 Humble Number
Humble Number Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humbl ...
- C++里的int 和string类型相互转换
C++不像Java和C#一样在进行数据类型转换时直接调用一些类方法就可以了,使用起来很简单. 一个很简单的例子就是string str=“D:\\”+1+“.txt”;这在Java或者C#里面是可以自 ...
- 清橙OJ 1082 查找第K小元素 -- 快速排序
题目地址:http://oj.tsinsen.com/A1082 问题描述 给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素. 这是一个补充程序的试题,你需要完成一个函数: int fi ...
- OpenJudge 2792 集合加法
1.链接地址: http://bailian.openjudge.cn/practice/2792 2.题目: 总Time Limit: 3000ms Memory Limit: 65536kB De ...
- Yii 通过widget小物件生成添加表单
通过widget小物件创建添加商品的表单 视图里,表单以endWidget();?>结束 最终效果: 把表单提交过来的信息保存到数据库中去. 补充要点: 密码表单: <?php echo ...