Unityに関連する記事です

 UniRx の購読処理は非同期処理であるため、変数自体を null にしても停止しません。
明示的に手動で Dispose するか、あるいは AddTo メソッドを利用してゲームオブジェクトやクラスの破棄のタイミングで停止するようにセットする必要があります。

 ここでは、ゲームの途中(ランライム中)における購読の停止処理、および、再購読の実装例を提示します。



購読処理の停止について

購読処理の停止の設計


 Start メソッドなどを利用して Subscribe している処理について、ゲーム内で停止させる場合には、
現在動いている購読処理を停止したいタイミングで Dispose する必要があります。

 性質上、Subscribe している変数の値を null にしたとしても、動いている購読の処理は停止しません
これは UniRx が非同期で実行されている処理になるためであり、ゲームオブジェクトが破棄されても購読が自動停止しないようになっているためです。
そのため、ゲームオブジェクトの破棄のタイミングで購読を停止させる AddTo メソッドが用意されています。
なお、コルーチンの処理の場合は自動的にゲームオブジェクトの破棄に紐づいているため、非同期処理ではありますが、自動的に停止します。
 

IDisposable インターフェース


 AddTo メソッドを利用せず(ゲームオブジェクトやクラスを破棄する以外のタイミングで) Dispose を実行するためには
IDisposable 型の変数を用意しておいて、その中に Subscribe している処理を代入しておきます。

 これは、Subscribe の戻り値が IDisposable 型であることを利用した処理になります。



 IDisposable 型は System の namespace に含まれているインターフェースです。
そのため、利用する場合には using での宣言、あるいは namespace を付けた型の宣言が必要です。

<using での宣言>
  using System;

  IDisposable disposable;

<namespace を付けた型の宣言>
  private System.IDisposable disposable;



 また UniRx には、IDisposable インターフェースを実装している SingleAssigenmentDisposable 型もありますので、そちらも利用できます。
こちらは UniRx に含まれているため、System の宣言不要で利用できます。クラスのため new して(インスタンスを作成して)利用します。

  private SingleAssignmentDisposable disposable = new();



 このようにして、 Subscribe の戻り値の情報(購読している処理)を代入しておくための変数を用意しておくことで、
任意のタイミングでこの変数を使って、Subscribe している購読処理を Dispose し、停止出来ます

 DOTween も同様ですが、一度動き出した非同期処理には後から手を出すことは出来ません。
そのため、メソッド実行時に、処理自体を変数に代入しておく必要があります。
この変数内に、実行している非同期処理が代入されているので、それを後で止めることが出来ます。


参考サイト
Qiita @Marimoiro 様
UniRxのシンプルなサンプル その6(購読の停止)



ObservableEventTrigger における実装例

事前準備


 Canvas 内に Image ゲームオブジェクトを配置、あるいは、Sceneビュー 内に Cube ゲームオブジェクトなどを配置し、
それに ObservableEventTrigger コンポーネントをアタッチしてください。

 どちらを利用しても構いません。

 最初に Canvas の方の例を提示しておきます。


ヒエラルキー画像




Image ゲームオブジェクト インスペクター画像




Game ビュー




 もう1つ例として、Sceneビュー 内にゲームオブジェクトを配置し、こちらを利用するケースです。
注意点としては、ヒエラルキーに EventSystem が必要なことと、MainCamera ゲームオブジェクトに
Physics Raycaster コンポーネントのアタッチが必要になる点です。
 

ヒエラルキー画像




MainCamera ゲームオブジェクト インスペクター画像




Cube ゲームオブジェクト インスペクター画像




Game ビュー




スクリプトの実装例


 作成したゲームオブジェクトをマウスでクリックした際に反応するように
ObservableEventTrigger を利用し、OnPointerDownAsObservable() を Subscribe して購読します。

 Start メソッドで Subscribe した処理について、特定のボタンを押したタイミングで購読処理を停止します。
その後、別の処理を再度購読させるように処理をつなげます。


EventTriggerTest.cs

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


 スクリプトを作成したらセーブします。



 Image ゲームオブジェクト、あるいは Cube ゲームオブジェクトに EventTriggerTest スクリプトをアタッチします。


Image ゲームオブジェクト インスペクター画像




Cube ゲームオブジェクト インスペクター画像



処理の説明


 Dispose するまでの処理の流れ、および、再度、購読の処理を始める際の処理について、処理を読み解き、理解を深めておいてください。

 また、System の IDisposable を利用せず、UniRx のみで停止したい場合には、
SingleAssignmentDisposable 型を利用することでも代用可能です。


<System.Disposable の代用処理>
EventTriggerTest.cs

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


 変数の宣言と処理の代入方法が変わりますが、流れは同じです。
停止命令は IDisposable インターフェースの Dispose メソッドに対して実行するため、同じ命令処理で停止出来ます。



 UniRxの場合、複数の購読の処理をまとめて停止したいときには、IDisposable インターフェースを実装している
CompositeDisposable 型を利用することで停止させることが出来ます。

参考サイト
Qiita @yaegaki 様
UniRx 購読を停止する




実装動画


 Debug.Log メソッドを利用し、処理が正常に動作しているかを確認します。

 Space ボタンを押したタイミングで、最初に購読していた処理が停止し、代わりに別の処理が購読されるようになっています。


<確認動画 Image ゲームオブジェクトのケース>
動画ファイルへのリンク


<確認動画◆Cube ゲームオブジェクトのケース>
動画ファイルへのリンク


<Console ビュー画像>




 以上になります。
Subscribe による購読処理であれば、購読元になっている型は違っても、同じように停止・再行動させることが可能です。

 応用方法を考えてみてください。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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