UniTask
https://github.com/Cysharp/UniTask
neue cc - UniTask - Unity + async/awaitの完全でハイパフォーマンスな統合
async/awaitはC#の機能由来で、Unity上での実装は性能が弱いらしい
Unityで同等の事がしたいならUniTaskがおすすめされてる
こっちの方が分かりやすい
UniTask入門 | Unity Learning Materials
UnityWebRequestのasync化 よく使いそう
code:cs
using UniRx.Async; //必要
using UnityEngine;
using UnityEngine.Networking;
public class Sample3 : MonoBehaviour
{
async void Start()
{
var uri =
"https://2.bp.blogspot.com/-tcLjNKJqOIQ/WkXHUuSC4qI/AAAAAAABJX0/ArQTS8DS9SEOJI4Mb5tvZg4GXuoED8iIQCLcBGAs/s800/otaku_winter.png";
//テクスチャをダウンロード
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(); としないと警告が出る
var _ = hoge();って書き方でもよい(discards構文)