Unityに関連する記事です

 分割したクラス内にあるコルーチンメソッドによる非同期処理についてリファクタリングを行います。

 前段階の学習としまして、下記の記事の学習をお願い致します。

   => 肥大化したクラス内の処理を、役割に応じたクラスを複数作成して分割する実装例

 またこの記事はリファクタリングが目的であるため、UniTask 自体の詳細な説明は含まれていません
事前に別の記事や他のサイトの記事を参考して事前学習をお願い致します。



設計


 コルーチンの実行命令である StartCoroutine メソッドは MonoBehaviourを継承しているクラスでのみ利用できます。
そのためコルーチンは、ゲームオブジェクトの生存期間に依存する非同期処理になります。
何故ならコルーチンメソッドのあるスクリプトはゲームオブジェクトにアタッチして利用することになりますので、
そのアタッチしているゲームオブジェクトが破棄されたタイミングでコルーチンメソッドの処理も停止します。
 
 Unity では UniTask により、async / await による非同期処理が実装可能です。
こちらはゲームオブジェクトの生存期間には依存しませんが、ゲームオブジェクトが破棄されても自動的に処理は停止しません。
正しい書き方を理解してロジックを組むことが出来れば、コルーチンよりも柔軟な処理が記述できます。

 どちらの処理の書き方も覚えておくことにより、ソースコードの記述の幅が広がります。
今回は前回の肥大化しているクラスの分割をベースに、コルーチンの処理を UniTask を利用した非同期処理に変更します。


分割前のクラス


 下記は今回のリファクタリングで利用するソースコードです。
以前の学習で分割する際に利用したソースコードと同じものを利用します。


PlayerController.cs

<= クリックしたら開きます。



クラス分割による役割の考え方


 これも前段階と同じ考え方ですので、ここでは割愛します。

 学習としては、分割した各クラス内にあるコルーチンメソッドを UniTask を利用した async / await の処理にリファクタリングを行います。


親クラスを作成する


 このクラスには変更はありません。


<= クリックしたら開きます。



子クラスを作成する

1.PlayerMove.cs


 このクラスには変更はありません。

<= クリックしたら開きます。



2.PlayerAnimation.cs


 このクラスには変更はありません。


<= クリックしたら開きます。



3.PlayerAction.cs


 このクラスにはコルーチンを利用したメソッドがありますので、
新しいメソッドを作成した上でリファクタリングを行って非同期処理を置き換えます。


<= クリックしたら開きます。


 async / await による非同期処理用のメソッドは、戻り値を UniTask 型にします。
コルーチンメソッドと違い、戻り値には任意の情報を持たせることが出来ます。UniTask<int> のように書けます。

 加えて、メソッドの定義には async キーワードを付与します。
メソッド名はわかりやすいように 〜 Async で終わるようにし、非同期用のメソッドであることがわかるように命名します。
今回であれば PlayActionAsync としています。

 await キーワードを先頭につけることで、非同期処理を実行できます。
これは yield return 付の StartCoroutine と同じ役割になりますので、非同期処理が完了するまで次の処理には移行しません

 コルーチンメソッドによる非同期処理は実行してすぐに次の処理に移行しましたが、
async / await による非同期処理は待機することが前提になっている非同期処理になります。


4.EventChecker.cs


 このクラスは変更ありません。


<= クリックしたら開きます。



5.PlayerManager.cs


 このクラスには非同期処理がたくさんありますので、大きな変更があります。


<= クリックしたら開きます。



Forget メソッド


 非同期処理以外のメソッド内で await のない非同期処理を実行すると警告が表示されます。
その場合には、Forget メソッドを追加することで、待機のない非同期処理(従来のコルーチンメソッド)として実行することが可能になります。


Update メソッド内
  if (Input.GetButtonDown("Action")) {

      // プレイヤーの向いている方向にあるオブジェクトに対してアクションできるか判定
      PrepareJedgeAction().Forget();
  }

 Forget メソッドを追加している処理は待機せずに、次の処理が実行されます。


ゲームを実行して動作を確認する


 スクリプトのアタッチ先などは変わりませんので、ソースコードの修正が終了したらリファクタリングは完成です。

 どの部分を修正しているのか、処理の見直しをした上で、いままでと同じように処理が動作するかを確認してください。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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