Unity イベント管理

unity csharp
2021-11-07

イベント

/// ベースイベント
public class GameSceneEvent {}
 
class TapEvent: GameSceneEvent {}
 
// MessageBroker をラップしたもの
// 本当は専用のBroker作りたい
public static class Util {
    /// <summary>
    /// イベントトリガー
    /// </summary>
    public static IObservable<T> On<T>() where T : GameSceneEvent {
        return MessageBroker.Default.Receive<T>();
    }
 
    /// <summary>
    /// イベントを発火
    /// </summary>
    public static void Fire<T>(T e) where T : GameSceneEvent {
        MessageBroker.Default.Publish(e);
    }
}

タイムライン

using UniRx;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
using static Util;
 
/// <summary>
/// タイムライン再生を管理
/// </summary>
[RequireComponent(typeof(PlayableDirector))]
public class HogeDirector : MonoBehaviour {
    /// <summary>
    /// タイムライン
    /// </summary>
    [SerializeField]
    private TimelineAsset[] timelines;
 
    /// <summary>
    /// Playable Director
    /// </summary>
    private PlayableDirector director;
    
    void Start() {
        director = GetComponent<PlayableDirector>();
        
        // Event を受け取ったら Timelineを再生
        On<HogeEvent>()
            .Subscribe(PlayTimeline)
            .AddTo(this);
    }
 
    void PlayTimeline(HogeEvent e) {
        director.stopped += _ => {};
				// 0-origined enum -> int
        director.Play(timelines[(int)e.PenaltyType]);
    }
}