我正在為游戲創建自定義 UnityEvents。基類如下所示:
public class EventSO : ScriptableObject
{
List<UnityAction> listeners = new List<UnityAction>();
public virtual void Raise() { ... }
public virtual void AddListener(UnityAction listener) { ... }
public virtual void RemoveListener(UnityAction listener) { ... }
}
有時我想將變數傳遞給事件。所以我繼承:
public class FloatEventSO : EventSO
{
List<UnityAction<float>> listeners = new List<UnityAction<float>>();
public override void Raise(float f) { ... }
public override void AddListener(UnityAction<float> listener) { ... }
public override void RemoveListener(UnityAction<float> listener) { ... }
}
我的目標是能夠為我可以分配和呼叫的單個事件創建 ScriptableObjects:Float 事件的一個很好的例子可能是傳達游戲時間。例如,一個名為“OnEveryHalfSec”的 ScriptableObject。
這種方法的第一個問題是我需要為傳遞給事件的每個變陣列合創建一個新類:UnityAction<float, int>, UnityAction<float, string>...等等。
第二個問題是我不能像上面顯示的那樣覆寫基類;Raise(float) 不能覆寫 Raise()。所以我必須重新定義每一堂課。
有沒有更好的方法來解決這個問題?
uj5u.com熱心網友回復:
你想使用泛型!
有一個基類,例如
public abstract ParameterEventSO<T> : ScriptableObject
{
List<UnityAction<T>> listeners = new List<UnityAction<T>>();
public virtual void Raise(T value)
{
foreach(var listener in listeners)
{
listener?.Invoke (value);
}
}
public virtual void AddListener(UnityAction<T> listener)
{
listeners.Add(listener);
}
public virtual void RemoveListener(UnityAction<T> listener)
{
listeners.Remove(listener);
}
}
現在,您可以根據需要使用特定型別的派生類,例如
[CreateAssetMenu]
public class FloatEvent : ParameterEventSO<float> { }
要么
[CreateAssetMenu]
public class IntListEvent : ParameterEventSO<List<int>> { }
或者也
public class CustomArgs
{
public Vector3 Position;
public string Name;
public DateTime TimeStamp;
}
[CreateAssetMenu]
public class CustomArgsEvent : ParameterEventSO<CustomArgs> { }
uj5u.com熱心網友回復:
看起來你應該定義
public override void Raise(float f) { ... }
作為
public virtual void Raise(float f) { ... } in the base class
您沒有將“(float f)”放在基類中
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/429120.html
