在Unity中有类似Runnable的东西吗?

时间:2016-05-18 21:53:07

标签: c# unity3d lambda

我是Unity的新手,我不太了解它。但是,我过去曾经玩过Java和Objective-C;两种面向对象的基于C语言的编程语言,非常类似于C#Unity使用的。

Objective-C有blocks个变量,允许您在其中存储函数并稍后调用它们。在实践中使用时,您可以使用块作为函数参数和类属性,保存程序员“if”语句,而只是调用块。

该语法的一个例子是(摘自链接的教程网站):

// Declare a block variable
double (^distanceFromRateAndTime)(double rate, double time);

// Create and assign the block
distanceFromRateAndTime = ^double(double rate, double time) {
   return rate * time;
};

// Call the block
double dx = distanceFromRateAndTime(35, 1.5);

NSLog(@"A car driving 35 mph will travel %.2f miles in 1.5 hours.", dx);

Java有Runnable类,它是多线程结构的基础。 (Thread继承自Runnable。)我从previous question我问过这个课程。制作Runnable的方法有两种:Java 8使用lambdas的方法......

Runnable r = () -> { System.out.println("This is just an example!"); }

Java 8使用lambdas作为函数参数...

void someFunction(Runnable r) {
    r.run();
}

// In a method, not sure about the semicolons
someFunction( () -> { System.out.println("This will work, too!"); });

最后,Java 8之前......

Runnable r = Runnable(){
    @Override
    public void run() {
         System.out.println("Yet another example");
    }
}

我的问题是,我将如何在Unity的C#变种中实现这一目标?

2 个答案:

答案 0 :(得分:3)

Action委托是等效的,没有多线程方面。您可以通过指定参数列表'=>'来使用表达式符号,然后是结果表达式,也可以是块。如果返回类型为非void,则可以使用Func。

Action a = () => Console.WriteLine("a");
Action b = x => Console.WriteLine(x);
Action c = (x, y, z) => {
    Console.WriteLine(x);
    Console.WriteLine(y);
    Console.WriteLine(z);
}
Func<int, int, int> add = (x, y) => x + y; // last type is return-type

许多多线程库将接受动作和函数作为参数,包括核心TPL,其中包括Task.RunTask.ForEach等方法。在操作os集合时,PLINQ扩展(Parallel Linq)是一个很好的工具,可以将函数链接在一起。

答案 1 :(得分:2)

在C#中称为Action,您使用lambda运算符=>

Action action = () => Console.WriteLine("This is just an example!");

您也可以传递它:

// single line statement doesn't need to be wrapped in a {code block}, and you don't need the `;` at the end
SomeFunction(() => Console.WriteLine("This will work, too!"));

SomeFunction(() =>
{
    //multiline statements
    Console.WriteLine("This will work, too!");
    Console.WriteLine("This will work, too!x2");
    Console.WriteLine("This will work, too!x3");
});

void SomeFunction(Action action)
{
    action();
}