我熟悉运行SKActions并且从未遇到过问题。
但问题是,我的主要游戏是使用SceneKit在ARKit中,我在顶部添加一个SpriteKit叠加层以显示一些HUD:
sceneView.overlaySKScene = scene
sceneView.overlaySKScene?.isUserInteractionEnabled = false
sceneView.overlaySKScene?.scaleMode = .aspectFit
2D HUD正确显示,我可以通过代码移动位置,旋转,缩放,但我无法运行任何动画(即使从代码创建节点并将其添加为子节点):
class OverlaySKScene: SKScene {
override func didMove(to view: SKView) {
someSprite = childNode(withName: "someSprite") as! SKSpriteNode
someSprite.run(SKAction.rotate(byAngle: CGFloat.pi, duration: 1.0))
}
}
答案 0 :(得分:2)
根据docs,SKScene.isPaused应设为false:
如果值为true,则场景的内容在屏幕上固定。不执行任何操作,也不执行物理模拟。 当应用程序从活动状态转换为非活动状态时,isPaused将自动设置为true。当应用程序返回活动状态时,isPaused将自动设置为其先前的值。
这有点解释了为什么如果你在Xcode中暂停/取消暂停场景,它会运行动作......“活动状态”会发生变化。
因此,在设置overlaySKScene后,您必须记住将其 isPaused 属性设置为false。这会让行动开始,但现在问题变得非常奇怪了。我在Scene.swift中将一个基本的SKSpriteNode声明为frigidityBar。使用Scene.sks中名为“frigidityBar”的SKSpriteNode进行典型设置。
public class Book extends SugarRecord {
@Override
public String toString() {
return App.getGson().toJson(this);
}
}
像这样对它执行操作不起作用:
var frigidityBar: SKSpriteNode!
但确实如此。
frigidityBar!.run(SKAction.colorize(with: SKColor.orange, colorBlendFactor: 1.0, duration: 1.0)) {
print("Colorize action did run!")
}
就像这样:
displayNode.childNode(withName: "frigidityBar").run(SKAction.colorize(with: SKColor.orange, colorBlendFactor: 1.0, duration: 1.0)) {
print("Colorize action did run!")
}
即使作为彻底的SKSpriteNode进行投射也会失败:
(frigidityBar as SKNode).run(SKAction.colorize(with: SKColor.orange, colorBlendFactor: 1.0, duration: 1.0)) {
print("Colorize action did run!")
}
我不希望这里有任何银子弹,但欢迎任何想法,预感或猜测。
答案 1 :(得分:1)
我有同样的问题,如果其他人有答案,我会很乐意欢迎。
我注意到如果我在Xcode中暂停应用程序然后继续操作,则操作会按预期运行。
答案 2 :(得分:1)
在我的案例中,罪魁祸首是SCNView的.isPlaying
属性,该属性设置为false
(根据文档,默认设置。糟糕!)。
一旦我将其明确设置为true
,覆盖场景上的所有SpriteKit动作便开始起作用。
(强而有力的答案提到了SKScene的.isPaused
,并确认我的代码中不是这种情况,导致我对SCNView进一步寻找了类似的标志...) < / p>
我真的希望我浪费了半天的时间把头撞在墙上对别人有帮助。
答案 3 :(得分:0)
您的设置代码是否被调用?我不认为在覆盖场景的情况下调用-didMoveToView:
(它的SKView
参数是什么?)
相同的代码可能可以移动到设置叠加场景的地方。