Unity3d Inspector面板实现set/get访问器
简单说一下属性和字段的区别:字段就是成员变量,而属性确实提供给外部访问内部成员变量的接口。之所以会有属性的出现,就是为了避免外部对类的成员的直接访问,通俗的说就是OOP中的封装思想。
using UnityEngine;
using System.Collections; public class DemoTest : MonoBehaviour { private int _score;
public int Score
{
get { return _score; }
set
{ if (value > )
{
value = ;
}
_score = value;
}
}
}上面的示例中_score就是字段或者叫成员变量,,而Score其实是C#语法简化的方法,提供了私有成员_score对外部的访问接口,当我们通过Score更改_score的值时就会触发set{…}代码段的代码执行,这样就完成了对_score的范围限制,这里就体现了OOP中的封装的好处啦。。。。关于属性和字段的介绍就到此为止,下面说一下这篇文章的主题。
在Unity中可以把字段使用[SerializeField]的方式序列化到Inspector面板(至于什么是序列化,读者可以自行百度),当然public 访问权限的字段是隐式添加[SerializeField],所以可以直接被序列化的,private的字段也可以手动添加[SerializeField]来实现序列化的比如上述的例子中我简单在_score上添加[SerializeField],就可以在Inspector面板上直接对_score赋值了
using UnityEngine;
using System.Collections; public class DemoTest : MonoBehaviour { [SerializeField]
private int _score;
public int Score
{
get { return _score; }
set
{ if (value > )
{
value = ;
}
_score = value;
}
}
}
此时可以在Inpector面板中看到:
之所以会显示Score,而不是_score,这是unity3d在显示的时候做的一些处理,不必关注。然而此时我们如果直接修改Score的值到120,那么我们其实直接修改的_score的值,而不是通过属性Score来访问的,所以我们限定的_score<=100,就不在起作用了,那么如果在工程中有这种需求该怎么处理呢?有两种方案可供选择,先说第一种写Editor的方式实现:
using UnityEngine;
using System.Collections; public class DemoTest : MonoBehaviour { // [SerializeField]
private int _score; public int Score
{
get { return _score; }
set
{ if (value > )
{
value = ;
}
print("set _score value = " + value);
_score = value;
}
}
}
自定义的Editor类源码(当然该类必须放在Editor目录下:
using UnityEngine;
using System.Collections;
using UnityEditor;
[CustomEditor(typeof(DemoTest))] //为DemoTest添加一个自定义标签
public class EditorTest : Editor { public override void OnInspectorGUI() //当DemoTest在Inspector面板上显示改动时触发
{
DemoTest demoTest = target as DemoTest; //target是Eiditor内部封装的当前操作的对象引用
int score = EditorGUILayout.IntField("Score", demoTest.Score);//在Inspector面板上序列化一个对象,并关联demoTest.Score属性
if (demoTest.Score != score)//如果该属性在改动后没有触发就手动触发
{
demoTest.Score = score;
}
base.DrawDefaultInspector();//重回Inspector面板
}
}
这样当我们修改Socre时就可以在Console中看到相应的输出了,也就解决了set、get方法封装性问题。当然这种方式很有局限性,使用起来十分不方便,还有一种简便的方式,使用SetProperty标签,当然我个人由于unity版本过低,SetProperty还不支持,,应该要5.0以后的版本吧,这里附上链接:https://github.com/LMNRY/SetProperty
Unity3d Inspector面板实现set/get访问器的更多相关文章
- Unity3D — — Inspector面板编辑
转载官方文档,暂未深入研究 PropertyDrawer
- Unity3D:Text在Inspector面板中中无法显示,需转换成UTF-8格式
环境:Win10 读取text内容后unity报错:Input string was not in the correct format 同时在Inspector面板中无法预览Text文本内容 随后发 ...
- Unity 自定义Inspector面板时的数据持久化问题
自定义Inspector面板的步骤: Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Ed ...
- Unity编辑器环境在Inspector面板中显示变量
Serialize功能Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系. 简单的说,在没有自定义Inspector的情况下所有 ...
- JavaScript 数据属性和访问器属性
在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值.对象或函数."通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数. 创建自定义对象通 ...
- JavaScript 属性类型(数据属性和访问器属性)
数据属性 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性有 4 个描述其行为的特性. [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修 ...
- ECMAScript 5中的数据属性和访问器属性
简介 ECMAScript 定义的对象中有两种特殊的属性, 这两种特殊的属性在你定义对象属性时就会赋予, 我们在必要时可以改写这两种特殊的属性让其属性的访问更加的合理化, 这两种特殊的属性称呼及作用如 ...
- JavaScript数据属性与访问器属性
ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...
- JS之访问器
1.在对象中定义get,set访问器属性 <script> var test = { _name:"pmx", _age:18, _born:1990, get nam ...
随机推荐
- 【php】php安全问题
使用 —enable-force-cgi-redirect 选项 设置 doc_root 或 user_dir 或 open_basedir PHP运行的用户身份不能为ROOT 数据库字段加密 程序不 ...
- jQuery获取动态添加的元素,live和on的区别
今天给大家说一下如果用jQuery获取动态添加的元素,通常如果你在网页上利用jQuery添加一个元素,那么用平常的jQuery获取元素的方法无效的获取不到的.可以用以下的方法获取动态元素!假设我们现在 ...
- Python学习笔记:输入输出,注释,运算符,变量,数字类型,序列,条件和循环控制,函数,迭代器与生成器,异常处理
输入输出 输入函数input()和raw_input() 在Python3.x中只有input()作为输入函数,会将输入内容自动转换str类型: 在Python2.x中有input()和raw_inp ...
- 在windows7 32ibt安装MongoDB数据库的方法及连接失败解决方案
参考 https://www.cnblogs.com/cnblogs-jcy/p/6734889.html http://yunkus.com/mongodb-install-config-in-wi ...
- BFS:UVa1590-IP Networks (子网掩码相关知识)
IP Networks Alex is administrator of IP networks. His clients have a bunch of individual IP addresse ...
- bash函数定义/使用/传参…
函数:function, 功能 过程式编程,代码重用 模块化编程 简洁 语法: function f_name { ...
- bash循环for/while/until
shell流程控制之一:for循环 for VAR in LIST; do STATEMENT1 ... done 例: ...
- 金阳光Android自动化测试第一季
第一季:http://www.chuanke.com/v1983382-106000-218422.html 第一节:Android自动化预备课程基础(上) 1. 基于坐标点触屏:monkey ...
- Mysql登陆、退出、更改环境编码
登录: mysql -h[数据库地址] -u[username] -p[password] -P[端口] //大写P表示端口,小写p表示密码 例如:mysql -hlocalhost -uroot ...
- 百度地图的API接口----多地址查询和经纬度
最近看了百度地图的API的接口,正想自己做点小东西,主要是多地址查询和经纬度坐标跟踪, 下面的代码直接另存为html就可以了,目前测试Chrome和360浏览器可以正常使用. <!DOCTYPE ...