gpt4 book ai didi

swift - 游戏套件 : NPC element is going to very high floating number coordinates and back on update

转载 作者:行者123 更新时间:2023-11-30 13:39:03 25 4
gpt4 key购买 nike

我已经插入了我的 GKBehavior/GKAgent2D/GKComponent 系统来执行一些行为例程,但在修复这个我无法弄清楚的错误时遇到了麻烦。 我先来描述一下: 我当前的实体/组件系统基于苹果的 ECS,其中:1-entitymanager:GKEntity 管理所有组件并包含游戏中的所有实体,并使用 updateWithDelta 进入所有 GKComponentSystems,这些 GKComponentSystems 本身会更新其系统中的每个组件。目前,更新顺序如下:行为>节点>玩家节点>声音>界面>物理2-每个系统都是一个 GKComponentSystem,负责更新其中的所有元素。我有两个名为 GameRenderer 和 GameControls 的 NSViewController 扩展,它们都是 SCNSceneRendererDelegate 的代表,还有一个名为 KBAndTouchDelegate 的自定义协议(protocol),它们分别更新屏幕和控件上的渲染(一旦我的订单更新感觉正确,将更改它以将其合并到 ECS 中)。现在,在行为组件系统中,它更新一个 MoveComponent,其中包含一些用于更新的函数(willUpdate 和 didUpdate)。两者都有一个 2DAgent 位置,该位置首先取自 SCNNode 的位置(从 SCNVector3 转换为 Float2,仅更改 x 和 z 坐标),然后在评估行为算法后反射回节点。以下是更新的片段:

    func agentWillUpdate(agent: GKAgent) {
guard let nodeComponent = entity?.componentForClass(SCNNodeComponent.self)
else{
return
}
let nodePos = nodeComponent.node.position
position = float2(Float(nodePos.x), Float(nodePos.z))

}

func agentDidUpdate(agent: GKAgent) {
guard let nodeComponent = entity?.componentForClass(SCNNodeComponent.self)
else{
return
}
let pos = SCNVector3(x: CGFloat(position.x), y: nodeComponent.node.position.y, z: CGFloat(position.y))
print("\(nodeComponent.node.name) changed to \(pos)")
nodeComponent.node.position = pos
}

@override updateWithDeltaTime 例程检查 moveComponent 所有者所在的一方,并将其放入数组中以获得最近的敌人距离并返回敌人。 该行为具有非常低的 maxSpeed 和 maxVelocity 因子。 运行该应用程序,我打印了两个节点的一组 Action ,这两个节点是敌人并监视彼此的位置。敌人的搜索程序运行良好,因为它们以交替的顺序反射(reflect)彼此的位置。结果如下:

Optional("zombie") changed to SCNVector3(x: -20.0, y: 0.0, z: -20.0)
enemy position is: (0.0, 0.0)
Optional("player") changed to SCNVector3(x: 0.0, y: 0.0, z: 0.0)
enemy position is: (-20.0, -20.0)
Optional("zombie") changed to SCNVector3(x: -20.0, y: 0.0, z: 41567.44140625)
enemy position is: (0.0, 0.0)
Optional("player") changed to SCNVector3(x: 0.0, y: 0.0, z: 0.0)
enemy position is: (-20.0, 41567.44140625)
HRTF loaded
Optional("zombie") changed to SCNVector3(x: 30.136764526367188, y: 0.0, z: -20.2421875)
enemy position is: (0.0, 0.0)
Optional("player") changed to SCNVector3(x: 0.0, y: 0.0, z: 0.0)
enemy position is: (30.1367645263672, -20.2421875)
Optional("zombie") changed to SCNVector3(x: -38636.87109375, y: 0.0, z: 15289.939453125)

如果查看“僵尸”的第一个位置,您会发现它从 -20 开始,-20 然后 x 和 z 位置都达到不可能的大值(同样,场景世界中的 x 和 z)。玩家不会移动,因为我没有使用任何控件,只是为了看看僵尸是否能够通过以下 GKBehavior 调用找到玩家

    init(targetSpeed: Float, seek: GKAgent, avoid: [GKAgent]){
super.init()

if targetSpeed>0{
setWeight(0.1, forGoal: GKGoal(toReachTargetSpeed: targetSpeed))
setWeight(0.5, forGoal: GKGoal(toSeekAgent: seek))
setWeight(1.0, forGoal: GKGoal(toAvoidAgents: avoid, maxPredictionTime: 1.0))
}
}

上述行为在 MoveComponent 中为僵尸的敌人(玩家)调用。这意味着僵尸会寻找玩家。 谁能告诉我 x 和 z 的这些巨大值到底是什么?僵尸和玩家的距离约为 sqrt(800) 或 28 米。但是僵尸在 x 上移动到 35800 米之外,然后切换回大约 50 米,然后在每一帧来回移动。有一个明确的模式,我不确定这个 GKBehavior 是否使用 A 星,此时概率路线图设置了一些非常奇怪的坐标样本,但我的代码中没有任何标量可以将僵尸移动这么远并将距离翻转回来每一帧都相当正常。

最佳答案

对于任何可能遇到相同问题的人,截至昨天 2016 年 3 月 21 日,Apple 已通过最新的 x-code 7.3 公开更新解决了该问题。

关于swift - 游戏套件 : NPC element is going to very high floating number coordinates and back on update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35782773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com