SKEmitterNode 在另一个参考节点中用作参考节点时不起作用

SKEmitterNode doesn't work when used as a reference node within another reference node

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

在场景中直接引用时有效(例如,在 GameScene.sks 文件中),但在另一个 .sks 文件中引用时无效,并且 file/node然后在 GameScene.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)

参考节点或粒子发射器的使用方法有误吗?

(如果需要更多信息,请告诉我)

编辑:

我确实做到了 有些时候。有时,当我删除并重新添加所有文件中的引用节点时,或者如果我更改节点层次结构时,它会突然开始工作。但是,我仍然无法确定它何时起作用以及何时不起作用的一致原因,因为自从更改它并将其恢复到起作用时,并没有修复它。 (老实说,感觉像个错误)

问题是,自从 iOS 10 起,所有精灵节点都默认暂停。这包括您的场景。仅仅让场景不暂停 (isPaused = false) 是不够的,你还必须让 children 不暂停。

对于您的示例,我将烟雾发射器添加到我的 plane.sks 文件中,该文件作为 SKReferenceNode

拖到我的 GameScene.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
    }
}

有场景的平面运行(无发射器)

将飞机 object 设置为不暂停(在 Plane.swift 内)

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

瞧瞧

FYI

它可能会间歇性地为您工作,因为您可能设置了断点。每当您设置断点并且代码停止它时自动取消暂停节点