SKEmitterNode не работает при использовании в качестве ссылочного узла в другом ссылочном узле - PullRequest
1 голос
/ 25 апреля 2020

У меня проблема с использованием эмиттера частиц со ссылочными узлами.

Он работает, когда на него ссылаются непосредственно в сцене (например, внутри файла 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)

Существует ли неправильный способ использования ссылочных узлов или излучателей частиц?

(Дайте мне знать, если потребуется дополнительная информация)

РЕДАКТИРОВАТЬ:

Я действительно заставил это работать иногда . Иногда это неожиданно начинало работать, когда я удаляю и повторно добавляю ссылочные узлы во все файлы, или если я изменяю иерархию узлов. Но, тем не менее, я не могу определить постоянную причину того, когда это работает, а когда нет, потому что с тех пор, как изменение его и возврат к тому, когда он работал, не исправляет это. (Чувствуется, как ошибка, если честно)

1 Ответ

1 голос
/ 27 апреля 2020

Проблема в том, что с iOS 10 все спрайт-узлы по умолчанию приостановлены. Это включает в себя вашу сцену. Недостаточно просто сделать вашу сцену не приостановленной (isPaused = false), вы должны сделать так, чтобы дети также не были приостановлены.

для вашего примера я добавил к дымовым излучателям в мой файл plane.sks, который перетаскивается на мой файл GameScene.sks как SKReferenceNode

и в моем файле 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
    }
}

emitters on plane

самолет с движущейся сценой (без излучателей)

plane in scene

установить плоскость объекта не остановлена ​​(внутри 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
    }
}

и вуаля

enter image description here

FYI

Возможно, он работает с перебоями, потому что вы можете установить точку останова. Всякий раз, когда у вас установлена ​​точка останова и код останавливается, она автоматически останавливает узлы

...