是否使用GKAgent

Col*_*eel 7 sprite-kit gameplay-kit

我正在使用SpriteKit开发(或至少尝试开发)一个体面的大型实时战术游戏(类似于RTS).

我正在使用GamePlay工具包进行寻路.

最初我使用SKActions来移动路径中的精灵,但足够快我意识到这是一个很大的错误.

然后我试着用GKAgents 来实现它(这是我现在的状态)我觉得GKAgents非常原始而且不成熟他们正在遵循一些奇怪的Newton Law#1让它们永远移动(我想不出任何场景它会很有用 - 也许适用于WWDC的演示)

以及我看到他们有一些Angular速度来执行我根本不需要的旋转,并且无法真正找到如何禁用它...

除了GKBehavior给定GKGoals似乎做出一些奇怪的事情......

设置行为以避开障碍物使我的单位在他们周围慢跑...设置跟随路径目标的行为完全忽略了一切,除非maxPredictionTime它足够低......我甚至不愿意告诉当我将它们组合时会发生什么.

我觉得很破碎......

我觉得我现在有两个选择:

1)与这些代理人进行更多的斗争,并试图让他们按照我的意愿行事

2)在我的帮助下自行滚动所有的动作GKObstacleGraph和一条路径Finding(这也是我在某些方面要说的路径,这条路的路径会产生最糟糕的路径,比如"触摸那个障碍然后反向触摸"那个人然后去实际点(从一开始就可以通过直线实现)").

问题是:

这些选项中最好的是什么?

ric*_*ter 11

获得您所追求的行为的最佳方式之一(在SpriteKit/GameplayKit中)是识别路径规划和路径跟踪不必是相同的操作.GameplayKit为两者提供工具 - GKObstacleGraph有利于规划,GKAgent有利于遵循计划的路径 - 当您结合每个工具的优势时,它们最有效.

(GKAgent提供避障可能有点误导;不要像在障碍物周围寻找路线那样考虑这个问题,更像是对你的突然障碍做出反应.)

换一种方式,GKObstacleGraphGKAgent像与地图导航和安全地驾驶汽车之间的差别.前者是您决定使用CA-85和US-101而不是I-280的地方.(并且可能会在一段时间内重新评估您的决定 - 例如,在交通拥堵周围选择一组不同的道路.)后者是您不断变化的车道,避免坑洼,通过较慢的车辆,减速的地方交通繁忙等


在Apple的DemoBots示例代码中,他们将此分为两个步骤:

  1. GKObstacleGraph做高层次的路径规划.也就是说,当坏人"在这里"并且英雄"在那里"时,并且中间有一些墙,选择一系列大致接近从这里到那里的路线的航点.

  2. 使用GKAgent行为使角色大致遵循该路径,同时也对其他因素做出反应(比如让坏人不踩彼此并给他们模糊的逼真运动曲线,而不是简单地按照航点之间的线条).

您可以TaskBotBehavior.swift在该示例代码中找到此背后的大部分相关内容- 从addGoalsToFollowPath查看调用的地点和调用它的地方开始查看.


至于"永远移动"和"角速度"问题......

代理模拟是动机类比的奇怪组合(即代理执行将其移动到约束中"想要"的位置所需的东西)和物理系统(即那些运动被建模为力/脉冲).如果你取消了代理人的目标,它就不知道它需要停止 - 相反,你需要给它一个停止的目标.(也就是说,移动速度目标为零.)可能有比Apple选择的模型更好的模型 - 如果您有改进设计的建议,则会出现错误.

角速度比较棘手.代理人的内在物理限制的概念类似于陆地上的车辆或海上的船只,这种概念很好地融入了系统.它无法真正处理空间战斗机必须重新定向以推动其推力的行为,或行走的生物,它们可以像往前一样快乐地侧身或后退 - 至少不是靠自己.你可以在改变代理人运动的"感觉"方面获得一些里程maxAcceleration,但你受到所述属性同时涵盖线性加速度和角加速度的限制.

但请记住,代理系统"想要"与游戏世界中"实际发生"之间的界面在您的控制之下.最简单的实现方法GKAgentDelegate是同步代理及其代表的精灵的属性velocityposition属性.但是,您不必这样做 - 您可以计算不同的力/冲量并将其应用于您的精灵.

  • 我认为Rickster可能是地球上唯一能理解并能表达GameplayKit的人.苹果公司可能会理解它,但他们肯定是因为狗屎无法表达出来. (4认同)