UniTask
Unityで同等の事がしたいならUniTaskがおすすめされてる
こっちの方が分かりやすい
code:cs
using UniRx.Async; //必要
using UnityEngine;
using UnityEngine.Networking;
public class Sample3 : MonoBehaviour
{
async void Start()
{
var uri =
//テクスチャをダウンロード
var texture = await DownloadTexture(uri);
// テクスチャセット
gameObject.GetComponent<Renderer>().material.mainTexture = texture;
}
// テクスチャをダウンロードする
async UniTask<Texture> DownloadTexture(string uri)
{
var r = UnityWebRequestTexture.GetTexture(uri); // 適当に画像のURL
await r.SendWebRequest(); // UnityWebRequestをawaitできる
return DownloadHandlerTexture.GetContent(r);
}
}
独自のコールバックイベントをasync/await化
code:cs
// Androidでカメラの権限をもらう例
public class Sample : MonoBehaviour {
Action<bool> m_OnPermit;
// 独自のコールバックイベント
void RequestPermission(Action<bool>onPermit){
m_OnPermit = onPermit;
// 権限リクエスト
UnityEngine.Android.Permission.RequestUserPermission(
UnityEngine.Android.Permission.Camera
);
}
void OnApplicationFocus(bool hasFocus)
{
if (!onFocus) return; // フォーカスが戻るまで待機
m_OnPermit?.Invoke(UnityEngine.Android.Permission.HasUserAuthorizedPermission(
UnityEngine.Android.Permission.Camera
));
m_OnPermit = null;
}
// RequestPermissionをasync/await化
public UniTask<bool> AsyncRequestPermission(){
var utc = new UniTaskCompletionSource<bool>();
RequestPermission((hasPermission)=>{
utc.TrySetResult(hasPermission);
});
return utc.Task;
}
}
戻り値の無い非同期メソッド
async UniTask hoge()
await hoge()
await書きたくない(投げっぱなしにしたい)
hoge().Forget()
Forget()書きたくない(同期メソッドと同一視したい、ボタンのイベントハンドラで非同期したい)
void hoge() { UniTask.Void(async () => {/* do something */} );
戻り値のある非同期メソッド
async UniTask<bool> fuga()
var ret = await fuga()
Start()等のMonobehaviourイベントで非同期メソッドが使いたい
async UniTaskVoid Start()
UniTaskVoid
いまいち何なのか理解できてない
await出来なくしてくれる
使うときは hoge().Forget(); としないと警告が出る