http://www.xuanyusong.com/archives/3406
get set 使用起来很方便,但是编辑时在Inspector视图中问题就来了,因为get/set的属性即使是public了,但是在Inspector视图中依然不显示。。谷歌一下估计就是下面这样的答案。
C#
1 2 3 4 5 6 7 8 9 10 11 | 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目录下
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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挂在任意游戏对象上。
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
转载请注明: 雨松MOMO
2015年01月13日
于 雨松MOMO程序研究院 发表