从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)结果是:
宇宙飞船旋转正常
完成旋转打印成功
现在挂了
点击屏幕(或将设备旋转到横向),然后进行移动,然后将完成的移动打印出来。
我正在使用C#和Mac上的Visual Studio,但我怀疑它也是在Xcode中发生的。
这是SceneKit中的错误吗?如何解决?
也许这是此处所述的相同问题:
答案 0 :(得分:0)
发生这种情况是因为默认情况下,SceneKit不会连续渲染。当点击屏幕时,场景将改变,并且将渲染新的帧。这就是moveBy
操作之后没有立即触发rotateBy
操作的原因。
尝试像这样将SCNView
的{{1}}属性设置为true:
renderContinuously
答案 1 :(得分:0)
将SCNTransaction与completeBlock一起使用不会遇到相同的问题,因此可以正常工作:
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 bug。