目录
代码:
前提:
全部功能的实现都基于Unitask插件的帮助,如无此插件,可在我的分享中下载使用。
引入命名空间 using Cysharp.Threading.Tasks;
布局:
代码:
public List<Button> BranchButtons = new ();//分支按钮
public List<Button> TestButtons = new();//实验按钮
private int idx;//获取点击任务的索引
private string btnName;//当前索引下的任务的按钮名称
void Start()
{
//定义方法
Func <UniTaskVoid> Branch = async () =>
{
//---任务1---
var list1 = new List<UniTask>();//局部的任务列表
BranchButtons.ForEach(x =>
{
list1.Add(x.OnClickAsync());//添加按钮的点击事件
});
idx = await UniTask.WhenAny(list1);//获取点击按钮的索引
btnName = BranchButtons[idx].name;//通过索引返回名称
Debug.Log($"idx={idx},name={btnName}");
await DoThings();//分支按钮的事件
await TestButtons.First(x=>x.name=="结束分支").OnClickAsync();//跳出分支后结束的按钮点击
Debug.Log("over");
//---任务2---
//可用方法1:再创建一个局部变量的列表存储任务,亦可实现
//var list2 = new List<UniTask>();//局部的任务列表
//BranchButtons.ForEach(x =>
//{
// list2.Add(x.OnClickAsync());//添加按钮的点击事件
//});
//idx = await UniTask.WhenAny(list2);//获取点击按钮的索引
//可用方法2:将list1清空后,再重新存储一次
list1.Clear();
BranchButtons.ForEach(x =>
{
list1.Add(x.OnClickAsync());//添加按钮的点击事件
});
idx = await UniTask.WhenAny(list1);//获取点击按钮的索引
btnName = BranchButtons[idx].name;//通过索引返回名称
Debug.Log($"idx={idx},name={btnName}");
await DoThings();//分支按钮的事件
await TestButtons.First(x => x.name == "结束分支").OnClickAsync();//跳出分支后结束的按钮点击
Debug.Log("over");
};
Branch();
}
/// <summary>
/// 分支的主要事件
/// </summary>
/// <returns></returns>
async UniTask DoThings()
{
switch (btnName)
{
case "左分支":
await TestButtons.First(x => x.name == "左分支-1").OnClickAsync();
Debug.Log("左分支-1");
await TestButtons.First(x => x.name == "左分支-2").OnClickAsync();
Debug.Log("左分支-2");
break;
case "右分支":
await TestButtons.First(x => x.name == "右分支-1").OnClickAsync();
Debug.Log("右分支-1");
await TestButtons.First(x => x.name == "右分支-2").OnClickAsync();
Debug.Log("右分支-2");
break;
}
}
说明:
目前通过异步实现两支分支的事件分布执行,执行结束后可以重新选择分支继续执行,如果需要添加分支,在主方法中添加switch的情况及按钮的添加即可。