有什么方法或需要在 Unity3d 中使用线程吗?

Is there any way or need to use threads with Unity3d?

我有一种巨大的误解 - 如何在单独的线程中计算一些繁重的东西,得到结果,然后 "continue main routine"。 我正在开发棋盘游戏,"board checking" 和 "AI thinking" 的任务需要 cpu 困难,所以我试图将计算分开到另一个线程。

我不是 .NET 程序员,主要是 c++,在过去的 4 天里,我在 c sharp 和 unity3d 中阅读了很多关于协程和线程的内容,但现在我脑子里一片混乱,完全失去了任何一种"what to do".

我发现,unity 仍然使用 .NET2,所以不能使用 TPL 或 TPLv3。 我一直在寻找 Foundation Tasks 库 ( https://github.com/NVentimiglia/Unity3d-Foundation/wiki/4)-Unity-Tasks ),但无法理解如何在我的案例中使用它。 我正在看例子,觉得自己很白痴。 我试图自己编写线程和协程的混合,但现在只是把完整的代码弄乱了,没有任何工作结果 =(

任何人都可以举出我的案例的任何简单示例吗:当统一对象在其他线程中进行某些计算时,获取其工作结果并继续 "normal behaviour"。

我找到了混合线程和协程的解决方案。

我不太喜欢 C# 中的线程风格编程,因为返回的结果不是很清楚-代码不是很好。

所以,这是我的解决方案,使用 Foundation.Tasks

想象一下,例如,我们有一些 MonoBehaviour 子项 class,正在执行一些繁重的计算。

UnityTasks 之前的代码

public class ExampleClass : MonoBehaviour {
  public bool MyHeavyCalculator(bool exampleArg)
  {
    //loong and heavy calculations
  }

  public void SomeFunc()
  {
    //and here we get freezing
    if (MyHeavyCalculator(boolArg))
    {
      //unfreeze here
    }
  }
}

代码,使用 Foundation 的 UnityTask

//in my case, heavy calculations are static in another class
public static class Calculator
{
  public static bool DoHeavy(bool exampleArg)
  {
    //loong and heavy calculations
  }

}

public class ExampleClass : MonoBehaviour {

  IEnumerator coroutineSomeFunc()
  {
    bool result = false;
    //code to show "thinkng sign"
    UnityTask t = UnityTask.Run( () => {
      //and no freesing now
      result = Calculator.DoHeavy(myArg);
    });
    yeild return t;
    //code to hide "thinkng sign"
    if (result)
    {
      //continue game flow
    }
  }

  public void SomeFunc()
  {

    StartCoroutine(coroutineSomeFunc());
  }
}

此外,Foundation.Tasks 让我可以轻松地选择策略(协程、后台线程),而且我得到的计算结果没有任何问题,而且我的代码很好且易于理解(恕我直言)