web-dev-qa-db-ja.com

Unity3Dで非同期タスクを実行する方法は?

誰もが非同期タスクを統一して行う方法を知っていますか?私はしばらくそれを探していますが、まだ方法が見つかりませんでした。私は着色ゲームをしようとしていますが、処理に時間がかかる洪水塗りつぶしアルゴリズムがあります。助けてくれてありがとう。

15
makkuzu

Unityのスレッドを使用して、非同期タスクを実行できます。通常、(Unity UIから)切り離されたスレッドを実行して、長時間実行されるプロセスを実行し、結果を確認します(作業スレッドからUnityと対話することはできません)。一般的なアプローチは、Unityメインスレッドによって初期化されるスレッド化ジョブを表すクラスを使用することです。次に、そのクラスの関数でワーカースレッドを開始し、それを実行させます(コルーチンはUnityメインスレッドで実行されるため、実際のスレッドではありません。コルーチンに関する最良の記事は here です)

上記のアプローチの例を次に示します(承認済みの回答を参照)。

http://answers.unity3d.com/questions/357033/unity3d-and-c-coroutines-vs-threading.html

また、同じ効果を実現するUnityGemsパッケージを試すこともできますが、利便性は提供されます(クロージャサポートなど)。

http://unitygems.com/threads/

HTH。ベスト!

10
German

C#スレッドを使用して、非同期を機能させることができます。 here でスレッドの詳細を確認できます。

作業スレッドからUnityとやり取りできないことに注意する必要があります。そのため、作業が終了したら、Unityスレッド内の結果を使用する必要があります。これを行うには、更新を行うMonoBehaviourにフラグを設定するだけで、Updateメソッドでフラグを確認できます。これに似たもの:

void Update()
{
  if( _workDone )
  {
   ...display it
  }
}
5
Radu Diță

Unity 2017のTas​​kでasync awaitを直接使用できるようになりました。詳細 here

3
Steve Vermeulen

coRoutineを使用して、これらを設定し、フレームごとにその一部を実行してコードをタイムスライスします。 共同ルーチン

1
CthulhuJon

私はこの質問が古いことを知っていますが、それでもかなり関連しています。オープンソースフレームワークで独自のソリューションをコーディングしました。興味がある場合は、ここですべての情報を見つけることができます。

http://www.sebaslab.com/svelto-taskrunner-run-serial-and-parallel-asynchronous-tasks-in-unity3d/

マルチスレッドもサポートしています。

0
sebas