Unity Interface Serialization-Expose Interface field In Inspector
来源:互联网 发布:网络安全措施部署 编辑:程序博客网 时间:2024/05/17 07:48
Unity has some quirks about their inspector, so as a preface they are listed here:
- If you add a
[Serializable]
attribute to a class, Unity's Inspector will attempt to show all public fields inside that class. - Any class extending
Monobehaviour
automatically has the[Serializable]
attribute - Unity's inspector will attempt to display any private field with the
[SerializeField]
attribute. - Unity's inspector will not attempt to display generic types or interfaces, with the exception of
List<T>
, which is hard-coded. - Unity's inspector will not attempt to display properties. A common workaround is to have a private backing field for your property with
[SerializeField]
attached. Setters won't be called on the value set in the inspector, but since that's only set pre-compilation, that's acceptable. - Unity has a
PropertyDrawer
class you can extend to control how a type is displayed in the inspector. ThePropertyDrawer
for an interface or generic type will be ignored.
Unity, by itself, does not expose fields that are of an interface type. It is possible to manually enable this functionality by implementing a custom inspector each time as Mike 3 has pointed out,but even then the reference would not be serialized ("remembered" between sessions and entering/exiting playmode).
It is possible however to create a serializable container object that wraps around a Component field (which is serialized) and casts to the desired interface type through a generic property. And with the introduction of custom property drawers into Unity, you can effectively expose a serialized interface field in your scripts without having to write a custom inspector / property drawer each time.
Some simple demo code :
using UnityEngine;[System.Serializable]public class InterfaceHelper {public Component target;public T getInterface<T>() where T : class{return target as T;}}
And the Custom property drawer:
using UnityEngine;using UnityEditor;[CustomPropertyDrawer(typeof(InterfaceHelper))]public class EditorInterfaceHelper : PropertyDrawer {public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label){EditorGUI.BeginProperty(pos, label, prop);pos = EditorGUI.PrefixLabel(pos,GUIUtility.GetControlID(FocusType.Passive),label);EditorGUI.PropertyField(pos,prop.FindPropertyRelative("target"),GUIContent.none);EditorGUI.EndProperty();}}
Usage:
public interface IData{void getData();}
#definepublic InterfaceHelper dataSrc;...//call the functiondataSrc.getInterface<IData>().getData();
The interface field in inspector is like this:
Of course, You can use abstract class instead sometimes,but if you do that, you will miss the benefit of mul-inherit.
参考:
http://codereview.stackexchange.com/questions/65028/inspector-interface-serializer
http://answers.unity3d.com/questions/46210/how-to-expose-a-field-of-type-interface-in-the-ins.html
http://answers.unity3d.com/questions/783456/solution-how-to-serialize-interfaces-generics-auto.html
- Unity Interface Serialization-Expose Interface field In Inspector
- Interface
- interface
- interface
- interface
- interface
- interface
- @interface
- Interface
- @interface
- Interface
- interface
- Interface
- interface
- Interface
- Interface
- interface
- interface
- 安装virtualbox遇到的问题
- hive中添加永久性函数
- 关于Layer与锚点
- js 判断是android手机,iphone手机
- java中使用jxl导出Excel表格
- Unity Interface Serialization-Expose Interface field In Inspector
- java.lang.ClassNotFoundException: com.sun.image.codec.jpeg.JPEGCodec
- JQuery 学习一
- Git
- MySQL中涉及的几个字符集
- error C2220: warning treated as error - no object file generated
- Google的招聘要求
- php 算法之分割数组,不用array_chunk(),算法之二,取数组的差值,不用array_diff()
- 关于RSA算法密钥长度/密文长度/明文长度