Unityに関連する記事です

 前回に引き続き、コルーチンのメソッドと同じ非同期処理である UniTask を利用した非同期処理の実装例です。



子クラスの作成


 こちらも今まで作成した子クラスは利用可能ですので、現在の処理に追記し、
メソッドの実行方法を、コルーチンメソッドの場合と UniTask による場合の両方を記載します。

 親クラスとして GameEventBase クラスを継承しているので、この子クラス自体にも MonoBehaviour クラスの機能を実装出来ます。

 親クラスにて定義している仮想(virtual)メソッドを override しての子クラスにて利用する場合、
修飾子は同じ修飾子で宣言します。今回であれば、親クラスの ExecuteEventCoroutine メソッドを実装しているため、
同じ public 修飾子にて宣言しています。

 この ExecuteEventAsync メソッドは IGameEvent インターフェース内で定義されているメソッドであり、
親クラスである GameEventBase 内で実装されています。今回は ExecuteEventAsync メソッドを仮想(virtual)メソッドとして作成していますので、
今までのコルーチンの ExecuteEventCoroutine メソッドと同じように各子クラスでオーバーライドして実装し、振る舞いを変えることが出来ます。


会話イベント用


<= クリックすると開きます。


 記述の方法が異なりますが、処理の内容自体は同じです。

 またコルーチンのメソッドと違い、UniTask には戻り値の設定ができます。


命令を受ける側の機能の作成


 この部分の処理の流れもいままでと同じです。
ファミコンであれば、ソフトの種類は知らないものの、ファミコンのソフトであれば起動はするというイメージです。
そのため、このクラスのアタッチ先も同じです。

 ただし、実行する変数の型が GameEventBase クラスではなく、IGameEvent 型のインターフェースであれば実行できるように処理を追加してます。
それ以外は同じで、GameEventHandler クラスでは実行する GameEvent の種類は特定しません。
今までと同じように、今回は ExecuteEventAsync メソッドの振る舞いを変えて実行させます。

 UniTask を利用するため、および、前回インポートした Serializable Interface アセットを利用するため、using に3つの宣言を追加します。


<= クリックすると開きます。


 すでに GameEventHandler クラスがゲームオブジェクトにアタッチされていると思いますので、インスペクターを確認してください。
SerializableInterface<IGameEvent> 型で宣言した GameEventInterface 配列変数がインスペクターに表示されるようになります。


インスペクター画像



 この部分に、今までアサインしていた GameEventBase の代わりに IGameEvent インターフェースを実装しているクラスをアサインしてイベントを実行させます。

 処理の実行内容としては同じ流れですが、実行するまでの処理の記述方法が変わる、という形になります。


UniTask のキャンセル処理


 以前にもお伝えしているように、UniTask (async / await)による非同期処理はゲームオブジェクトに紐づいていません。
非同期処理の実行にゲームオブジェクトが破棄されたとしても、非同期処理自体は停止せず、動き続けます。
よって、UniTask を利用した非同期処理においては、ゲームオブジェクトの破棄のタイミングなどに非同期処理を停止させる処理を施しておく必要があります。

 いくつか方法が用意されていますが、ゲームオブジェクトの破棄のタイミングに紐づいているキャンセルの機能も用意されています。
GetCancellationTokenOnDestroy メソッドがその機能にあたります。このメソッドを実行することでキャンセル処理用の CancellationToken が作成されます。
何回か利用する場合には変数に代入しておき、各非同期処理の実行タイミングで引数として CancellationToken を渡すようにしてください。

 この GetCancellationTokenOnDestroy で作成された CancellationToken は自動的にゲームオブジェクトの破棄のタイミングに紐づいているため、
OnDestroy メソッドなどで手動で非同期処理の停止処理を記述しなくても、ゲームオブジェクトの破棄と同時に非同期処理を停止してくれる機能です。


 // NPC の MonoBehaviour に紐づくキャンセルトークン作成
  var token = this.GetCancellationTokenOnDestroy();

 非同期処理を実行する場合には、必ず CancellationToken を設定するようにしてください。


参考サイト
Light11 様
【Unity】UniTaskのキャンセル処理まとめ・Taskとの比較



命令を受ける側の設定


 すでに作成済のものがあればそれをそのまま利用してください。
 
 GameEventHandler クラスと、会話イベント用の GameEventNpcTalk クラスを NPC 用のゲームオブジェクトにアタッチします。
子クラスが継承している親クラスはアタッチする必要はなく、子クラスのみをアタッチすれば問題ありません。自動的に親クラスの機能も実装されます。



 GameEventHandler クラスがイベントを管理しますので、GameEventInterface 変数に GameEventNpcTalk クラス(この NPC のゲームオブジェクトそのもの)をアサインしてください。

 これでイベントが発火(実行された)したとき、GameEventInterface 変数に登録されている GameEventNpcTalk クラスのメソッドが実行されます。


インスペクター画像(アサイン前)




インスペクター画像(アサイン後)



命令を実行する側の機能の修正


 すでに作成済でのプレイヤー用のゲームオブジェクトにアタッチされている PlayerController クラス、
あるいは分割した PlayerAction クラスと PlayerManager クラスに非同期用のメソッドを追加します。



 最初に PlayerController クラスの修正です。
コルーチンの非同期処理と同じ機能を持つ、UniTask 用の非同期処理を追加します。

 追加内容が多いので、処理をしっかりと読み解いて流れを把握してください。


PlayerController.cs

<= クリックすると開きます。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます