get set 使用起来很方便,但是编辑时在Inspector视图中问题就来了,因为get/set的属性即使是public了,但是在Inspector视图中依然不显示。。谷歌一下估计就是下面这样的答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public int width { get { return _width; } set { _width = value; } } [SerializeField] private int _width; |
如下图所示问题又来了,因为在编辑模式下修改Width的值,但是代码中的 set 压根就没执行。。
先看看[SerializeField]的含义,它用来序列化一个区域,通俗的来说[SerializeField]可以让private 的属性在Inspector视图中显示出来。。
那么上面的set没执行的原因就出来了,因为我们改的是private _width并不是 public width。由此可见此段代码在编辑模式下是毫无用处的。。
我偏偏就想在编辑时响应 set 的操作怎么办?我想做的是在set里面加一个自己写的方法。
TestInspector.cs放在Editor目录下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using UnityEngine; using UnityEditor; using System.Collections.Generic; [CustomEditor(typeof(Test))] public class TestInspector : Editor { Test model; public override void OnInspectorGUI(){ model=target as Test; int width=EditorGUILayout.IntField("Width",model.width); if(model.width!=width){ model.width=width; } base.DrawDefaultInspector(); } } |
Test挂在任意游戏对象上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public int width { get { return _width; } set { Debug.Log("set :" + value); _width = value; } } private int _width; } |
如下图所示,在编辑模式下用鼠标修改width的值。 log输出了说明 get set 已经响应了。
感谢下面好友的留言,另外一种实现的方式,我试了一下也很好用。
https://github.com/LMNRY/SetProperty
- 本文固定链接: https://www.xuanyusong.com/archives/3406
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
那个attribute扩展方法真的不错,并且是真心分享的github
和xlua其实抽象出来也是用这个attr扩展,不知道腾讯在c#和lua的交互上就写了这么一点,也好意思出来炫耀?
我用的是github里面那个,还是有个问题,我设置通过面板设置一个变量的时候,其实并不是要真的改变这个变量,而上执行对应属性的set方法来改变。但是这个方法首先还是会把变量改变然后再执行set方法
get;set本质上是一个方法,而不是一个字段。所以无法被序列化到inspector面板上的!
为什么我写的就是错的呢,这个每次修改Width的值,它输出的是上一次的值,我是醉了
[SerializeField, SetProperty(“Number”)]private float number;public float Number{ get { return number; } private set { number = Mathf.Clamp01(value); }}这些不是写在自己定义的Editor里吧? SetProperty不能识别啊
我用了 [SerializeField] private int _width;上面的第一段测试代码,外面改,在awake的时候输出,可以读取外面修改的Width的值,为啥。。。unity更新了就没这个问题啦?
[SerializeField] 是序列化在本地。 所以再此打开就会有这个值了、 不加的话只会在内存里。 所以再此打开就没值了。
MOMO大大,求教一个问题!!!unity 用vs的时候总会弹出一个“项目XXX已在该环境外被修改”————能不能让它自动重新加载啊。每次都要点,很麻烦!!!谢谢
恩,确实还不错的
您好,请问Toggle.ToggleEvent这种属性怎么通过Editor绘制在面板上
您好,请教一个问题,我自定义了一个Editor,在我通过检视面板,编辑数据的时候,每当我Play,二维结构(“List>”) 被编辑的数据就被重置了,不知道是什么原因啊?
为了避免某些读者没看懂,我来说明一下松哥的意思是在面板中呈现的不是属性,而是被序列化之后的私有变量_width,unity自动在面板中把_width更名为Width,如果想通过在面板中呈现属性来改变私有变量,要用文章中的特殊方法
https://github.com/LMNRY/SetProperty这里的方法普通的mono类里面用不了,提示必须继承自attribute class,错误 error CS0616: `SetProperty’: is not an attribute class
https://github.com/LMNRY/SetProperty这里的方法普通的mono类里面用不了,提示必须继承自attribute class,错误 error CS0616: `SetProperty’: is not an attribute class
每次运行_width会变回0
是啊, 这个只是编辑时用的,做一些编辑器UI的调整。。
soga
这里的get 一般是取控件上的数值。。
try this:https://github.com/LMNRY/SetProperty
感谢回复,方法很好。。
Good