「Unity/UniRx/値変更検知/ObserveEveryValueChanged配列」の版間の差分
提供: 初心者エンジニアの簡易メモ
細 (Admin がページ「Unity/UniRx/値変更検知/ObserveEveryValueChanged配列EveryUpdate」を「Unity/UniRx/値変更検知/ObserveEveryValueChanged配列」に、リダイレクトを残さずに移動しました) |
|||
行1: | 行1: | ||
+ | ==ObserveEveryValueChangedを配列で検知できる?== | ||
+ | ObserveEveryValueChangedを配列の値変更をできなかった。 | ||
− | == | + | ==Subjectを使った配列内のデータを検知(代替)== |
− | + | ||
<pre> | <pre> | ||
using System.Collections; | using System.Collections; | ||
行7: | 行8: | ||
using UnityEngine; | using UnityEngine; | ||
using UniRx; | using UniRx; | ||
+ | using System; | ||
+ | public class ChangeValueListSubjectScene : MonoBehaviour | ||
+ | { | ||
+ | class SampleClient | ||
+ | { | ||
+ | public List<string> Urls = new List<string>(); | ||
+ | Subject<int> isCompletedsAsObservable; | ||
+ | public IObservable<int> IsCompletedsAsObservable { get => isCompletedsAsObservable; } | ||
+ | public SampleClient() | ||
+ | { | ||
+ | Urls.Add("ttp://example.com"); | ||
+ | Urls.Add("ttp://example2.com"); | ||
+ | isCompletedsAsObservable = new Subject<int>(); | ||
+ | } | ||
+ | public void Request(int id) | ||
+ | { | ||
+ | isCompletedsAsObservable.OnNext(id); | ||
+ | } | ||
+ | } | ||
+ | void Start() | ||
+ | { | ||
+ | int id = 1; | ||
+ | var sampleClient = new SampleClient(); | ||
+ | sampleClient.IsCompletedsAsObservable | ||
+ | .Subscribe(id => { | ||
+ | Debug.Log("Id=" + id + " sampleClient.Url=" + sampleClient.Urls[id]); | ||
+ | }) | ||
+ | .AddTo(gameObject); | ||
+ | |||
+ | // 5秒後に遅延実行 | ||
+ | Observable.Timer(System.TimeSpan.FromSeconds(5)) | ||
+ | .Subscribe(_ => { | ||
+ | sampleClient.Request(id); | ||
+ | }).AddTo(gameObject); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ==EveryUpdateを使った配列内のデータを検知(代替)== | ||
+ | 毎フレームごとに処理されるので危険かも。 | ||
public class ChangeValueListScene : MonoBehaviour | public class ChangeValueListScene : MonoBehaviour | ||
{ | { |
2023年6月23日 (金) 15:41時点における版
ObserveEveryValueChangedを配列で検知できる?
ObserveEveryValueChangedを配列の値変更をできなかった。
Subjectを使った配列内のデータを検知(代替)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UniRx; using System; public class ChangeValueListSubjectScene : MonoBehaviour { class SampleClient { public List<string> Urls = new List<string>(); Subject<int> isCompletedsAsObservable; public IObservable<int> IsCompletedsAsObservable { get => isCompletedsAsObservable; } public SampleClient() { Urls.Add("ttp://example.com"); Urls.Add("ttp://example2.com"); isCompletedsAsObservable = new Subject<int>(); } public void Request(int id) { isCompletedsAsObservable.OnNext(id); } } void Start() { int id = 1; var sampleClient = new SampleClient(); sampleClient.IsCompletedsAsObservable .Subscribe(id => { Debug.Log("Id=" + id + " sampleClient.Url=" + sampleClient.Urls[id]); }) .AddTo(gameObject); // 5秒後に遅延実行 Observable.Timer(System.TimeSpan.FromSeconds(5)) .Subscribe(_ => { sampleClient.Request(id); }).AddTo(gameObject); } }
EveryUpdateを使った配列内のデータを検知(代替)
毎フレームごとに処理されるので危険かも。 public class ChangeValueListScene : MonoBehaviour {
class SampleClient { public List<string> Urls = new List<string>(); public List<bool> IsCompleteds = new List<bool>(); public SampleClient() { Urls.Add("ttp://example.com"); Urls.Add("ttp://example2.com"); IsCompleteds.Add(false); IsCompleteds.Add(false); } public void Request(int id) { IsCompleteds[id] = true; } } void Start() { int id = 0; var sampleClient = new SampleClient(); // 毎フレームごとに処理されるので危険かも。 var observable = Observable.EveryUpdate() .Subscribe(_ => { Debug.Log("IsCompleteds.Count=" + sampleClient.IsCompleteds.Count); int cnt = sampleClient.IsCompleteds.Count; for (int tmpId = 0; tmpId < cnt; tmpId++) { if (!sampleClient.IsCompleteds[tmpId]) continue; Debug.Log("Id=" + tmpId + " sampleClient.Url=" + sampleClient.Urls[tmpId]); sampleClient.IsCompleteds[tmpId] = false; // そのままにすると、連続してここが処理されるので、初期化 } }) .AddTo(gameObject); // 5秒後に遅延実行 Observable.Timer(System.TimeSpan.FromSeconds(5)) .Subscribe(_ => { sampleClient.Request(id); }).AddTo(gameObject); }
} </pre>