Dra*_*ron 0 c# list unity-game-engine
我对C#很新,并试图找出如何从列表中调用函数.我认为List会完成我需要的工作.我可以将我的函数放入列表中,但我似乎无法实际调用它们.
首先我尝试了这个:
List<Action> randEvent = new List<Action>();
void Test()
{
randEvent.Add(Test2);
Invoke(randEvent(0), 0f);
}
void Test2()
{
print("This is a test of the random event system");
}
Run Code Online (Sandbox Code Playgroud)
然后这个
List<Action> randEvent = new List<Action>();
void Test()
{
randEvent.Add(Test2);
randEvent(0);
}
void Test2()
{
print("This is a test of the random event system");
}
Run Code Online (Sandbox Code Playgroud)
但都不起作用.我究竟做错了什么?这甚至可能吗?我想这样做的原因基本上就是我有100个函数,我希望我的程序在调用另一个函数时随机选择.
任何解决方案都值得赞赏,但请记住,我对C#和代码仍然很新.提前致谢.
在C#/ .NET中,不同的方法签名具有代表它们的不同委托类型.Action表示不带参数且不返回任何值的函数,例如void Foo().如果要表示的函数采用float参数并且不返回任何内容,则需要使用Action<float>.具有返回值的函数用Func类型族(Func<T>,Func<T1, T2>...)表示.
你只能把一种代表放在一个List<T>,所以你不能混合Actions和Action<float>s.
要从C#中的列表中获取项目,请使用[n].喜欢
List<Action> actions = new List<Action>();
actions.Add(Foo);
Action a = actions[0];
Run Code Online (Sandbox Code Playgroud)
要在C#中调用委托实例,请Invoke在其上调用方法,或者只使用()哪个是调用的简写Invoke.对于Action,Invoke取0个参数,因为Action<T>它需要一个T参数,等等.
所以对于你的整个例子:
List<Action> actions = new List<Action>();
void Test()
{
actions.Add(PrintStuff);
actions[0]();
//or
actions[0].Invoke();
//or
foreach (var a in actions) a();
}
void PrintStuff()
{
print("This is a test of the random event system");
}
Run Code Online (Sandbox Code Playgroud)