夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

複数のオブジェクトのメソッドを同時に実行するUnityEventを使う。

 本日はUntiyでのスクリプトの勉強枠です。 

〇UnityEventとは?

 UnityEventを用いることでシーン中の複数のオブジェクトのメソッドを一度に実行することができます。

 例えば、MRTKではアクションに対する反応で使用する[Interactable.cs]では[OnClick()]のイベントにUnityEventが使用されてることで一度のアクションでOnClickに登録されているオブジェクトのメソッドを一度に実行することができます。。

 f:id:Holomoto-Sumire:20200419142117j:plain

 以下のようにOnClick()に登録されている場合アクション後は各オブジェクトは以下の状態になります。

f:id:Holomoto-Sumire:20200419143119j:plain

 ・[Cube]が表示されます(アクティブ)。

 ・[Cube1]が非表示になります(ディアクティブ)。

 ・[Cube2]が表示されます。

 ・[Cube2]の[BoxCollider]がディアクティブ(無効化)になります。

 [Interactable.cs]中身を見てみます。

 /// <summary>
        /// Base onclick event
        /// </summary>
        public UnityEvent OnClick = new UnityEvent();

        [SerializeField]
        private List<InteractableEvent> Events = new List<InteractableEvent>();
        /// <summary>
        /// List of events added to this interactable
        /// </summary>
        public List<InteractableEvent> InteractableEvents
        {
            get { return Events; }
            set
            {
                Events = value;
                SetupEvents();
            }
        }

        private List<InteractableThemeBase> activeThemes = new List<InteractableThemeBase>();

〇UnityEventを使う

UnityEventを使います。

Unityのレファレンスは以下になります。

docs.unity3d.com

UnityEventを使用するためにはNameSpaceに以下を使用します。

using UnityEngine.Events;

次にイベントを記述します。

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

public class eventtest : MonoBehaviour
{

    [SerializeField] UnityEvent Test = new UnityEvent();

    // Start is called before the first frame update
    void Start()
    {
      
    }

   これでUnityEventを使用できるようになりました。

 f:id:Holomoto-Sumire:20200419145258j:plain

 次に設定したイベントを実行する処理を記述します。

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

public class eventtest : MonoBehaviour
{

    [SerializeField] UnityEvent Test = new UnityEvent();

    // Start is called before the first frame update
    void Start()
    {
       ueTest();
    }

    void ueTest()
    {
        Test.Invoke();

        Debug.Log("test");
    }
}

 

 UnityEvent.Invoke();

によって設定したイベントの処理を実行することができます。