Sprite kit SKEmitterNode不';当在另一个引用节点中用作引用节点时,将无法工作
我在使用带有参考节点的粒子发射器时遇到问题 当它直接在场景中被引用时(例如,在GameSecene.sks文件中),它起作用,但当它在另一个.sks文件中被引用时,它不起作用,并且该文件/节点随后在GameSecene.sks中被引用,尽管其他被引用的节点显示正确 以下是层次结构:Sprite kit SKEmitterNode不';当在另一个引用节点中用作引用节点时,将无法工作,sprite-kit,Sprite Kit,我在使用带有参考节点的粒子发射器时遇到问题 当它直接在场景中被引用时(例如,在GameSecene.sks文件中),它起作用,但当它在另一个.sks文件中被引用时,它不起作用,并且该文件/节点随后在GameSecene.sks中被引用,尽管其他被引用的节点显示正确 以下是层次结构: GameScene.sks - Reference Node to RocketFire.sks (emitter) <-- works - Reference Node to Rocket.sks R
GameScene.sks
- Reference Node to RocketFire.sks (emitter) <-- works
- Reference Node to Rocket.sks
Rocket.sks
- Reference Node to RocketFire.sks (emitter) <-- doesn't work in GameScene
- Reference Node to Engine.sks (non-emitter nodes) <-- works in GameScene
RocketFire.sks (SpriteKit particle file)
Engine.sks (SpriteKit scene file with non-emitter nodes)
GameScene.sks
-RocketFire.sks(发射器)的引用节点问题在于,由于iOS 10,所有精灵节点都默认暂停。这包括你的场景。仅使场景不暂停(isPaused=false)是不够的,还必须使子场景不暂停
例如,我将烟雾发射器添加到我的plane.sks文件中,该文件作为SKReferenceNode拖到我的GameSecene.sks文件中
在我的Plane.swift文件中,注意我在其中一个发射器上设置了isPaused=false,但它仍然不起作用
var leftSmoke: SKEmitterNode!
var rightSmoke: SKEmitterNode!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
if let leftSmoke = self.childNode(withName: "//leftSmoke") as? SKEmitterNode {
self.leftSmoke = leftSmoke
leftSmoke.isPaused = false
}
if let rightSmoke = self.childNode(withName: "//rightSmoke") as? SKEmitterNode {
self.rightSmoke = rightSmoke
}
}
场景运行的平面(无发射器)
将平面对象设置为“未暂停”(在plane.swift内)
瞧
供参考
它可能会间歇性地为您工作,因为您可能有一个断点集。无论何时设置断点并代码停止,它都会自动取消暂停节点不清楚是指什么行为起作用和不起作用,但发射器的模拟时间可能有问题。例如,发射器有一定的持续时间,但它正在被创建,但直到持续时间结束后才被使用/显示。在这种情况下,使用发射器的ispused
使其在不应处于活动状态时不运行和/或在显示之前调用resetSimulation()
将其倒带可能会解决您的问题。不工作=不发射粒子(即没有可见的粒子)。我用一个新项目复制了它,并且只使用了Sprite场景编辑器-没有其他逻辑,谢谢。从这个问题开始,我就一直在玩它,我发现这是因为暂停。提示是,如果我使用了advanceSimulationTime
,发射器将在模拟过程中出现暂停(而不是一开始就不可见)。最后,我创建了SKNode的一个扩展,用于暂停/取消暂停节点及其所有子体,并将其应用于场景
func setup() {
self.isPaused = false
if let leftSmoke = self.childNode(withName: "//leftSmoke") as? SKEmitterNode {
self.leftSmoke = leftSmoke
leftSmoke.isPaused = false
}
if let rightSmoke = self.childNode(withName: "//rightSmoke") as? SKEmitterNode {
self.rightSmoke = rightSmoke
}
}