从 RunAction 的完成处理程序调用 SCNAction 似乎挂起 SceneKit。
触摸事件或旋转设备似乎可以解除挂起。
重现:
1) 使用旋转宇宙飞船启动时获得的默认 SceneKit 项目。
2)替换动画代码:
ship.RunAction(SCNAction.RepeatActionForever(SCNAction.RotateBy(0, 2, 0, 1)));
与:
ship.RunAction(SCNAction.RotateBy(0, 2, 0, durationInSeconds: 3.0f), delegate
{
Console.WriteLine("DONE ROTATE");
ship.RunAction(SCNAction.MoveBy(1, 0, 0, durationInSeconds: 3.0f), delegate
{
Console.WriteLine("DONE MOVEBY");
});
});
3)在模拟器或真机上运行(两者问题相同)
4)结果是:
飞船旋转正常
DONE ROTATE 打印出来 OK
现在已挂起
点击屏幕(或将设备旋转至横屏),然后移动成功并打印出 DONE MOVEBY。
我正在使用 C# 和 Visual Studio for Mac,但我怀疑它也发生在使用 Xcode 时。
这是 SceneKit 中的错误吗?如何解决?
也许这与此处描述的问题相同:
最佳答案
发生这种情况是因为默认情况下 SceneKit 不会连续渲染。当点击屏幕时,场景会发生变化,并且会渲染一个新的帧。这就是 moveBy
操作不会在 rotateBy
操作之后立即触发的原因。
尝试将 SCNView
的 renderContinuously
属性设置为 true,如下所示:
scnView.rendersContinuously = true
ship.runAction(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 3.0)) {
print("DONE ROTATE")
ship.runAction(SCNAction.moveBy(x: 1, y: 0, z: 0, duration: 3.0), completionHandler: {
print("DONE MOVEBY")
scnView.rendersContinuously = false
})
}
关于ios - 在 SceneKit 中,当从 RunAction 的完成处理程序调用时,SCNAction 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56189836/