Skip to content

Instantly share code, notes, and snippets.

@zeffy1014
Created May 4, 2020 15:40
Show Gist options
  • Save zeffy1014/94f6c3c353b14c36f2cfad72deec5ad6 to your computer and use it in GitHub Desktop.
Save zeffy1014/94f6c3c353b14c36f2cfad72deec5ad6 to your computer and use it in GitHub Desktop.
Unity メッセージシステム拡張
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
/*** メッセージシステム受信用のInterface ***/
interface IEventReceiverEx : IEventSystemHandler
{
void OnXxxEvent(); //引数なしIF
void OnXxxIntParamEvent(int value); //int値を渡すIF
void OnXxxMultipleParamEvent(int value1, float value2); //int, float値を渡すIF
}
/*** イベント種別 ***/
enum SendEventType
{
XxxEvent,
XxxIntParamEvent,
XxxMultipleParamEvent,
EventNum
};
/*** イベント情報 ***/
/*** 基底クラス ***/
abstract class EventDataExBase
{
protected SendEventType type;
public EventDataExBase() { }
public SendEventType GetEventType() { return type; }
}
/*** 各種イベント情報クラス ***/
class XxxEventData : EventDataExBase
{
public XxxEventData() { type = SendEventType.XxxEvent; }
}
class XxxIntParamEventData : EventDataExBase
{
public int Value { get; }
public XxxIntParamEventData(int value)
{
type = SendEventType.XxxIntParamEvent;
Value = value;
}
}
class XxxMultipleParamEventData : EventDataExBase
{
public int Value1 { get; }
public float Value2 { get; }
public XxxMultipleParamEventData(int value1, float value2)
{
type = SendEventType.XxxMultipleParamEvent;
Value1 = value1;
Value2 = value2;
}
}
/*** イベント送受信モジュール ***/
class EventHandlerEx
{
static List<GameObject>[] listnerList = new List<GameObject>[(int)SendEventType.EventNum]; // イベント受信登録者List
static EventHandlerEx()
{
for (int i = 0; i < (int)SendEventType.EventNum; i++)
{
listnerList[i] = new List<GameObject>();
}
}
// イベント受信登録
public static void AddListner(GameObject go, SendEventType type)
{
listnerList[(int)type].Add(go);
}
// イベント送信処理
public static void SendEvent(SendEventDataBase eventData)
{
// イベント種別と対応するListenerを取得
SendEventType type = eventData.GetEventType();
if (null == listnerList[(int)type]) return;
// 実際の各種処理
void Callback(IEventReceiverEx receiver, BaseEventData data)
{
switch (type)
{
case SendEventType.XxxEvent:
receiver.OnXxxEvent();
break;
case SendEventType.XxxIntParamEvent:
try
{
// 派生クラスに変換してパラメータを取得
XxxIntParamEventData ev = (XxxIntParamEventData)eventData;
receiver.OnXxxIntParamEvent(ev.Value);
}
catch (InvalidCastException)
{
// イベント種別は送信側で設定しないのでダウンキャスト失敗しない想定だが一応
Debug.Log("Invalid Event...");
}
break;
case SendEventType.XxxMultipleParamEvent:
try
{
// 派生クラスに変換してパラメータを取得
XxxMultipleParamEventData ev = (XxxMultipleParamEventData)eventData;
receiver.OnXxxMultipleParamEvent(ev.Value1, ev.Value2);
}
catch (InvalidCastException)
{
// イベント種別は送信側で設定しないのでダウンキャスト失敗しない想定だが一応
Debug.Log("Invalid Event...");
}
break;
default:
break;
}
return;
}
// メッセージシステムで順次処理を呼び出す
foreach (GameObject listner in listnerList[(int)type])
{
if (null != listner)
{
ExecuteEvents.Execute<IEventReceiverEx>(
target: listner,
eventData: null,
functor: Callback
);
}
}
}
}
/*** イベント送信側(例) ***/
public class EventSenderSample : MonoBehaviour
{
void SendXxxEvent()
{
int i = 100;
float f = 0.5f;
// 送信先を意識せずに配信
EventHandlerEx.SendEvent(new XxxEventData());
EventHandlerEx.SendEvent(new XxxIntParamEventData(i));
EventHandlerEx.SendEvent(new XxxMultipleParamEventData(i, f));
}
/*
* 従来メッセージシステムの記述例(送信先GameObjectとIFを特定して実行)
public GameObject go;
void Start()
{
go = GameObject.FindWithTag("xxx");
}
void SendXxxEvent()
{
int i = 100;
float f = 0.5f;
ExecuteEvents.Execute<IEventReceiverEx>(
target: go,
eventData: null,
functor: (receiver, eventData) => receiver.OnXxxEvent()
);
ExecuteEvents.Execute<IEventReceiverEx>(
target: go,
eventData: null,
functor: (receiver, eventData) => receiver.OnXxxIntParamEvent(i)
);
ExecuteEvents.Execute<IEventReceiverEx>(
target: go,
eventData: null,
functor: (receiver, eventData) => receiver.OnXxxMultipleParamEvent(i, f)
);
}
*/
}
/*** イベント受信側(例) ***/
public class EventReceiverSample : MonoBehaviour, IEventReceiverEx
{
void Start()
{
//イベント受信登録
EventHandlerEx.AddListner(this.gameObject, SendEventType.XxxEvent);
EventHandlerEx.AddListner(this.gameObject, SendEventType.XxxIntParamEvent);
EventHandlerEx.AddListner(this.gameObject, SendEventType.XxxMultipleParamEvent);
}
/*** イベント受信処理 ***/
public void OnXxxEvent()
{
Debug.Log("XxxEvent Received.");
}
public void OnXxxIntParamEvent(int value)
{
Debug.Log("Receive XxxIntParamEvent. param:" + value);
}
public void OnXxxMultipleParamEvent(int value1, float value2)
{
Debug.Log("Receive XxxMutipleParamEvent. param:" + value1 + ", " + value2);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment