ノベルゲームの作り方5 UniTaskで処理を待つ・Unityのasync/awaitで非同期処理をマスターしよう | Unity入門の森 ゲームの作り方

ノベルゲームの作り方5 UniTaskで処理を待つ・Unityのasync/awaitで非同期処理をマスターしよう

Unity ノベルゲームの作り方


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

この講座は恋愛ホラーノベルゲームの作り方講座。今回は第5回目です。

前回はDoTweenを用いたアニメーション処理や画面遷移ユーティリティを作成しました。

前回の記事:

Unityノベルゲームの作り方4 シーン遷移とフェードイン・フェードアウト処理の実装
この講座ではUnityでの基本的なUIの作成方法マスターしながら「恋愛・ホラー風ノベルゲーム」を開発していきます。今回は第4回目です。前回はスプラッシュ画面からタイトルへのシーン遷移処理を通して、基本的なUnity C#コードの書き方を解説...

今回は作成した「UITransition」にUniTaskを使用した非同期・待機処理を実装して、前回作成したUITransitionクラスをより使いやすいプログラムに改造していきます。

前回&今回とシステム開発が多くなっていますが、これらをやっておくことで後々シーン数が多いノベルゲームの作成がとても楽になります。着実に習得していきましょう。


【Line登録者限定のプレゼントもあるよ!】

UniTaskを使用した待機処理の使い方をマスターしよう

UniTaskというのは、C#で使用できる非同期処理の機能「Task」をUnity向けに使いやすくしたものです。

まずは非同期処理というのを簡単に説明します。

非同期処理とは

非同期処理はコルーチンなどと同じようにちょっとわかりづらく、扱いが難しいです。

注意点も多いので、もしどうしてもわからないなと思ったら一旦流れだけ追ってコピペして使用することも考えましょう。

よくプログラミングではいかにコピペを使って短縮するかというのも重要だと言われたりします。後々使っていくうちにわかっていけば問題ありません。まず動かしてみて、数値を変えたりして何をしているか理解を深めていきましょう。

まず非同期の前に「同期処理」というのは、上から順番に処理を行う通常の処理のことを言います。

なので「非同期処理」というのは同期処理ではなく、ある処理の実行が終わらなくても次の処理にいく処理を言います。そしてその完了を「await」という命令で待ったりといったことができます。

直列にしか処理が行えないのが同期処理、並列で処理を行えるのが非同期処理とも言えますね。

この「待つ」処理を実現するためにUniTaskを使用すると思っても構いません。処理の順番が操作できるので便利な反面、プログラムが複雑になりがちなので今回は最低限の範囲で注意しながら使用していきます。

asyncやawaitという記載がある場合は非同期処理になっています。使用しながら少しづづ理解していきましょう。

なぜコルーチンでなくUniTaskがいいかというと、「記述がわかりやすくなる」、「返り値をとれる」、「MonoBehaviourでなくても使える」などの理由があります。

関連記事:Unity C#のIEnumerable・IEnumeratorとコルーチンの使い方・作り方

UniTaskにおいてこれがわかれば十分というものを先に書いておきます。細かいことは実際に使用するときにまた詳しく解説します。

1. Delayを使って遅延処理

await UniTask.Delay( 時間(ms) )

一定時間(int型のms)待機して次の処理へ進む。コルーチンでは「yield return new WaitForSeconds( s )」。

2. WaitUntilを使って特定の条件まで待つ

await UniTask.WaitUntil( () => 条件 )
条件が満たされるまで待機。例えば条件を「isFlag == true」とすれば「isFlag」が「true」になるまで待つ。コルーチンでは「yield return new WaitUntil( 条件 )」。

3. WhenAllを使って複数のUniTaskを全て待機

await UniTask.WhenAll( task1, task2, ・・・ )
または await UniTask.WhenAll( UniTaskのリストや配列 )
UniTaskすべてが終わるまで待機。

 

UITransitionに待機処理を追加

では非同期処理を使用して「遷移が終了するのを待つ」処理を行えるようにUITransionクラスを修正していきます。

少し難しい修正になるのでまずは何をしているか流れの確認だけしてコピペしても大丈夫です。既にある関数の修正、新しい変数の追加、そして関数の形だけまずは作成します。 

一番上「using」の部分に3つ追加があります。

using System.Threading;」:こちらはC#のコードでスレッド関連の機能を使用するためのものです。今回は「CancellationTokenSource」を使用するために用いています。スレッドのキャンセルを制御するためのクラスです。

using UnityEngine.Events;」:「UnityAction」を使用するために追加します。

using Cysharp.Threading.Tasks;」:「UniTask」を使用するために追加します。

そして変数に「CancellationTokenSource」という型で「in」と「out」の二つを用意します。これはキャンセルトークンといって、TaskやUniTaskをキャンセルするために使用します。今回の修正ではまだこれらを用いた具体的な処理は書いていません。

次に「Start()」関数ですが、「async」という記述が追加されています。これは関数内で「await」を使用するために必要なもので非同期処理を行うために書いています。この二つはセットだと覚えてしまいましょう。

そして新しく追加した関数の「await TransitionInWait();」のように実行する関数に「await」を付けることでこの関数の終了を非同期で待ってから、それ以降の処理を行うようになります。今は適当にログを出して確かめています。

この「Start ()」関数の処理はテスト用ですので実装が終わったら削除します。

続いて通常の「TransitionIn()」、「TransitionOut()」の引数に「UnityAction onCompleted = null」と言うものを追加しました。

まずは「UnityAction」ですが、これは処理(関数など)を引数にして実行するための型と思っておけばOKです。これにより関数を実行する側から、指定したタイミングで処理を追加することができます。

そして引数に「= null」としてあると、引数の指定をしない場合にその初期値は「null」となります。

関連記事:UnityC# デリゲートとイベントとUnityActionの使い方

さらに関数内「inSequence」に前回解説した「.SetLink()」の後に追加する形で「.OnComplete()」という処理を追加しました。

<DOTween>
sequence.OnComplete( (引数) => { 処理 } ) : シークエンス(またはDOTween関数)の完了時に処理を実行する

ここでOnComplete()の中に入っている「 () => {} 」の部分は「ラムダ式」と呼ばれる記述方法で、「()」には通常の関数と同じように引数を、「{}」には処理を記載します。今は形で覚えてしまって構いません。

その関数内で「onCompleted?.Invoke()」引数は「onCompleted」を「Invoke()」、つまり実行しています。

UnityAction.Invoke() : UnityActionを実行する

「onCompleted」の後ろの「?」は、その値が「null」じゃなかったら、という意味になります。(if( OnCompleted != null ) と同じ意味)。

つまり全体ではDoTweenのシークエンス処理が完了し、さらにUnityActionが格納されているはずのonCompletedがnullじゃなかったらその処理を実行するという一行になります。

残りの関数は一旦形のみ作成します。トランジションの二つはどちらも「public async UniTask」になっておりここに待機処理を作成します。

OnDestroy()」は非同期とは関係ないのですが、「Start()」関数などと同じようにUnityで用意されているもので、スクリプト内で書いておくと勝手に実行される系の関数です。

名前の通りこのゲームオブジェクトが破棄されたときに自動的に実行されます。

では追加した関数の中身を作成します。 

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

次回に向けて

今回はUniTaskを用いたUI遷移処理を実装しました。また、クラスの継承を通して画面遷移ユーティリティの共通化のための足がかりを構築しました。

今回はまだBaseクラスを作成し継承しただけなので、次回から継承した側に実際の画面遷移処理を追加してゲームで使用できるようにしていきましょう。

次回の記事 : 

ノベルゲームの作り方6 UnityでUIアニメーション dotweenで演出ありシーン遷移を実現する
この記事は「恋愛ホラーノベルゲーム」の作り方講座の第6回です。前回はUITransitionのInとOut処理をUniTaskで非同期処理として実行できるように改造を行いました。さらにViewBase、SceneBaseを作成し、クラスの継...

Unity ノベルゲームの作り方講座へ戻る >>



Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

タイトルとURLをコピーしました