我试图建立一个允许我在Unity3D中轻松设置延迟的系统(在C#中),没有任何参数或简单参数这样做就可以了,但是我喜欢这个系统足够灵活,允许任何类型的回调。
例如,在Start方法中,它应该在5秒后调用PrintString:
public string str = "something";
void Start(){
SB.Delay(5, PrintString, str);
}
public void PrintString(string pr){
Debug.Log(pr);
}
Delay方法创建一个新的SBTimer,它被添加到SBTimer列表中。然后我在其他地方循环遍历该列表以运行所有
public static void Delay<T>(float delay, SBTimer.CallbackParam<T> cb, T arg){
delays.Add(new SBTimer(delay, cb, arg));
}
这是问题出现的地方,我不知道如何继续。这是SBTimer课程,或者至少我喜欢它如何工作:
public class SBTimer{
public delegate void Callback();
public Callback _callback = null;
public delegate void CallbackParam<T>(T arg);
public Callback _callbackparam = null;
public T _arg;
public float _delay = 0f;
public SBTimer(float delay, Callback cb){
_delay = delay;
_callback = cb;
}
public SBTimer(float delay, CallbackParam<T> cb, T arg){
_delay = delay;
_callback = cb;
_arg = arg;
}
public DoUpdate(){ //stuff here }
}
到目前为止,我唯一可以使用它的方法是,如果我将SBTimer设为泛型类,但这会使更新循环复杂化(现在就是这样:)
void Update () {
SB.OnUpdate();
}
有谁知道如何解决这个问题,或者知道一种不同的方法来获得类似的结果?
答案 0 :(得分:1)
这种类型不需要打扰支持。只需接受Action
并且不支持其他代表。如果调用者想要调用一个具有参数并提供这些参数的方法,他们可以使用lambda来关闭有问题的值,给你Action
但实际上在调用它时调用他们想要的方法: / p>
public class SBTimer
{
private Action callback;
private float delay;
public SBTimer(float delay, Action callback)
{
this.delay = delay;
this.callback = callback;
}
//todo actual implementation
}
public class Foo
{
public string str = "something";
void Start()
{
new SBTimer(5, () => PrintString(str));
}
public void PrintString(string pr)
{
}
}