Unity(C#) - > Kotlin < - Coroutines

Won*_*lus 4 c# coroutine unity-game-engine kotlin unityscript

我是第一次尝试Kotlin并希望得到一些帮助.

下面的代码是暂停执行当前函数而不休眠执行线程.暂停基于提供的时间量.该函数使用C#语言中的Coroutine支持.(这个支持最近也加入了Kotlin!)

Unity示例

void Start() 
{
    print("Starting " + Time.time);
    StartCoroutine(WaitAndPrint(2.0F));
    print("Before WaitAndPrint Finishes " + Time.time);
}

IEnumerator WaitAndPrint(float waitTime) 
{
    yield return new WaitForSeconds(waitTime);
    print("WaitAndPrint " + Time.time);
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何在Kotlin做类似的事情.有人可以帮我指导正确的方向吗?如果我在发布答案之前弄明白,我会更新我的帖子.

提前致谢!

ean*_*533 6

请记住,协同程序是Kotlin 1.1的一部分,它仍处于EAP(早期访问预览版)中.虽然我个人取得了巨大成功,但API还不稳定,您不应该依赖它在生产中工作.此外,在Kotlin 1.1定稿时,这个答案很可能已经过时了.

  1. 如果您还没有,请按照本博文底部的说明将项目和IDE升级到最新的Kotlin 1.1 EAP里程碑(撰写本文时为M04).
  2. 查找或编写将执行您想要的功能.


private val executor = Executors.newSingleThreadScheduledExecutor {
    Thread(it, "sleep-thread").apply { isDaemon = true }
}

suspend fun sleep(millis: Long): Unit = suspendCoroutine { c ->
    executor.schedule({ c.resume(Unit) }, millis, TimeUnit.MILLISECONDS)
}
Run Code Online (Sandbox Code Playgroud)

有一些重要的警告需要注意.与.NET相比,某些共享中心池在某处可以处理所有可挂起的方法(我甚至不确定在哪里,说实话),上面链接/显示的示例sleep方法将在执行程序池中运行所有继续工作你指定.sleep上面链接的示例方法使用单个线程,这意味着之后发生的所有工作sleep将由单个线程处理.这可能不足以满足您的使用需求.

如果您对Kotlin协程的详细信息有其他疑问,我强烈建议您加入kotlinlang slack中的#coroutines频道.见这里关于加盟细节.