GameplayKit GKGoal:不能四处走动去上班

GameplayKit GKGoal: can't get wandering to work

尝试学习如何使用 GameplayKit,尤其是代理和行为。尝试将所有教程和示例归结为一小段简单的代码,我可以将其用作我自己的应用程序的起点。不幸的是,我想出的东西不能正常工作,我也不知道为什么。它只是一个带有简单 GKGoal(toWander:) 的简单精灵。它没有徘徊,而是永远向右直线移动。尽管我将最大速度和加速度设置为离谱的高值,但它的启动速度也慢得令人难以置信,加速速度也慢得令人难以置信。我无法弄清楚我的简单代码与所有复杂示例之间的根本区别。这是代码,减去 required init?(coder aDecoder: NSCoder):

class GremlinAgent: GKAgent2D {
    override init() {
        super.init()

        maxAcceleration = 100000
        maxSpeed = 1000000
        radius = 20
    }

    override func update(deltaTime seconds: TimeInterval) {
        super.update(deltaTime: seconds)
        let goal = GKGoal(toWander: 100)
        behavior = GKBehavior(goal: goal, weight: 1)
    }
}

class Gremlin: GKEntity {
    let sprite: SKShapeNode

    init(scene: GameScene) {
        sprite = SKShapeNode(circleOfRadius: 20)
        sprite.fillColor = .blue

        scene.addChild(sprite)

        super.init()

        let agent = GremlinAgent()
        addComponent(agent)

        let node = GKSKNodeComponent(node: sprite)
        addComponent(node)
        agent.delegate = node
    }
}

并且在 GameScene.swift、didMove(to view:):

let gremlin = Gremlin(scene: self)
entities.append(gremlin)

谁能帮帮我?

正如elsewhere指出的那样,您必须将目标的权重设置得非常高。尝试 100,甚至 1000,并注意行为上的差异。但是即使有这些大权重,您的示例中仍然存在问题:maxSpeed 值。你不能把它设置得太高,否则你的精灵会直线飞走。将其设置为更接近您在 GKGoal 对象中设置的速度的值。

另请注意,漫游总是从精灵指向的方向开始,所以如果您不希望它总是向右移动,请将 zRotation 设置为某个随机值。

最后,不要在每次调用 update() 时都创建新行为。流浪的话,设置一次就可以了,比如在init().

下面是一些有效的代码:

class GremlinAgent: GKAgent2D {
    override init() {
        super.init()

        maxAcceleration = 100000
        maxSpeed = 100

        let goal = GKGoal(toWander: 100)
        behavior = GKBehavior(goal: goal, weight: 1000)
    }
}

class Gremlin: GKEntity {
    let sprite: SKShapeNode

    init(scene: GameScene) {
        sprite = SKShapeNode(circleOfRadius: 20)
        sprite.fillColor = .blue
        sprite.zRotation = CGFloat(GKRandomDistribution(lowestValue: 0, highestValue: 360).nextInt())

        scene.addChild(sprite)

        super.init()

        let agent = GremlinAgent()
        addComponent(agent)

        let node = GKSKNodeComponent(node: sprite)
        addComponent(node)
        agent.delegate = node
    }
}