【问题标题】:SKEmitterNode doesn't work when used as a reference node within another reference nodeSKEmitterNode 在用作另一个参考节点中的参考节点时不起作用
【发布时间】:2020-04-25 01:08:44
【问题描述】:

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

当它直接在场景中引用时(例如,在 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)

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

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

编辑:

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

【问题讨论】:

  • 不清楚具体指的是什么行为有效和无效,但发射器的模拟时间可能存在问题。例如,发射器具有一定的持续时间,但它被创建但直到持续时间结束后才使用/显示。在这种情况下,使用发射器的isPaused 阻止它在它不应该处于活动状态时运行和/或在显示它之前调用resetSimulation() 倒带它可能会解决您的问题。
  • 不起作用 = 没有粒子被发射(即没有任何可见的东西)。我用一个新项目复制了它,并且只使用 Sprite 场景编辑器 - 没有其他逻辑

标签: sprite-kit


【解决方案1】:

问题在于,从 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
    }
}

然后瞧

仅供参考

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

【讨论】:

  • 谢谢。自从这个问题以来,我玩了很多,并发现这是由于暂停。提示是,如果我使用advanceSimulationTime,发射器会在模拟过程中出现暂停(相对于一开始根本不可见)。我最终为 SKNode 创建了一个扩展,它暂停/取消暂停节点及其所有后代,并将其应用于场景
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
相关资源
最近更新 更多