C# 在统一中是否有类似于Runnable的东西?

C# 在统一中是否有类似于Runnable的东西?,c#,unity3d,lambda,C#,Unity3d,Lambda,我对Unity是新手,对它了解不多。然而,我过去一直在玩Java和Objective-C;两种基于C的面向对象编程语言,非常类似于C Unity所使用的 Objective-C中有一些变量,这些变量允许您在其中存储函数,并在以后调用它们。在实践中使用时,可以将块用作函数参数和类属性,从而保存程序员的if语句,而只需调用块 该语法的一个示例可从链接的教程站点中获取: // Declare a block variable double (^distanceFromRateAndTime)(doub

我对Unity是新手,对它了解不多。然而,我过去一直在玩Java和Objective-C;两种基于C的面向对象编程语言,非常类似于C Unity所使用的

Objective-C中有一些变量,这些变量允许您在其中存储函数,并在以后调用它们。在实践中使用时,可以将块用作函数参数和类属性,从而保存程序员的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继承。我从一个我问过的学生那里了解到了这门课。有两种方法使一个可运行的:使用lambdas的Java8方法

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!"); });
最后,在Java8之前

Runnable r = Runnable(){
    @Override
    public void run() {
         System.out.println("Yet another example");
    }
}
我的问题是,我将如何在Unity的C变体中实现这一点?

在C中称为Action,您使用lambda操作符=>:

您还可以将其传递给其他人:

// 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();
}
在C中称为Action,使用lambda运算符=>:

您还可以将其传递给其他人:

// 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();
}

动作委托将是等效的,没有多线程方面。您可以通过指定参数列表、'=>'符号和结果表达式(也可以是块)来使用表达式。如果返回类型为非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

许多多线程库将接受actions和funcs作为参数,包括核心TPL,它包括类似Task.Run和Task.ForEach的方法。在操作操作系统集合时,PLINQ扩展并行Linq是将FUNC链接在一起的一个很好的工具。

操作委托将是等效的,没有多线程特性。您可以通过指定参数列表、'=>'符号和结果表达式(也可以是块)来使用表达式。如果返回类型为非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

许多多线程库将接受actions和funcs作为参数,包括核心TPL,它包括类似Task.Run和Task.ForEach的方法。在操作操作系统集合时,PLINQ扩展并行Linq是将函数链接在一起的一个很好的工具。

Action a==>Console.WriteLinelambda Action;,异步操作Task.Run=>Console.WriteLinethread pooled@谢谢你!我只是想了解一下动作课。我可以在运行的代码周围放一个花括号,并有一个多行语句吗。有一件事,理解Unity是绝对单线程的是至关重要的。没有其他线程,您无法访问任何其他线程。请注意,您可能已经看到了协同程序。它们与线程完全没有任何联系。您可能面临的另一个问题是,在第一段中,您提到了面向对象。认识到Unity绝对不是面向对象的,它是一个ECS系统,这一点至关重要。它没有任何概念,甚至与继承没有多少相似之处,与OO完全无关。关于这一点的文章碰巧,当前用于为Unity GameObects编写行为的编程语言c恰好是一种OO语言。但这无关紧要。他们明天可能会改用Lisp:或其他什么,这不会影响Unity。@JoeBlow解释JavaScript。感谢您的澄清。操作a==>Console.WriteLinelambda操作;,异步操作Task.Run=>Console.WriteLinethread pooled@谢谢你!我只是想了解一下动作课。我可以在运行的代码周围放一个花括号,并有一个多行语句吗。有一件事,理解Unity是绝对单线程的是至关重要的。没有其他线程,您无法访问任何其他线程。请注意,您可能已经看到了协同程序。它们与线程完全没有任何联系。您可能面临的另一个问题是,在第一段中,您提到了面向对象。认识到Unity绝对不是面向对象的,它是一个ECS系统,这一点至关重要。它没有任何概念,甚至与继承没有多少相似之处,与OO完全无关。关于这一点的文章碰巧,当前用于为Unity GameObects编写行为的编程语言c恰好是一种OO语言。但这无关紧要。他们明天可能会改用Lisp:或其他什么,这不会影响Unity。@JoeBlow解释JavaScript。谢谢你的澄清。非常感谢你的澄清!您好@DDPWNAGE虽然您勾选了这个答案,但我必须再次强调,Unity是完全单线程的。你似乎完全走错了方向。没有一个统一的工程师会问你要问的问题,如果这有意义的话。统一没有线索。在统一中绝对没有线状成语。你永远不会用线程和线程来思考
我完全不参与你的工作生活,不一定是真的。只要不调用Unity API,就可以在Unity3D中使用多线程代码,因为Unity API不是线程安全的。非常感谢您的澄清!您好@DDPWNAGE虽然您勾选了这个答案,但我必须再次强调,Unity是完全单线程的。你似乎完全走错了方向。没有一个统一的工程师会问你要问的问题,如果这有意义的话。统一没有线索。在统一中绝对没有线状成语。你永远不会在线程中思考,线程将完全与你的工作生活无关。不一定是真的。只要不调用UnityAPI,就可以在Unity3D中使用多线程代码,因为UnityAPI不是线程安全的。