场景暂停时 GameplayKit 不暂停
GameplayKit Not Pausing When Scene Is Paused
我有一个 GKAgent2D 控制 SKNode 敌人向目的地移动。
当我暂停代理正在移动的 SKScene 时,敌人节点似乎继续移动而没有显示这种移动。所有可见的动作都停止(也就是敌人停止移动)。如果我等待 5 秒然后取消暂停场景,就好像敌人从未停止移动一样,它会弹出到如果我没有暂停场景它应该在的位置,然后它继续从那个点正常移动。
我研究了 Apple 为用户创建的名为 DemoBots 的示例演示游戏,他们实现了一个 "fix" 与我正在使用的类似,只需将 update:(NSTimeInterval *)currentTime
方法与 return.这是我的代码目前的样子:
- (void)update:(NSTimeInterval)currentTime {
[super update:currentTime];
if (_lastUpdateTime == 0) _lastUpdateTime = currentTime;
float delta = currentTime - _lastUpdateTime;
_lastUpdateTime = currentTime;
// Stop updating if the `worldNode` is paused.
if (worldNode.paused) { return };
for (GKComponentSystem *componentSystem in componentSystems) {
[componentSystem updateWithDeltaTime:deltaTime];
}
}
但我无法深入了解他们还在做什么以确保在暂停发生时立即停止当前有效的 GKGoal
目标。我什至记录了 agentDidUpdate 方法,当我暂停场景时它停止触发,所以我真的不确定它如何继续移动。
如果有人知道答案请告诉我。谢谢!
更新:我什至尝试暂停目标设置为移动的各个节点:
- (void)didPauseScene {
worldNode.paused = YES;
/*
<< Animations >>
*/
for (OEnemy *enemy /*my subclass*/ in enemyArray) {
enemy.paused = YES;
}
}
但这仍然没有阻止 GKGoals
在不暂停场景的情况下继续进行..
更新 2:停止代理的唯一解决方案就是删除代理系统目的:
if (worldNode.paused) {
self.agentSystem = nil;
return;
}
这是一个非常可悲的解决方案,因为我希望有一种更优雅/更合适的方法来停止目标,而无需从场景中完全删除所有内容。然而,即使如此,另一个问题仍然存在,在取消暂停时重置目标会产生相同的问题,即如果没有发生暂停,则跳转到目标位置。
如果另一个目标没有改变它,特工将继续他们最后已知的有效速度。如果您希望代理停止,您可以尝试使用 GKGoal 的 goalToReachTargetSpeed:.
对于那些 GKGoal goalToReachTargetSpeed:
不起作用的人。
从实体中删除我的 MovementComponent 对我有用:
let movementComponent = entity.component(ofType: MovementComponent.self)!
entity.removeComponent(ofType: MovementComponent.self)
componentSystem.removeComponent(moveComponent)
当您恢复您的游戏时,请确保您为您的移动组件创建一个新实例并再次将其添加到实体中:
let movementComponent = MovementComponent()
entity.addComponent(movementComponent)
componentSystem.addComponent(moveComponent)
当使用 GKComponentSystem 更新您的移动组件时,还要确保相应地删除和添加移动组件。
我有一个 GKAgent2D 控制 SKNode 敌人向目的地移动。
当我暂停代理正在移动的 SKScene 时,敌人节点似乎继续移动而没有显示这种移动。所有可见的动作都停止(也就是敌人停止移动)。如果我等待 5 秒然后取消暂停场景,就好像敌人从未停止移动一样,它会弹出到如果我没有暂停场景它应该在的位置,然后它继续从那个点正常移动。
我研究了 Apple 为用户创建的名为 DemoBots 的示例演示游戏,他们实现了一个 "fix" 与我正在使用的类似,只需将 update:(NSTimeInterval *)currentTime
方法与 return.这是我的代码目前的样子:
- (void)update:(NSTimeInterval)currentTime {
[super update:currentTime];
if (_lastUpdateTime == 0) _lastUpdateTime = currentTime;
float delta = currentTime - _lastUpdateTime;
_lastUpdateTime = currentTime;
// Stop updating if the `worldNode` is paused.
if (worldNode.paused) { return };
for (GKComponentSystem *componentSystem in componentSystems) {
[componentSystem updateWithDeltaTime:deltaTime];
}
}
但我无法深入了解他们还在做什么以确保在暂停发生时立即停止当前有效的 GKGoal
目标。我什至记录了 agentDidUpdate 方法,当我暂停场景时它停止触发,所以我真的不确定它如何继续移动。
如果有人知道答案请告诉我。谢谢!
更新:我什至尝试暂停目标设置为移动的各个节点:
- (void)didPauseScene {
worldNode.paused = YES;
/*
<< Animations >>
*/
for (OEnemy *enemy /*my subclass*/ in enemyArray) {
enemy.paused = YES;
}
}
但这仍然没有阻止 GKGoals
在不暂停场景的情况下继续进行..
更新 2:停止代理的唯一解决方案就是删除代理系统目的:
if (worldNode.paused) {
self.agentSystem = nil;
return;
}
这是一个非常可悲的解决方案,因为我希望有一种更优雅/更合适的方法来停止目标,而无需从场景中完全删除所有内容。然而,即使如此,另一个问题仍然存在,在取消暂停时重置目标会产生相同的问题,即如果没有发生暂停,则跳转到目标位置。
如果另一个目标没有改变它,特工将继续他们最后已知的有效速度。如果您希望代理停止,您可以尝试使用 GKGoal 的 goalToReachTargetSpeed:.
对于那些 GKGoal goalToReachTargetSpeed:
不起作用的人。
从实体中删除我的 MovementComponent 对我有用:
let movementComponent = entity.component(ofType: MovementComponent.self)!
entity.removeComponent(ofType: MovementComponent.self)
componentSystem.removeComponent(moveComponent)
当您恢复您的游戏时,请确保您为您的移动组件创建一个新实例并再次将其添加到实体中:
let movementComponent = MovementComponent()
entity.addComponent(movementComponent)
componentSystem.addComponent(moveComponent)
当使用 GKComponentSystem 更新您的移动组件时,还要确保相应地删除和添加移动组件。