SCNAction完成处理程序等待手势执行
问题描述:
我有一个由按钮触发的SCNNodes
动画。在随后按下按钮时,动画反转。前进动画总是可以正常工作,但反向动画有时会挂起。也就是说,它将播放完成处理程序之前的部分然后冻结。但是,当我应用我的三种手势(平移,平移,缩放)中的任何一种时,它都会挂起并完成处理程序部分。相关代码:SCNAction完成处理程序等待手势执行
else if buttonToggle_1 == true { buttonToggle_1 = false
let moveWaterBack = SCNAction.moveTo(homePosition_2, duration: 1)
let moveValineBack = SCNAction.moveTo(awayPosition_1, duration: 1)
atomsNode_3.hidden = false
bondsNode_3.hidden = false
hideTransients(true)
atomsNode_3.runAction(moveWaterBack)
bondsNode_3.runAction(moveWaterBack,
completionHandler: {
self.atomsNode_2.runAction(moveValineBack) ;
self.bondsNode_2.runAction(moveValineBack) ;
self.atomsNode_3.removeFromParentNode() ;
self.bondsNode_3.removeFromParentNode() ;
hideTransients(false)
})
}
的hideTransients())
通话取消隐藏五个节点,通过名字来访问它们。有时完成挂起,有时不完成。但是,如果它挂在同一页上剩余的特定会话中,它将继续在后续按钮切换时挂起。我还没有找到任何因果关系。我已将removeFromParentNode()
呼叫更改为hidden = true
,目前该功能正在运行,但让我紧张依赖。
这里可能会发生什么?
编辑1:虽然它一直工作得非常一致,但我使用后面提到的代码看到了几次(多出)的挂断,所以这不是严格归因于removeFromParentNode()
调用。
答
在一个动作中调用SCNNode.removeFromParentNode()
对我来说似乎很腥。我看到另外一个案例,这似乎是造成不稳定的行为,虽然没有文件证明你不应该这样做。
我认为SCNAction.removeFromParentNode()
的存在是一个很大的提示,并且调用该操作将优于直接操作节点树。
使用SCNAction.group()
和SCNAction.sequence()
会使您的代码更简单一些。
据我所知,'runAction()'只作用于单个节点。我的处理程序在4个不同的对象上执行操作,因此分组将无法工作。类似的情况使用'SCNAction.sequence()'。一旦第一对同时动作完成,我需要同时运行处理程序中的所有对象,不同的对象。我错过了什么吗? (顺便说一句,原子和债券保持分开是有原因的。)谢谢,哈尔。 – bpedit