そんなことをする必要があるかどうかはさておき、やりたくなったので。
ということでいつもの前提環境
- Unity 2018.4.20f1
- UdonSharp 0.18.6
といっても、実装は簡単で、こんな感じ。
もしかしたらこんなことしなくても良いカモだけど。
[SerializeField] [UdonBehaviour(typeof(CustomUSharpComponent))] private UdonBehaviour _behaviour; // private void OnGUI() { var so = new SerializedObject(this); so.Update(); EditorGUILayout.PropertyField(so.FindProperty(nameof(_behaviour))); so.ApplyModifiedProperties(); }
[AttributeUsage(AttributeTargets.Field)] internal class UdonBehaviourAttribute : PropertyAttribute { public Type Type { get; } public UdonBehaviourAttribute(Type t) { this.Type = t; } }
[CustomPropertyDrawer(typeof(UdonBehaviourAttribute))] internal class UdonBehaviourDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { if (property.objectReferenceValue != null) { var behaviour = property.objectReferenceValue as UdonBehaviour; if (!IsValidUdonSharpProgram(attribute as UdonBehaviourAttribute, behaviour)) property.objectReferenceValue = null; } EditorGUI.PropertyField(position, property, label); } private static bool IsValidUdonSharpProgram(UdonBehaviourAttribute attr, UdonBehaviour behaviour) { return UdonSharpProgramAsset.GetBehaviourClass(behaviour) == attr.Type; } }
UdonBehaviour
にくっついている U# クラスは UdonSharpProgramAsset#GetBehaviourClass
から取れるので、
そこで型を比較して上げれば OK。
ということでメモでした。