首页 > 解决方案 > SKEmitterNode 在用作另一个参考节点中的参考节点时不起作用

问题描述

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

当它在场景中直接引用时(例如,在 GameScene.sks 文件中),它可以工作,但是当它在另一个 .sks 文件中引用时它不起作用,然后在 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)

使用参考节点或粒子发射器的方法是否错误?

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

编辑:

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

标签: sprite-kit

解决方案


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

对于您的示例,我将烟雾发射器添加到我的 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
    }
}

平面发射器

运行场景的飞机(无发射器)

场景中的飞机

将平面对象设置为不暂停(在 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
    }
}

在此处输入图像描述

供参考

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


推荐阅读