Sprite kit SKEmitterNode不';当在另一个引用节点中用作引用节点时,将无法工作

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

我在使用带有参考节点的粒子发射器时遇到问题

当它直接在场景中被引用时(例如,在GameSecene.sks文件中),它起作用,但当它在另一个.sks文件中被引用时,它不起作用,并且该文件/节点随后在GameSecene.sks中被引用,尽管其他被引用的节点显示正确

以下是层次结构:

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
    }
}