【发布时间】:2021-08-28 19:52:23
【问题描述】:
我正在尝试在 C# 和 Unity 中使用 async、await 和 Tasks 来环绕我的大脑。这是场景:
- 用户单击按钮。
- 其脚本(例如:
MyScene.ButtonOnClick())会生成一个(自定义)对话框并输入等待用户响应的模式。 - 然后用户通过单击三个按钮之一从三个选项(例如:
enum DBResponse { Yes, No, Cancel })中进行选择。 - 结果返回到原始按钮点击后的脚本。
- 原始脚本使用响应继续执行代码。
似乎async、await 和Task<TResult>(即"Task-based Asynchronous Pattern", or TAP)将是这个问题的现代答案,而不是使用事件和侦听器或 Unity 的协程,但是只有我能找到的例子与计算量大的例程或读/写有关,而不是用户输入。
我在这里尝试使用错误的工具吗?如果没有,那么我可以在三个按钮的 OnClick() 方法中添加什么来让用户对原始脚本的响应?我正在努力标记一个正在进行的异步,即有一个更新并且它已经完全可以继续进行(这听起来很像监听一个事件,这对我来说也是一个弱点)。
在早期,我会使用静态事件管理器以及一系列侦听器和调用器作为触发器。最近,我使用了一个协程,但因为它没有返回值,所以我将响应存储为公共静态值,这似乎非常错误。
这似乎是一个如此简单而根本的问题,但我还没有能够破解它。我有一种感觉,如果这个是正确的工具,那么我缺少Task的方法和属性的一些基本用法。
额外阅读的指针会很有帮助!
【问题讨论】:
-
您的“等待模式”具体涉及什么?
-
另外,我注意到 Unity 有自己的特点 w.r.t.协程(例如,多年来一直 (ab) 使用
yield return+IEnumerable<T>协程,这不是完全它的用途) - 所以我想知道这是否也会让你失望关闭。 -
我重新打开了这个问题,因为标记的欺骗不适用于 Unity,并且 Unity 与普通 .NET 环境不同足以证明它自己的问题。
-
@Dai Holding 模式仅仅意味着阻止一个方法(例如原始的 ButtonOnClick() 方法)向前移动,直到确定结果。目前,它调用 StartCoroutine(WaitForThingToFinishThenRunThis(TheRestOfTheOperation))。
-
你能用
StartCoroutine发布一个完整的例子吗?另外,要确认一下,您是在问什么时候专门为 Unity 编写代码,还是笼统地问?