0

从 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

  • 现在挂了

  • 点击屏幕(或将设备旋转到横向),然后移动发生 OK 并打印出 DONE MOVEBY。

我正在使用 C# 和 Visual Studio for Mac,但我怀疑它也使用 Xcode。

这是 SceneKit 中的错误吗?如何解决?

也许这与此处描述的问题相同:

SCNAction 完成处理程序等待手势执行

4

2 回答 2

3

发生这种情况是因为默认情况下 SceneKit 不会连续渲染。当点击屏幕时,场景会改变并且会渲染一个新的帧。这就是为什么在moveBy动作之后不会立即触发rotateBy动作的原因。

尝试将SCNViewrenderContinuously属性设置为 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
    })
}
于 2019-05-21T20:30:55.980 回答
0

将 SCNTransaction 与 completionBlock 一起使用不会遇到同样的问题,因此可以正常工作:

        SCNTransaction.Begin();
        SCNTransaction.AnimationDuration = 3.0f;
        SCNTransaction.SetCompletionBlock(() =>
        {
            Console.WriteLine("DONE ROTATE");
            SCNTransaction.Begin();
            SCNTransaction.AnimationDuration = 3.0f;
            SCNTransaction.SetCompletionBlock(() =>
            {
                Console.WriteLine("DONE MOVEBY");
            });
            ship.Position = new SCNVector3(1.0f, 0.0f, 0.0f);
            SCNTransaction.Commit();
        });
        ship.EulerAngles = new SCNVector3(0.0f, (float)Math.PI / 2, 0.0f);
        SCNTransaction.Commit();

(同样使用 CABasicAnimation 和 CAAnimationDelegate 来做回调工作正常。)

由于 SCNTransaction 和 CABasicAnimation 有效,但 RunAction 无效,因此它看起来确实像 RunAction 中的 Apple 错误。

于 2019-05-23T08:25:03.373 回答