8

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

我正在使用 GamePlay 套件进行寻路。

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

然后我尝试用 s 来实现它(GKAgent这是我目前的状态)GKAgent这会很有用 - 也许用于 WWDC 的演示)

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

除了GKBehaviors 给定的GKGoals 似乎使一些奇怪的事情......

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

我感觉很崩溃...

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

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

2)在路径查找的帮助下,我自己滚动所有运动GKObstacleGraph(这也是错误的,我不得不说,在某些点,到达该点的路径会产生最糟糕的路径,比如“去触摸那个障碍物然后反向触摸然后到实际点(从一开始就可以通过直线实现)”)。

问题是:

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

4

2 回答 2

13

获得您所追求的行为的最佳方法之一(在 SpriteKit/GameplayKit 中)是认识到路径规划和路径跟踪不必是相同的操作。GameplayKit 为两者都提供了工具——GKObstacleGraph有利于规划,GKAgent有利于遵循规划的路径——当你结合两者的优势时,它们的效果最好。

(提供避障可能有点误导GKAgent;不要认为这与寻找绕过障碍物的路线相同,更像是对路上突然出现的障碍物做出反应。)

换句话说,GKObstacleGraph就像GKAgent使用地图导航和安全驾驶汽车之间的区别。前者是您决定采用 CA-85 和 US-101 而不是 I-280 的地方。(也许不时重新评估你的决定——比如说,在交通堵塞周围选择不同的道路。)后者是你不断地改变车道、避开坑洼、通过较慢的车辆、减速的地方。对于交通繁忙等


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

  1. 用于GKObstacleGraph进行高级路径规划。也就是说,当坏人在“这里”而英雄在“那边”,并且中间有一些墙时,选择一系列大致近似于从这里到那里的路线的路径点。

  2. 使用GKAgent行为使角色大致遵循该路径,同时对其他因素做出反应(例如让坏人不会互相踩踏,并为他们提供模糊逼真的运动曲线,而不是简单地遵循航路点之间的线)。

TaskBotBehavior.swift您可以在该示例代码中找到这背后的大部分相关内容——从addGoalsToFollowPath被调用的地方和它发出的调用开始并查看。


至于“永远移动”和“角速度”的问题……

代理模拟是动机类比(即代理在约束范围内将其移动到它“想要”的位置所需的操作)和物理系统(即这些运动被建模为力/脉冲)的奇怪组合。如果你拿走代理的目标,它不知道它需要停止——相反,你需要给它一个停止的目标。(即,移动速度目标为零。)可能有比 Apple 在此处选择的模型更好的模型——如果您有设计改进建议,请提交错误。

角速度比较棘手。代理的内在物理约束类似于陆地上的车辆或海上的船只的概念在系统中得到了很好的体现。它无法真正处理诸如必须重新定向以引导其推力的太空战斗机,或者可以像向前一样愉快地侧向或向后行走的行走生物——至少,不是靠它自己。您可以通过该maxAcceleration属性来改变代理运动的“感觉”,但您会受到该属性同时涵盖线性和角加速度这一事实的限制。

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

于 2016-09-28T19:28:09.563 回答
2

我还不能发表评论,所以我发布作为答案。我最近遇到了同样的问题:代理在目标周围摆动,或者即使你移除了行为,代理也会继续移动。然后我意识到行为只是控制运动的算法,但您仍然可以手动访问和设置代理的速度、位置和角度。

就我而言,我有一个在场景中追逐食物的小动物实体。当它与食品试剂接触时,食品实体被移除。我尝试了很多方法让小动物在吃完食物后停下来(它会一直走直线)。我所要做的就是将它的速度设置为 0。那是因为行为不会直接影响位置,而是速度/角度组合(据我了解)。当实体没有目标时,它不会“想要”改变它的状态,所以无论它达到什么速度和方向,它都会保持不变。它根本不会更新/更改它。因此,除非您创建一个让它想要停止的目标,否则它会摆动/继续前进。简单的方法是自己将行为设置为 nil 并将速度设置为 0。

如果行为/目标系统不适合您正在寻找的动画类型,您仍然可以使用代理系统并使用 AgenDelegate 协议和更新方法自定义移动,并使其稍后与其他代理交互。您甚至可以将代理与随物理引擎或动作(或任何其他方式)移动的节点同步。

我认为代理系统很适合保留,因为您以后可以使用它,即使它只是用于特殊效果。但就像混合动作和物理会产生一些奇怪的结果一样,混合目标/行为和任何其他“自动化”工具可能会导致不稳定的行为。

除了移动实际的精灵之外,您还可以将代理系统用于其他事情。例如,您可以使用代理充当“目标搜索者”来模拟敌人的反应时间。代理在场景中移动并找到其他代理,当它与合适的目标接触时,敌方实体会攻击它(随机想法)。

这不是“一刀切”的解决方案,但它是一个非常好的工具。

于 2017-01-02T06:08:43.260 回答