Unityに関連する記事です

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


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


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

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



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

 ・UniRX の基本動作◆ AddTo メソッドー



6.クラス間の依存関係の見直し ーGameManager クラスと CharaDetail クラスー

1.設計


 いままで実装してきた手順と同じです。
 教材の処理を見る前に、依存関係を解消するにはどうすればいいのか、
自分で設計を考えて、ReactivePropery を利用した処理の設計に変更してみてください。



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

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

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

 GameManager クラスは、CharaDetail クラスをプレファブの情報として管理しており、インスタンスする処理を担当しています。
その際に、CharaDetail クラスの SetUpCharaDetail メソッドを実行し、GameManager クラスの情報を提供しています。

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

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



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

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

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


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


 GameManager クラスの情報を利用しない状態で今までと同じ挙動になるように、クラスの内容を設定しなおして、リファクタリングを行います。

 新しく ReactivePropery を追加し、この情報を GameManager クラス側で監視して、
値の更新に合わせて GameManager クラス側で自動的に処理を実行するようにします。

 現在は SetUpCharaDetail メソッドの引数で GameManager クラスと TapPointDetail クラスの情報を受け取って、
GameManager クラスと CharaDetail クラスとはお互いに知っている状態になっていましたが、それを解消します。
TapPointDetail クラスの情報もその GameManager クラスへの命令の際に利用していた情報であるため、クラスと実行命令のどちらも不要になります。

 また新しくコールバックのメソッドである OnDestroy メソッドを追加しています。
このメソッドは MonoBehaviour クラスが持っているメソッドの1つで、クラスがアタッチされているゲームオブジェクトが破壊された際に自動的に実行されるメソッドです。

参考サイト
Unity公式スクリプトリファレンス
MonoBehaviour.OnDestroy
https://docs.unity3d.com/ja/current/ScriptReferenc...

 このメソッドの実行タイミングで自動的に ReactivePropery を Dispose する機能が UniRX にはあるため、
その機能を GameManager クラス側で実行できるようにするために OnDestroy メソッドを追加しています。


CharaDetail.cs

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


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


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


 CharaDetail クラスに追加した ReactivePropery の監視処理を追加します。
GameManager クラス側で監視をすることにより、CharaDetail クラス側は GameManager クラスを知る必要がなくなっています

 ここでも監視処理は一度実行すれば、あとはずっと監視状態になります。
その後、CharaDetail クラスのアタッチされているゲームオブジェクトが破棄されるタイミングで
CharaDetailクラスに追加した OnDestroy メソッドが実行されて、ReactivePropery も同タイミングで破棄するようにしています。

 監視状態は発行元であるゲームオブジェクトがなくなっても自動的には終了しません
そのため、実行できない処理をずっと監視する状態となって残ってしまいますので、必ず適切なタイミングで ReactivePropery を Dispose して破棄するようにします。


GameManager.cs

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


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


4.<UniRX の基本動作◆ AddTo メソッドー>


 あとから Dispose を呼び出すように登録しておくことができるメソッドです。
AddTo メソッドの対象先として登録できるのは以下の2つのタイミングになります。

 1.GameObject の OnDestroy メソッドの実行タイミング
 2.CompositeDisposable の Dispose の実行タイミング

 今回は CharaDetail クラスに OnDestroy メソッドを追加し、このメソッドの実行タイミングで
ReactivePropery の Dispose を行うように設計しています。

  // CharaDetail クラスのReactivePropery を監視する
  chara.ButtonReactiveProperty.Where(x => x == true).Subscribe(_ => ResultJobs(tapPointDetail)).AddTo(chara.gameObject);

 適切なタイミングで Dispose しておかないと、ゲームオブジェクトがなくなっても処理自体は動き続けてしまうため、注意してください。


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


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


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

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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