我开始在游戏中实现玩家和敌人的AI,但是对于如何在基于组件的游戏架构中最好地实现这一点感到困惑。
假设我有以下玩家角色,可以固定,奔跑和挥舞剑。玩家可以从静止状态和奔跑状态都转变为挥剑状态,但是随后必须完成挥杆,然后才能继续站立或奔跑。在挥杆过程中,玩家无法走动。
如我所见,我有两种实现方法:
- 创建一个包含所有播放器逻辑的AI组件(与实际组件分离或嵌入为PlayerAIComponent)。我可以轻松地执行状态限制,而无需在组成播放器实体的各个组件之间创建耦合。但是,AI组件无法分解。例如,如果我有一个只能站立,四处走动或只能四处走动并偶尔挥舞剑的敌人,那么我必须创建新的AI组件。
- 将行为分解为各个组件,每个组件标识一个特定状态。然后,我得到一个StandComponent,WalkComponent和SwingComponent。为了执行过渡规则,我必须耦合每个组件。SwingComponent必须在挥杆期间禁用StandComponent和WalkComponent。当我有一个只会站着的敌人,偶尔会挥舞剑时,我必须确保SwingComponent仅在存在Walkwalk时将其禁用。尽管这允许更好的混合和匹配组件,但是当每次添加依赖项时,它都可能导致可维护性的噩梦,但必须更新现有组件以更好地满足依赖项对角色的新要求。
理想的情况是,设计人员可以通过将组件拖到容器中来构建新的敌人/玩家,而无需触摸任何一行引擎或脚本代码。尽管我不确定是否可以避免脚本编码,但我想使其尽可能简单。
总结一下:我应该将所有AI逻辑分解为一个组件,还是将每个逻辑状态分解为单独的组件,以更轻松地创建实体变量?
编辑:我怀疑我对第一种和第二种情况的含义有些困惑。我试图在下图中解释它。
注意各个状态与实体之间的关系。在第一种情况下,会在将AI组件放入实体之前对其进行预先构建。设计人员只能从程序员提供的一组独特的AIComponent中进行选择。第二种情况具有与其他组件相同级别的不同状态。设计人员现在可以创建具有唯一AI的实体,而无需程序员的干预。
问题是,这是在基于组件的实体中构建AI的仅有的两个选择吗?如果是的话,什么将提供最大的灵活性?