Unity(C#) - > Kotlin< - Coroutines

时间:2017-01-07 10:22:12

标签: c# unity3d kotlin unityscript coroutine

我第一次尝试使用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);
}

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

提前致谢!

2 个答案:

答案 0 :(得分:6)

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

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

  3. 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)
    }
    

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

    如果您对Kotlin协程的详细信息有其他疑问,我强烈建议您加入kotlinlang slack中的#coroutines频道。有关加入的详细信息,请参阅here

答案 1 :(得分:2)

以下几乎是使用kotlix.coroutines库将C#Unity代码逐行转换为Kotlin协程:

fun main(args: Array<String>) {
    println("Starting " + Instant.now())
    launch(CommonPool) { waitAndPrint(2.0f) }
    println("Before waitAndPrint Finishes " + Instant.now())
    // Kotlin coroutines are like daemon threads, so we have to keep the main thread around
    Thread.sleep(3000)
}

suspend fun waitAndPrint(waitTime: Float) {
    delay((waitTime * 1000).toLong()) // convert it to integer number of milliseconds
    println("waitAndPrint " + Instant.now())
}

您可以在Guide to kotlinx.coroutines by example中了解更多内容,其中包含更多此类示例,显示Kotlin协程的各种可用功能,超越非阻塞睡眠。