本例注意的地方:
- 异步方法有返回值,为UniTaskVoid
- 委托应该用Func,因为有返回值
- 两种实现方法:
? ? ? ? ?委托+普通方法+后续初始化绑定
? ? ? ? ?委托+匿名方法+直接初始化绑定
用到的包:UniTask
?
ing System.Collections; using System.Collections.Generic; using UnityEngine; using Cysharp.Threading.Tasks; using System;
public class UnitaskTest : MonoBehaviour { ? ? public static Func<UniTaskVoid> MyFunc;
? ? private async UniTaskVoid MyAction() ? ? { ? ? ? ? Debug.Log($"++++++++++++++++++++++++++执行时间:{Time.realtimeSinceStartup}"); ? ? ? ? await UniTask.Delay(TimeSpan.FromSeconds(1.0)); ? ? ? ? Debug.Log($"++++++++++++++++++++++++++执行时间:{Time.realtimeSinceStartup}"); ? ? }
? ? private void Awake() ? ? { ? ? ? ? MyFunc = MyAction; ? ? }
? ? // Start is called before the first frame update ? ? void Start() ? ? { ? ? ? ?? ? ? }
? ? // Update is called once per frame ? ? void Update() ? ? { ? ? ? ? if (Input.GetKeyDown(KeyCode.Space)) ? ? ? ? { ? ? ? ? ? ? MyFunc(); ? ? ? ? } ? ? } }
一种更简洁的写法:委托 = 匿名方法,注意关键字【async】的位置
public static Func<UniTaskVoid> MyFunc = async () =>
{
Debug.Log($"++++++++++++++++++++++++++执行时间:{Time.realtimeSinceStartup}");
await UniTask.Delay(TimeSpan.FromSeconds(1.0));
Debug.Log($"++++++++++++++++++++++++++执行时间:{Time.realtimeSinceStartup}");
};
全部代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cysharp.Threading.Tasks;
using System;
public class UnitaskTest : MonoBehaviour
{
public static Func<UniTaskVoid> MyFunc = async () =>
{
Debug.Log($"++++++++++++++++++++++++++执行时间:{Time.realtimeSinceStartup}");
await UniTask.Delay(TimeSpan.FromSeconds(1.0));
Debug.Log($"++++++++++++++++++++++++++执行时间:{Time.realtimeSinceStartup}");
};
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
MyFunc();
}
}
}
以上代码测试通过:vs2019 + Unity2020.3
|