Unityに関連する記事です

 前回に続いて、ReactivePropery を活用した処理の実装を行います。
 
 ここでは GameManager クラスと、TapPointDetail クラスの処理を順番に見直していきます。


<実装動画>
動画ファイルへのリンク


 以下の内容で順番に実装を進めていきます。

発展3 −UniRX (ReactivePropery)を利用した処理の実装◆
5.クラス間の依存関係の見直し◆ GameManager クラスと TapPointDetail クラスー



 新しい学習内容は、以下の通りです。

 ・UniRX のオペレーター機能の実装例◆ DistinctUntilChanged メソッドー



5.クラス間の依存関係の見直し◆ GameManager クラスと TapPointDetail クラスー

1.設計


 GameManager クラスと、その他のクラスとの間の依存関係について考えて、解消できる部分については依存関係を解消して、クラスの独立性を高めます。

 現在の GameManager クラスと TapPointDetail クラスの関係を見ていきます。

<クラス間の依存関係>
 GameManager クラス ⇔ TapPointDetail クラス

 GameManager クラスは、TapPointDetail クラスを List として管理しています。
その際に、TapPointDetail クラスの SetUpTapPointDetail メソッドを実行し、GameManager クラスの情報を提供しています。

 そのためこれは、お互いがお互いを知っており、つながっている、依存している関係であると言えます。
この関係を、下記のように GameManager クラスのみが知っている・つながっている状態に修正します。

<やりたいこと その 
 GameManager クラス → TapPointDetail クラス(GameManager クラスだけが TapPointDetail クラスを知っている)



 今回の実装も前回と同じように考えます。
いままでは依存しあっていたクラスを片方だけが相手のクラスのことを知っている状態に作り変えます。

 まずは TapPointDetail クラスの独立性を高めて、GameManager クラスのことを「知らない」状態にします。
その代わりに、ReactivePropery を準備して、TapPointDetail クラスで発生した状態を外部のクラスに通知できる状態に変えます。

 そして、GameManager クラスでは TapPointDetail クラスの情報を ReactivePropery を通じて知る(監視)するように変更を行います。

 ReactivePropery は、値に変化があった場合に、購読者(GameManager クラス)に対して、通知を発行します。
そのタイミングで、GameManager クラスは予め用意しておいたメソッドを実行する設計です。



 ReactivePropery にはオペレーター機能があるため、実行にあたり、条件式を付与することも出来ます。
通常は値が変わった段階ですぐに Subscribe メソッドが実行されて処理が実行されますが、
Where メソッドを処理と処理の間に用意することにより、「変化した値が、条件式を満たす場合」という制限を付けて実行させることが出来るようになります。


2.TapPointDetail スクリプトを修正する


 using に宣言を追加して、ReactivePropery を利用できるように追加します。

 ReactivePropery は2つ用意します。1つは isJob(IsJob プロパティ) の代わりになるもの、
もう1つは TapPointDetail クラスがアタッチされているゲームオブジェクトをタップした際に判定を行うためのものです。

 GameManager クラスとの依存関係を解消するため、SetUpTapPointDetail メソッドの第1引数で受け取っていた GameManager クラスの情報を削除し、受け取らないようにします。
これで TapPointDetail クラスは GameManager クラスを「知らない」状態になります。

 OnClickTapPointメソッドを修正し、ReactivePropery の値に対して、選択したボタンの種類に応じて、true か false かで代入を行います。
この値の変更が発生するタイミングで、GameManager クラス側に通知が届き、GameManager クラスが自動的に用意してあったイベント(メソッド)を実行しますので
タップに合わせて行き先確認ポップアップが開くようにします。

 IsJob プロパティを利用していた場所を ReactivePropery の同じ役割を持つ変数に変更します。
この値も GameManager クラス側で監視を行うようにしておいて、「お使いの状況」を自動的に GameManager クラス側に通知します。
そのため、お使いの完了に合わせて GameManager クラスのメソッドを実行する処理が不要になります。

 この修正を行うことにより、これらの処理を実行するために用意していた複数の変数も不要になりますので、1つずつ処理の内容を確認してください。


TapPointDetail.cs

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


 スクリプトを修正したらセーブします。



3.GameManager スクリプトを修正する


 TapPointDetail クラスに追加した ReactivePropery の監視処理を追加します。

 ここでも監視処理は一度実行すれば、あとはずっと監視状態になります。
そのため大切なのは、どのタイミングで監視処理を開始するかになります。

 間違えて2回以上監視処理が通るようにしてしまったり、Dispose が何回も必要になるような処理にはならないような設計を考えていく必要があります。

 処理を間違えると、お使い完了の処理が2回以上走ってしまったりするので、ReactivePropery による非同期処理の実装には注意が必要です。

 メソッドの役割を明確にして分業するため、TapPointSetUp メソッドの内容にについて、TapPointDetail クラスの設定を行う処理と、お使いの状況を判定する処理を分離して別メソッド化します。
新しく SetUpJobDatasToTapPointDetails メソッドを作成して、この中で TapPointDetail クラスの設定と ReactivePropery の監視を開始します。
TapPointSetUp メソッドはメソッド名を JudgeCompleteJobs に変更し、TapPointDetail クラスの設定を削除し、お使いの状況を判定する処理のみのメソッドに変更します。


GameManager.cs

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


 スクリプトを修正したらセーブします。


4.<UniRX のオペレーター機能の実装例◆ DistinctUntilChanged メソッドー>


 新しく実装したオペレーターについて説明を行います。

 DistinctUntilChanged メソッドは、入力されたメッセージが直前のものとおなじ値であった場合には、
メッセージの通知を行わないようにするオペレーターです。

 そのため、値の変動が起こった場合にだけ、通知を行うようにできます。

 引数については何も指定しない場合と、引数を指定する方法とがあります。
 
  // TapPointDetail クラスの ButtonReactivePropery を監視して、お使いの開始するタイミングを監視する。値が true になった場合だけ、Subscribe メソッド内の処理を実行する
  tapPointDetailsList[i].ButtonReactiveProperty.DistinctUntilChanged().Where(x => x == true).Subscribe(_ => GenerateJobsConfirmPopUp(tapPointDetail));

 今回のケースでは引数を指定していませんので、メッセージが直前の値と同じであるかどうかは型によるデフォルトの方法で行います。
ButtonReactiveProperty が bool 型であるため、判定を行う直前の値は bool 型になります。

 false => true と ButtonReactiveProperty の値が変化した場合には、DistinctUntilChanged メソッドの部分は通過し、Where オペレーターの処理に移ります。
ですが、falsa => false と ButtonReactiveProperty の値が変化した場合には、DistinctUntilChanged メソッドの部分は通過できないため、そこで処理が終了となります。

 ReactivePropery の初期値と Where オペレーターの判定値が同じような場合には、こういったオペレーターを挟むことで制御を行うといいでしょう。


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


 今回の実装もリファクタリングになりますので、ゲーム上の処理は今までと同じように正常に動作している必要があります。


<実装動画>
動画ファイルへのリンク

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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