Unity イベント管理
イベント
/// ベースイベント
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]);
}
}