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
它可能会间歇性地为您工作,因为您可能设置了断点。每当您设置断点并且代码停止它时自动取消暂停节点
我在使用带参考节点的粒子发射器时遇到问题。
在场景中直接引用时有效(例如,在 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
它可能会间歇性地为您工作,因为您可能设置了断点。每当您设置断点并且代码停止它时自动取消暂停节点