在創建 UI 系統時,我試圖創建一個 UI 事件處理程式,該程式接收一個長度可變的引數并執行一個動作。
以下是我的代碼
class UIEventTriggerManager : MonoBehaviour
{
public static UIEventTriggerManager Instance;
private void Awake()
{
Instance = this;
}
public void Publish(string key。params object[] args)?
{
m_eventHandler[key]?.Invoke(args)。
}
public void Subscribe(string eventsName, Action< object[]> action)。
{
if (m_eventHandler.ContainsKey(eventName) == false)
{
m_eventHandler.Add(eventName, action)。
}
else { m_eventHandler.Add(eventName, action)
{
m_eventHandler[eventName] = action;
}
}
}
class CharacterUI
{
public void FirstOpen()
{
UIEventTriggerManager.Instance.Subscribe("ChagedCharacter", ChagedCharacter); //ChagedCharacter錯誤。
UIEventTriggerManager.Instance.Subscribe("ChagedCharacter2", ChagedCharacter2); //error。
UIEventTriggerManager.Instance.Subscribe("ChagedCharacter3", ChagedCharacter3); //錯誤。
}
public void ChagedCharacter()。
{
//....。
}
public void ChagedCharacter2(int a)?
{
//....。
}
public void ChagedCharacter3(int a。string b, float c)。
{
//....。
}
如何使用訂閱'ChangedCharacter'方法?
我是否需要在方法引數中添加'params object[] args'?
我知道語法錯誤,但我需要一個事件處理器來管理多個引數。
我正在嘗試這樣實作,請給我一些建議。
uj5u.com熱心網友回復:
params確實只存在于
Publish(string key, params object[ ] args)
這意味著你可以用額外的引數來呼叫這個方法--或者不用。在這個方法里面,它只是一個長度可變的object[]。如果沒有傳入任何args,它將只是一個空陣列。
另外,你似乎已經知道Action<object[]>只是接收一個object[] - 這里沒有params。
Action<object[]>基本上沒有其他東西,只是一個簡寫
public delegate void SomeName(span class="hljs-built_in">object[] args)。
因此,聽眾方法也很簡單
//應該是 "changed" btw?
public void ChagedCharacter(object[] args)
而正確處理陣列是這個(以及任何監聽器)的責任。
這個錯誤實際上應該準確地告訴你ChagedCharacter應該有哪個簽名。
然后你可以,例如,做
。private void ChagedCharacter(object[] args)?
{
switch(args.Length)
{
case 0:
ChagedCharacter()。
break;
case 1 when args[0] is int intValue :
ChagedCharacter(intValue)。
break。
case 3 when args[0] is int intValue & & args[1] is string stringValue & & args[2] is float floatValue。
ChagedCharacter(intValue, stringValue, floatValue)。
break。
default:
break。
}
但說實話,在你這樣做之前,你寧愿過度考慮你的設計...
uj5u.com熱心網友回復:
也許這個解決方案對你來說已經足夠了。這個解決方案也有裝箱的功能,所以也許可以用<T>來代替object[]以避免。
public enum EventType
{
ChagedCharacter,
ChagedCharacter2
}
public class UIEventTriggerManager : MonoBehaviour
{
public static UIEventTriggerManager Instance;
private void Awake()
{
Instance = this;
}
static Dictionary<EventType,List< IReciveEvent>> recives = new Dictionary<EventType, List<IReciveEvent>>()。
public void Publish(EventType key, params object[] args)?
{
if (recives.ContainsKey(key))
{
foreach(IReciveEvent ir in recives[key])
{
ir.GetEvent(key,args)。
}
}
}
public void Subscribe(EventType type , IReciveEvent ui)
{
if(!recives.ContainsKey(type))
{
recives[type] = new List<IReciveEvent>()。
}
if(!recives[type].Contains(ui))
{
recives[type].Add(ui);
}
}
}
public interface IReciveEventvoid GetEvent(EventType type, object[] objs) /span>;
}
public class CharUI : MonoBehaviour, IReciveEvent
{
private void Awake()
{
UIEventTriggerManager.Instance.Subscribe(EventType.ChagedCharacter, this)。
UIEventTriggerManager.Instance.Subscribe(EventType.ChagedCharacter2, this) 。
}
public void GetEvent(EventType type。object[] objs)。
{
if(type == EventType.ChagedCharacter)
{
//todo。
}
else if ( type == EventType.ChagedCharacter2)
{
int a = (int)objs[0] 。
//todo
}
//.... >。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/312669.html
標籤:
上一篇:對于每個回圈-設定會話變數
下一篇:腳本停止改變數值
