[英]How to save differently-typed values without converting them and thus losing their specific fields/methods in C#?
[英]C# class inheritance with ScriptableObject UnityEvents and differently-typed UnityActions
我正在为游戏创建自定义 UnityEvents。 基础 class 看起来像这样:
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。
这种方法的第一个问题是,我需要为传递给事件的每个变量组合创建一个新的 class:UnityAction<float, int>、UnityAction<float, string>... 等等。
第二个问题是我无法像上面显示的那样覆盖基数 class; Raise(float) 不能覆盖 Raise()。 所以我必须在每个 class 上重新定义。
有没有更好的方法来解决这个问题?
看起来你应该定义
public override void Raise(float f) {... }
作为
public virtual void Raise(float f) {... } in the base class
您没有将“(float f)”放入基数 class
你想使用generics !
有一个基地 class 像例如
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> { }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.