- Home /
Can UnityEvent data be transferred to/from a ScriptableObject?
For somewhat convoulted reasons, I'm trying to create a custom Inspector for a UnityEvent without accessing it directly via SerializedObject.
Other answers on the forum all suggest this is the only way to go about it, so I'm wondering if it's possible to temporarily create a ScriptableObject, copy the event data into it, expose it in the GUI, then transfer it back.
This worked when testing with a simple integer:
public class MyClass
{
public int myInt;
public void ShowGUI ()
{
MyScriptableObject mySO = ScriptableObject.CreateInstance <MyScriptableObject>();
var serializedObject = new SerializedObject (mySO);
SerializedProperty myProperty = serializedObject.FindProperty ("tempInt");
myProperty.intValue = myInt;
EditorGUILayout.PropertyField (myProperty, true);
myInt = myProperty.intValue;
DestroyImmediate (mySO);
}
private class MyScriptableObject
{
public int tempInt;
}
}
Though, things didn't work so well when trying to do the same thing with a UnityEvent variable. I've been trying to manually extract the object/method referenced in each listener, but I can't seem to detect when the user has created an event (clicking '+') in order to store a new object/method pair.
Here, the Debug.Log statement always returns 0:
public class MyClass
{
public UnityEvent myEvent;
public void ShowGUI ()
{
MyScriptableObject mySO = ScriptableObject.CreateInstance <MyScriptableObject>();
var serializedObject = new SerializedObject (mySO);
SerializedProperty eventProperty = serializedObject.FindProperty ("tempEvent");
int numEvents = unityEvent.GetPersistentEventCount ();
for (int i=0; i<numEvents; i++)
{
Object target = unityEvent.GetPersistentTarget (i);
eventProperty.GetArrayElementAtIndex (i).FindPropertyRelative ("m_Target").objectReferenceValue = target;
string method = unityEvent.GetPersistentMethodName (i);
eventProperty.GetArrayElementAtIndex (i).FindPropertyRelative ("m_MethodName").stringValue = method;
}
EditorGUILayout.PropertyField (eventProperty, true);
serializedObject.ApplyModifiedProperties ();
numEvents = eventProperty.CountInProperty () - 1;
Debug.Log (numEvents);
// Todo: Apply tempEvent values back to myEvent
DestroyImmediate (mySO);
}
private class MyScriptableObject
{
public UnityEvent tempEvent;
}
}
Is this even possible, or am I hideously overthinking things?
Thanks!
Your answer
Follow this Question
Related Questions
Get UnityEvent reference from SerializedProperty 1 Answer
How to iterate through all serialized property children ( deep search ) 1 Answer
Replicate "Apply" and "Revert" button functionality in ScriptableObject Editor Inspector 2 Answers
Why do I need to serialize a struct inside a ScriptableObject to save its data? 1 Answer