Unity AssetStoreまとめ

アセットストア日替わりタイムセールの記事を書いていきます。

Easy Threading メインスレッドの停止管理を行い反応性の高いゲームにするスクリプト

f:id:assetsale:20170125004303j:plain

f:id:assetsale:20170125004301j:plain

今日のアセット

Easy Threading

$21.60 => $16.20    25%OFF

 

重たくないゲームを作るなら、メインスレッドを使っていないときに処理を停止にすることですが、そのままだとブロックされてしまうから管理が必要。

その管理として、オペレーションのいくつかをバッググラウンドで実行するスクリプトです。

 

 本当に反応性の高いUnityゲームを作るには主要なスレッドで長時間のオペレーションを処理せず、更には主要スレッドがブロックされないように管理しなくてはいけません。これを実現するにはオペレーションの幾つかをバックグラウンドプロセスとして実行する必要があります。

 

↑サクッと動くベストなメインスレッドにしてくれるアセットです。

 

しかしUnityのコールーチンは必ず主要スレッドで処理されます

つまり、背景プロセスとしてスレッドを実行する時にUnityのオブジェクトを操作したければ短時間とは言え主要スレッドに戻る必要が生じます。

しかしこのパッケージを利用すれば操作は簡単、ただ以下の行を追加するだけです:
Task.RunInMainThread(SomeFunction);
SomeFunctionは必ず主要スレッドにて実行されます

 

コルーチンはメインスレッド内で処理されるため、それを特に力を入れてるみたいです。

たった1行追加するだけだから、既存のコルーチンもそもまま変更しやすい作りになっています。

 

コルーチンとは

Unity - マニュアル: コルーチン

↑を見て頂ければ理解しやすいと思いますが、わりとざっくり使い方を書きます。

 

1フレーム置きに実行させる

関数名の頭に「IEnumerator」を付けて「yield return null;」でフレームの間隔を開けてフレーム単位でループを回す。

 

IEnumerator Fade() {

    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null; // ここで1フレーム待機させる
} }

IEnumeratorのFade()を実行するには、StartCoroutineで関数名を引数で指定します。

void Start(){
StartCoroutine("Fade");
}

 

時間指定して遅延させる事も可能です。「WaitForSeconds」を用いる。

yield return new WaitForSeconds(.1f);

 

Unity 5.3.4 以降のバージョンが必要
複数のスレッドとも簡単に使えます:

ドキュメンテーション

フォーラムのスレッド(サンプルとサポート)

本当に反応性の高いUnityゲームを作るには主要なスレッドで長時間のオペレーションを処理せず、更には主要スレッドがブロックされないように管理しなくてはいけません。これを実現するにはオペレーションの幾つかをバックグラウンドプロセスとして実行する必要があります。

しかしUnityのコールーチンは必ず主要スレッドで処理されます

つまり、背景プロセスとしてスレッドを実行する時にUnityのオブジェクトを操作したければ短時間とは言え主要スレッドに戻る必要が生じます。

しかしこのパッケージを利用すれば操作は簡単、ただ以下の行を追加するだけです:
Task.RunInMainThread(SomeFunction);
SomeFunctionは必ず主要スレッドにて実行されます

もちろんラムダ式を使うこともできます:
Task.RunInMainThread(()=>
{
//このコードは主要スレッドで実行されます
});


本アセットを使えばスレッドの管理と処理を心地よく行えます:

新規スレッドを作成するには;
Task.Run (DoSomeWorkOnABackgroundThread);

値を返すスレッドを作成するには(この例では整数):
Task<int>.Run (CalculateSomeIntegerInTheBackground),

当然この整数を受け取る必要がありますので:
Task<int>.Run (CalculateSomeIntegerInTheBackground).ContinueWith(ThisFunctionReceivesTheIntegerAsParameter);

またはその整数をプレイヤーに表示する必要がある場合は(整数を受け取る関数は必ず主要スレッドで実行する必要があります):
Task<int>.Run (CalculateSomeIntegerInTheBackground).ContinueInMainThreadWith(ThisFunctionReceivesTheIntegerAsParameter);


これらは本パッケージの基礎中の基礎となる機能です。

本パッケージは.NETのSystem.Threading.Tasksネームスペースを再導入し、拡張します。

Taskというクラスを追加することでこのネームスペースはスレッド管理を手助けします。 タスクは非同期オペレーションを表します。通常タスクは非同期オペレーションから返されものであり、そのタスクの結果をさらに処理することが可能です。
タスクは作業を表し、実行個所は関係ないので特定のスレッドモデルに依存していません。 コールバックやイベントモデルなどの他の非同期プログラミング方法に比べてタスクは幾つかの利点があります。

詳細はParseのウェブサイトに記載されています。

以下のプラットフォームでテスト済み:スタンドアロンビルド、Web Player、iOSおよびAndroid


完全なソースコードと多数のサンプルも付いてきます。このアセットは自分のプロジェクトにも使っているので常に改良と拡張していきます。

コメント、疑問点、または機能のリクエストがある場合または単にマルチスレッド処理を導入するのにサポートが必要な場合はフォーラムスレッドでご報告ください。

 

f:id:assetsale:20170125005703j:plain

f:id:assetsale:20170125005705j:plain

f:id:assetsale:20170125005707j:plain

f:id:assetsale:20170125005709j:plain

f:id:assetsale:20170125005712j:plain

 

本当に久々にプログラミング系のアセットが来ました。

無駄の無い快適なメインスレッドを体験してみてはいかがでしょうか。

(短時間で見て書いたので、内容が間違ってましたら申し訳御座いません)