Get UnityEvent reference from SerializedProperty

I have a custom editor in which I’m displaying a UnityEvent. All works fine. However, I want to always ensure the PersistentListenerState is always Runtime only. Unfortunately I’m unable to convert the SerializedProperty of a UnityEvent to an actual UnityEvent. I was anticipating I could just always set the PersistentListenerState to enforce this.

private void OnEnable() {
    mMyEventProp = serializedObject.FindProperty("mMyEvent ");
}

public override void OnInspectorGUI() {
    serializedObject.Update();
    EditorGUILayout.PropertyField(mOnCreatePayloadProp);

    //I was hoping to do something like
    var myEvent = mMyEventProp.objectReferenceValue as MyEvent;
    for (int index = 0; index < myEvent.GetPersistentEventCount(); index++) {
        myEvent.SetPersistentListenerState(index, UnityEventCallState.RuntimeOnly);
    }
    //But get compile time error with casting objectReferenceValue

    serializedObject.ApplyModifiedProperties();
}

Hi @FatCatz! SerializedProperty.objectReferenceValue only returns the value for properties whose type is UnityEngine.Object or a subclass. You want to do something like the following:

serializedObject.Update ();
EditorGUILayout.PropertyField (mMyEventProp);
SerializedProperty persistentCalls = mMyEventProp.FindPropertyRelative ("m_PersistentCalls.m_Calls");
for (int i = 0; i < persistentCalls.arraySize; ++i)
	persistentCalls.GetArrayElementAtIndex (i).FindPropertyRelative ("m_CallState").intValue = (int)UnityEngine.Events.UnityEventCallState.RuntimeOnly;
serializedObject.ApplyModifiedProperties ();