从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
  • 现在挂了
  • 轻击屏幕(或将设备旋转到横向),然后执行“确定”,并打印出“完成移动”。

  • 我使用的是C#和Mac的Visual Studio,但我怀疑使用Xcode也会发生这种情况。

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

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

    SCNAction completion handler awaits gesture to execute

    最佳答案

    发生这种情况是因为默认情况下,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
        })
    }
    

    关于ios - 在SceneKit中,从RunAction的完成处理程序调用时,SCNAction挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56189836/

    10-12 14:44