SceneKit中缩放动作后序列里move:to动作失效问题咨询
解决SceneKit动作序列中Move动作无效的问题
我之前也碰到过类似的情况!问题出在你给Move动作设置了**duration: 0**,在SCNAction.sequence里,这种瞬间执行的动作有时候不会被正确处理——SceneKit的动作序列在处理时长为0的动作时,可能会因为时序调度的问题跳过它,或者和前后的缩放动作的状态更新不同步。
而且还有个细节:当你把节点缩放到0之后,即便位置变了,视觉上也看不到,直到缩放回来,但因为动作序列的处理逻辑,这个位置变更可能没有被正确应用到后续的缩放动作里。
两种可行的解决方案:
方案一:给Move动作设置一个极小的时长
把duration从0改成一个非常小的值(比如0.01),这样SceneKit会明确把它作为序列中的一个步骤执行,不会跳过:let ScaleDown = SCNAction.scale(to: 0, duration: 1) let ScaleUp = SCNAction.scale(to: 0.4, duration: 2) let Move = SCNAction.move(to: SCNVector3(InitialCharacterGridCoordinates.x, 0, InitialCharacterGridCoordinates.y), duration: 0.01) CharacterNode.runAction(SCNAction.sequence([ScaleDown, Move, ScaleUp]))方案二:用
SCNAction.run直接设置节点位置
既然是瞬间移动,不如直接在序列里插入一个执行代码块的动作,直接修改节点的position,这样更可靠,也更直观:let ScaleDown = SCNAction.scale(to: 0, duration: 1) let ScaleUp = SCNAction.scale(to: 0.4, duration: 2) let MoveToPosition = SCNAction.run { node in node.position = SCNVector3(InitialCharacterGridCoordinates.x, 0, InitialCharacterGridCoordinates.y) } CharacterNode.runAction(SCNAction.sequence([ScaleDown, MoveToPosition, ScaleUp]))
我个人更推荐方案二,因为直接操作节点属性比用时长为0的动作更清晰,也避免了SceneKit动作调度的潜在问题。你可以试试,应该就能解决Move动作无效的问题了!
内容的提问来源于stack exchange,提问作者Jonah Begood
相关产品推荐
相关产品推荐

