[Unity]シーンに存在する同じスクリプトに共通して発火させるイベントをインスペクター上管理する方法
使用例
例えばTalkクラスがあったとします。
そのTalkクラスはMobゲームオブジェクトに付随するコンポーネントになります。
そのTalkクラス群に共通して発火させたい一意のイベントを
カスタマイズしたいときはどうすればよいのか?
以下のようなコードを考えてみました。
using UnityEngine;
using UnityEngine.Events;
//継承用
public class StaticEventBehavior : MonoBehaviour {
public static System.Action<int> staticAction;
public IDEvents iDEvents;
void Awake() {
staticAction+=(x)=>iDEvents.Execute(x);
}
public void StaticEventCall(int id=0){
staticAction(id);
}
}
UIeventクラス
[System.Serializable]
public class IDEvents{
[Serializablenb]
public struct pair
{
public DelayEvents Event;
public int Id;
}
public List<pair> pairs;
public void Execute(int id){
foreach (var item in pairs)
{if (item.Id.Equals(id))
{
item.Event.Execute();
}
}
}
}
[System.Serializable]
public class DelayEvents
{
public List<DelayEvent> delayEvents;
public void Execute(){
delayEvents.ForEach(x=>x.Execute());
}
}
このStaticEventBehaviorをTalkクラスが継承して使えば
シーンに存在する同じコンポーネントに共通して発火させるイベントをインスペクター上で
管理する機能を実装することができます。
例えば、Talkクラス内の会話終了時。開始時の部分に共通して発火できる
イベントを差し込んだり・・・
また、HPクラス、Attackクラスなどのように、たくさんのゲームオブジェクトに付随される可能性のあるコンポーネントには
以下のクラスを継承して共通発火イベントを管理してみてもいいかもしれません。
このコードを使える場面は限られてるかもしれませんが。
特にそのイベントの結びつけが、コード上で行うとめんどくさくなるというケースでは
適宜インスペクターでカスタマイズできるようになるため、適材適所で使ってみてください