1

I created a custom editor where the object and their components are automatically added.

But how do I put the Unity component built-in function in UnityEvent via script?

In this case, I want to put audio source Play() function in the UnityEvent via script.

before after

3 Answers 3

6

Hope this works:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;

[ExecuteInEditMode]
[RequireComponent (typeof (AudioSource))]
public class SceneAnimationEvent : MonoBehaviour {
    public AudioSource audioSrc;
    [SerializeField]
    public UnityEvent unityEvent;
    UnityAction methodDelegate;
    bool eventAdded = false;

    void OnEnable() {
        UpdateInspector ();
    }
    void UpdateInspector() {
        if (!eventAdded) {
            audioSrc = GetComponent<AudioSource> ();
            unityEvent = new UnityEvent ();
            methodDelegate = System.Delegate.CreateDelegate (typeof(UnityAction), audioSrc, "Play") as UnityAction;
            UnityEditor.Events.UnityEventTools.AddPersistentListener (unityEvent, methodDelegate);
            eventAdded = true;
        }
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

Its working, I will post my full code if someone else encounter the same problem.
2

Thanks to @zayedupal's answer, this is my final code to automatically create a GameObject, Components and automatically add a UnityEvent.

[MenuItem("GameObject/Create Animation/With SFX", false, -1)]
static void CreateAnimationWithSFX()
{
    GameObject go = new GameObject("animationWithSFX");
    go.transform.SetParent(Selection.activeTransform);

    AudioSource audioSource = go.AddComponent<AudioSource>();
    audioSource.playOnAwake = false;
    // Automate-add the right channel for audio source
    AudioMixer mixer = Resources.Load("Master") as AudioMixer;
    audioSource.outputAudioMixerGroup = mixer.FindMatchingGroups("SFX")[0];

    SceneAnimationEvent script = go.AddComponent<SceneAnimationEvent>();
    // Automate-add the unity built-in function into UnityEvent
    script.Events = new UnityEvent ();
    UnityAction methodDelegate = System.Delegate.CreateDelegate (typeof(UnityAction), audioSource, "Play") as UnityAction;
    UnityEventTools.AddPersistentListener (script.Events, methodDelegate);

    Undo.RegisterCreatedObjectUndo(go, "Create " + go.name);
    Selection.activeObject = go;
}

Comments

1

You can use unityEvent.AddListener

public class EventRunner : MonoBehaviour {

    public AudioSource audioSource;
    public UnityEvent ev;

    IEnumerator Start () {

        //you won't see an entry comes up in the inspector
        ev.AddListener(audioSource.Play);

        while (true)
        {
            ev.Invoke(); //you will hear the sound
            yield return new WaitForSeconds(0.5f);
        }

    }
}

1 Comment

i need to add listener on editor without entering playing mode.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.