11using System ;
22using System . Linq ;
3+ using System . Reflection ;
34using TNRD . Utilities ;
45using UnityEditor ;
56using UnityEditor . IMGUI . Controls ;
@@ -30,6 +31,67 @@ private enum DragAndDropMode
3031 protected SerializedProperty RawReferenceProperty => Property . FindPropertyRelative ( "rawReference" ) ;
3132 protected SerializedProperty UnityReferenceProperty => Property . FindPropertyRelative ( "unityReference" ) ;
3233
34+ protected FieldInfo FieldInfo { get ; private set ; }
35+
36+ protected ReferenceMode ModeValue
37+ {
38+ get => ( ReferenceMode ) ReferenceModeProperty . enumValueIndex ;
39+ set => ReferenceModeProperty . enumValueIndex = ( int ) value ;
40+ }
41+
42+ protected object RawReferenceValue
43+ {
44+ get
45+ {
46+ #if UNITY_2021_1_OR_NEWER
47+ return RawReferenceProperty . managedReferenceValue ;
48+ #else
49+ ISerializableInterface instance =
50+ ( ISerializableInterface ) FieldInfo . GetValue ( Property . serializedObject . targetObject ) ;
51+ return instance . GetRawReference ( ) ;
52+ #endif
53+ }
54+ set
55+ {
56+ #if UNITY_2021_1_OR_NEWER
57+ RawReferenceProperty . managedReferenceValue = value ;
58+ #else
59+ FieldInfo . SetValue ( Property . serializedObject . targetObject , value ) ;
60+ #endif
61+ }
62+ }
63+
64+ protected object PropertyValue
65+ {
66+ get
67+ {
68+ return ModeValue switch
69+ {
70+ ReferenceMode . Raw => RawReferenceValue ,
71+ ReferenceMode . Unity => UnityReferenceProperty . objectReferenceValue ,
72+ _ => throw new ArgumentOutOfRangeException ( )
73+ } ;
74+ }
75+ set
76+ {
77+ switch ( ModeValue )
78+ {
79+ case ReferenceMode . Raw :
80+ RawReferenceValue = value ;
81+ UnityReferenceProperty . objectReferenceValue = null ;
82+ break ;
83+ case ReferenceMode . Unity :
84+ UnityReferenceProperty . objectReferenceValue = ( Object ) value ;
85+ RawReferenceValue = null ;
86+ break ;
87+ default :
88+ throw new ArgumentOutOfRangeException ( ) ;
89+ }
90+
91+ Property . serializedObject . ApplyModifiedProperties ( ) ;
92+ }
93+ }
94+
3395 protected ReferenceDrawer ( )
3496 {
3597 CustomObjectDrawer = new CustomObjectDrawer ( ) ;
@@ -39,10 +101,11 @@ protected ReferenceDrawer()
39101 CustomObjectDrawer . PropertiesClicked += OnPropertiesClicked ;
40102 }
41103
42- protected void Initialize ( SerializedProperty property , Type genericType )
104+ protected void Initialize ( SerializedProperty property , Type genericType , FieldInfo fieldInfo )
43105 {
44106 Property = property ;
45107 GenericType = genericType ;
108+ FieldInfo = fieldInfo ;
46109 }
47110
48111 private void OnButtonClicked ( Rect position )
@@ -70,43 +133,18 @@ private void OnButtonClicked(Rect position)
70133
71134 private void OnClicked ( )
72135 {
73- switch ( ( ReferenceMode ) ReferenceModeProperty . enumValueIndex )
74- {
75- case ReferenceMode . Raw :
76- // No support for pinging raw objects for now (I guess this would ping the MonoScript?)
77- break ;
78- case ReferenceMode . Unity :
79- EditorGUIUtility . PingObject ( UnityReferenceProperty . objectReferenceValue ) ;
80- break ;
81- default :
82- throw new ArgumentOutOfRangeException ( ) ;
83- }
136+ PingObject ( ) ;
84137 }
85138
86139 private void OnDeletePressed ( )
87140 {
88- RawReferenceProperty . managedReferenceValue = null ;
89- UnityReferenceProperty . objectReferenceValue = null ;
90- Property . serializedObject . ApplyModifiedProperties ( ) ;
141+ PropertyValue = null ;
91142 }
92143
93144 private void OnItemSelected ( ReferenceMode mode , object reference )
94145 {
95- ReferenceModeProperty . enumValueIndex = ( int ) mode ;
96-
97- switch ( mode )
98- {
99- case ReferenceMode . Raw :
100- RawReferenceProperty . managedReferenceValue = reference ;
101- break ;
102- case ReferenceMode . Unity :
103- UnityReferenceProperty . objectReferenceValue = ( Object ) reference ;
104- break ;
105- default :
106- throw new ArgumentOutOfRangeException ( nameof ( mode ) , mode , null ) ;
107- }
108-
109- Property . serializedObject . ApplyModifiedProperties ( ) ;
146+ ModeValue = mode ;
147+ PropertyValue = reference ;
110148 }
111149
112150 protected abstract void OnPropertiesClicked ( ) ;
@@ -166,7 +204,7 @@ private void HandleDragUpdated()
166204 SetDragAndDropMode ( false ) ;
167205 return ;
168206 }
169-
207+
170208 if ( ! GenericType . IsAssignableFrom ( scriptType ) )
171209 {
172210 SetDragAndDropMode ( false ) ;
@@ -187,22 +225,19 @@ private void HandleDragPerform()
187225 switch ( dragAndDropMode )
188226 {
189227 case DragAndDropMode . Raw :
190- RawReferenceProperty . managedReferenceValue =
191- Activator . CreateInstance ( ( ( MonoScript ) DragAndDrop . objectReferences [ 0 ] ) . GetClass ( ) ) ;
192- ReferenceModeProperty . enumValueIndex = ( int ) ReferenceMode . Raw ;
228+ ModeValue = ReferenceMode . Raw ;
229+ PropertyValue = Activator . CreateInstance ( ( ( MonoScript ) DragAndDrop . objectReferences [ 0 ] ) . GetClass ( ) ) ;
193230 break ;
194231 case DragAndDropMode . Unity :
195- if ( DragAndDrop . objectReferences [ 0 ] is GameObject go )
196- UnityReferenceProperty . objectReferenceValue = go . GetComponent ( GenericType ) ;
197- else
198- UnityReferenceProperty . objectReferenceValue = DragAndDrop . objectReferences [ 0 ] ;
199-
200- ReferenceModeProperty . enumValueIndex = ( int ) ReferenceMode . Unity ;
232+ ModeValue = ReferenceMode . Unity ;
233+ PropertyValue = DragAndDrop . objectReferences [ 0 ] ;
201234 break ;
202235 case DragAndDropMode . None :
203236 default :
204237 throw new ArgumentOutOfRangeException ( ) ;
205238 }
206239 }
240+
241+ protected abstract void PingObject ( ) ;
207242 }
208243}
0 commit comments