Calling an SCNAction from the completion handler of RunAction seems to hang SceneKit.
A touch event or rotating the device seems to unblock the hang.
To reproduce:
1) Take the default SceneKit project you get on startup with the rotating spaceship.
2) Replace the animation code:
ship.RunAction(SCNAction.RepeatActionForever(SCNAction.RotateBy(0, 2, 0, 1)));
with:
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) Run on the simulator or real device (the problem is the same on both)
4) The results is:
Spaceship rotates OK
DONE ROTATE is printed out OK
Now it's hung
Tap the screen (or rotate the device to landscape) and then the move happens OK and DONE MOVEBY is printed out.
I'm using C# and Visual Studio for Mac, but I suspect it happens using Xcode too.
Is this a bug in SceneKit? How can a workaround be done?
Maybe this is the same issue as described here:
This happens because by default SceneKit is not rendering continuously. When tapping the screen the scene is changed and a new frame will be rendered. That's why the
moveByaction is not triggered immediately after therotateByaction.Try setting
SCNView'srenderContinuouslyproperty to true like so: