GKComponentSystem 在更新周期中没有组件
GKComponentSystem has no components on update cycle
我正在玩弄 SpriteKit 和 GameplayKit。但是当我 运行 我的代码时,我期望四处游荡的精灵什么都不做。
我用 lldb 打印了一些值,这是打印出来的:
(lldb) po agentSystem.components
▿ 1 elements
- [0] : <GKAgent2D: 0x7fc1b8e55ff0>
(lldb) po agentSystem.components
0 elements
第一个是在调用 addComponentWithEntity:
之后打印的。
第二个打印在 update:
方法中。
当然这一定是精灵没有徘徊的原因,但可能是什么导致了这个问题?
我什至查看并使用了 Apple sample code for Agents 的代码,但这似乎仍然无法解决问题。
这是我的场景代码:
import SpriteKit
import GameplayKit
class GameScene: SKScene
{
// MARK: - Properties
let agentSystem = GKComponentSystem(componentClass: GKAgent2D.self)
var lastUpdateTimeInterval: CFTimeInterval = 0.0
// MARK: - Scene Lifecycle
override func didMoveToView(view: SKView)
{
// Wave enemy
let agent = GKAgent2D()
agent.behavior = GKBehavior(goal: GKGoal(toWander: 10), weight: 100)
let waveEnemy = WaveEnemy()
waveEnemy.addComponent(agent)
agentSystem.addComponentWithEntity(waveEnemy)
let waveSprite = waveEnemy.componentForClass(VisualComponent)!.spriteNode
waveSprite.position = CGPoint(x: frame.size.width * 0.5, y: frame.size.height * 0.5)
addChild(waveSprite)
}
override func update(currentTime: CFTimeInterval)
{
if lastUpdateTimeInterval == 0
{
lastUpdateTimeInterval = currentTime
}
let deltaTime: CFTimeInterval = currentTime - lastUpdateTimeInterval
lastUpdateTimeInterval = currentTime
// Update component system
agentSystem.updateWithDeltaTime(deltaTime)
}
}
我遇到了类似的问题。原来我的 GKEntity 对它的引用很弱,导致它自动从 GKComponentSystem 中删除。
在您的情况下,您正在创建需要保留的 waveEnemy
。现场可以用数组存储。
class GameScene: SKScene {
...
var enemies = [GKEntity]()
override func didMoveToView(view: SKView) {
...
let waveEnemy = WaveEnemy()
waveEnemy.addComponent(agent)
enemies.append(waveEnemy) // Creates a strong reference for waveEnemy
...
}
...
}
我正在玩弄 SpriteKit 和 GameplayKit。但是当我 运行 我的代码时,我期望四处游荡的精灵什么都不做。
我用 lldb 打印了一些值,这是打印出来的:
(lldb) po agentSystem.components
▿ 1 elements
- [0] : <GKAgent2D: 0x7fc1b8e55ff0>
(lldb) po agentSystem.components
0 elements
第一个是在调用 addComponentWithEntity:
之后打印的。
第二个打印在 update:
方法中。
当然这一定是精灵没有徘徊的原因,但可能是什么导致了这个问题?
我什至查看并使用了 Apple sample code for Agents 的代码,但这似乎仍然无法解决问题。
这是我的场景代码:
import SpriteKit
import GameplayKit
class GameScene: SKScene
{
// MARK: - Properties
let agentSystem = GKComponentSystem(componentClass: GKAgent2D.self)
var lastUpdateTimeInterval: CFTimeInterval = 0.0
// MARK: - Scene Lifecycle
override func didMoveToView(view: SKView)
{
// Wave enemy
let agent = GKAgent2D()
agent.behavior = GKBehavior(goal: GKGoal(toWander: 10), weight: 100)
let waveEnemy = WaveEnemy()
waveEnemy.addComponent(agent)
agentSystem.addComponentWithEntity(waveEnemy)
let waveSprite = waveEnemy.componentForClass(VisualComponent)!.spriteNode
waveSprite.position = CGPoint(x: frame.size.width * 0.5, y: frame.size.height * 0.5)
addChild(waveSprite)
}
override func update(currentTime: CFTimeInterval)
{
if lastUpdateTimeInterval == 0
{
lastUpdateTimeInterval = currentTime
}
let deltaTime: CFTimeInterval = currentTime - lastUpdateTimeInterval
lastUpdateTimeInterval = currentTime
// Update component system
agentSystem.updateWithDeltaTime(deltaTime)
}
}
我遇到了类似的问题。原来我的 GKEntity 对它的引用很弱,导致它自动从 GKComponentSystem 中删除。
在您的情况下,您正在创建需要保留的 waveEnemy
。现场可以用数组存储。
class GameScene: SKScene {
...
var enemies = [GKEntity]()
override func didMoveToView(view: SKView) {
...
let waveEnemy = WaveEnemy()
waveEnemy.addComponent(agent)
enemies.append(waveEnemy) // Creates a strong reference for waveEnemy
...
}
...
}