如何使用 Spritekit 和 GameplayKit 为移动的 GKAgent2D 设置 Swift 中的目标动画?

How can I animate a moving GKAgent2D with a goal in Swift using Spritekit and GameplayKit?

我正在 Swift 使用 Spritekit 和 GameplayKit 构建游戏。我目前在为与玩家竞争的 AI 敌人设置动画时遇到问题。

在游戏中,玩家收集从天上掉下来的物体,用来种花。人控玩家动画很简单,我通过摇杆左右移动,当摇杆的X位置为+/-时,为动画触发不同的SKAction。

但是对于敌人来说,他们的移动是根据 GKGoals 自动进行的,他们不断地左右跳跃和移动。触发移动代理动画的正确方法是什么?目前我尝试根据 agentWillUpdate 函数中代理的速度 (+/- dx) 做出反应

func agentWillUpdate(_ agent: GKAgent) {
    if let agent = agent as? GKAgent2D  {
        agent.position = float2(Float((node.position.x)), Float((node.position.y)))
    }
    guard let aiEnemyBody = entity?.component(ofType: PhysicsComponent.self) else {
        fatalError()
    }
    guard let animation = entity?.component(ofType: MovementComponent.self) else {
        fatalError()
    }
    print(aiEnemyBody.physicsBody.velocity.dx) // usually 0, despite moving across map at high speed
    if node.physicsBody!.velocity.dx > 0 {
        animation.move(direction: "left")
    } else if node.physicsBody!.velocity.dx < 0 {
        animation.move(direction: "right")
    } else {
        animation.faceForward()
    }
}

在调试中我发现当实体向左​​或向右移动时,代理的 x 速度变化并不总是改变?这是正确的行为吗?我希望有另一种方法来检测某个方向的运动

有关更多上下文,该游戏是一款 2d 平台式游戏 picture

如果这对任何人有帮助,我错误地使用物理体作为运动参考。正确的方法是使用GKAgent2D的velocity

    func agentWillUpdate(_ agent: GKAgent) {
        if let agent = agent as? GKAgent2D,
        let animation = entity?.component(ofType: MovementComponent.self) {
        agent.position = SIMD2<Float>(Float((node.position.x)), Float((node.position.y)))
        if agent.velocity.x < 0 {
            animation.move(direction: "left")
        } else if agent.velocity.x > 0 {
            animation.move(direction: "right")
        } else {
            animation.faceForward()
        }
    }
}