AI决策算法 之 GOAP (一)

本系列文章内容部分参考自:http://gamerboom.com/archives/83622



什么是GOAP? 
 
引用原文的一句话 : 目标导向型行动计划(简称GOAP)是一种能够轻松呈现给你的代理选择的AI系统,也是帮助你可以无需维持一个庞大且复杂的有限状态机而做出明智的决策的机器。

用处:
以前我们经常使用FSM有限状态机来实现AI系统,但是当一个游戏的AI行为非常庞大的时候,那么有限状态机的代码是很庞大的,且大部分代码重用性非常低。 


在这时也许有人会用行为树来开发AI系统,但是行为树是依赖设计者的固定架构的,很不灵活,做的选择不一定是最优选择,而且每次都要经过大量的逻辑判断,性能消耗严重。



这时候使用GOAP是合适的,它会根据目标在环境中决策出最优的路线,从而达到看起来相对智能的AI,且代码的分层相对清晰,可读性高,重用性高。



怎么实现?
四个主要类:
Agent: 代理, 主体,负责连接各个类,主要逻辑在这里运行
Action: 动作, 可以被执行的动作,比如:拿东西,丢东西
Planer:决策者, 通过各个类来决策出最优的路线供Agent使用
IGoap:  数据提供者,提供给Agent目标和反馈是否成功失败等等

除了上述类之外还需要一个简单的FSM有限状态机来辅助。

       我们在后面一一实现它们。

在Unity的GOAP(Goal-Oriented Action Planning)设计中,Goal(目标)是AI决策过程中的终点,代表了AI当前想要达成的最终状态或条件。设计Goal时需要考虑的是,它应该是清晰且可达成的,并且需要定义完成目标后会产生的正面效用(Utility)。每一个Goal都应当包含至少一个条件,该条件是AI执行一系列动作(Action)后能够达成的。 设计Goal时,你可以遵循以下步骤: 1. 明确Goal的条件:确定什么情况下该Goal被视为完成。 2. 设定Goal的效用值(Utility):用于比较不同Goal的重要性。 3. 考虑Goal的前置条件:可能存在需要达成的其他Goal或条件,作为当前Goal的前提。 4. 目标优先级:根据游戏设计需求,设置不同Goal的优先级。 案例展示: 假设我们正在设计一个游戏中的NPC(非玩家角色),它需要收集资源来建造一个避难所。我们可以为这个NPC设计一个“收集资源”Goal,该Goal的条件可能是“拥有至少5个木头和3个石头”。 Goal设计如下: ```csharp public class CollectResourcesGoal : Goal { public const string GOAL_NAME = "CollectResources"; public CollectResourcesGoal() { Name = GOAL_NAME; AddPrecondition("HasWood", 5); // 前置条件:拥有至少5个木头 AddPrecondition("HasStone", 3); // 前置条件:拥有至少3个石头 AddEffect("IsResourceCollected", 1); // 完成条件后,设置资源收集完毕的标志 } public override float CalculateCost(Agent agent) { // 计算达成目标的成本,这里简化为距离避难所的直线距离 float distanceToBase = Vector3.Distance(agent.transform.position, agent.home.transform.position); return distanceToBase; } public override bool Verify preconditionCheck, Effect achieved { // 验证前置条件是否满足和效应是否实现,这里简化为资源数量检查 return agent.HasResource("Wood", 5) && agent.HasResource("Stone", 3); } } ``` 在上述案例中,NPC需要收集资源以建造避难所,因此定义了“CollectResources”Goal,这个Goal要求前置条件是拥有至少5个木头和3个石头,并且完成这个Goal会增加“IsResourceCollected”效应。这个效应可以被其他Goal使用,作为它们的前置条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值