リソース読み込み終わったらチョメチョメしたいをUniTaskとUniRxで
Unity開発者ギルドで、何か読むのにオススメのコードを募集したら、かめふぃさんのコードをご紹介いただきました。
github.com
色々と学ぶところが多かったのですが、今日はそのうちの1つを忘れないようにメモ。
リソース読み込み終わったらチョメチョメしたいっていうのをUniTaskとUniRxで良い感じに書かれていたので、自分も真似して書いてみました。
using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; //Icon名を渡すと、Resourcesから読み込んで非同期で返すクラス public class IconProvider : IDisposable { private Dictionary<string, Sprite> _cache = new Dictionary<string, Sprite>(); public async UniTask<Sprite> GetIcon(string name) { //キャッシュにあったらキャッシュの方を使う if (_cache.ContainsKey(name)) { return _cache[name]; } _cache[name] = await Resources.LoadAsync<Sprite>("Sprites/Icons/" + name) as Sprite; Debug.Assert(_cache[name] != null);//nullは許さない return _cache[name]; } public void Dispose() { _cache = null; } }
using UniRx; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UI; //アイコンを読み込んでImageに挿し込むテスト public class IconProviderTest : MonoBehaviour { [SerializeField] private string iconName; private readonly IconProvider _iconProvider = new IconProvider(); private Image _image; void Start() { _image = GetComponent<Image>(); LoadIcon(); } [ContextMenu("LoadIcon")] void LoadIcon() { _iconProvider.GetIcon(iconName) .ToObservable() .Take(1) .Subscribe(sprite => { _image.sprite = sprite; }); } }
ポイントとしては、GetIconで返ってきたUniTaskをToObservableしているところ。
こんな事ができるんですね〜。
Subscribeすると、GetIconの処理が終わったタイミングで購読した処理を走らせてくれるみたいです。
すごい!
P.S
これだったら、ContinueWithで良いんじゃない?っていうご指摘を受けました。
たしかに...
_iconProvider.GetIcon(iconName) .ContinueWith(sprite => { _image.sprite = sprite; });
これでいけますね。Observableを返せて嬉しいのは、もっと細かくタイミングを制御したいときですかね〜。