如何使用 C# 在 Unity 中使用 StateMachine 创建多个类/敌人变体?

问题描述 投票:0回答:1

我一直在遵循多个来源在 Unity Engine 中创建我自己的自定义 StateMachine,没有任何子状态。我成功地创建了一个状态机,可以处理视频游戏中角色的所有基本、简单要求,例如步行、奔跑、蹲伏、闪避、转身和单个基本近战攻击组合。

我的目标是:使用此角色状态机作为基础创建一个敌人或各种玩家角色,例如法师、巫师、坦克、弓箭手等。我也无法弄清楚如何使这个角色/类别能够在多个武器组之间交换而不改变类别?我一直在想我应该尝试在这里使用多态性和继承来偏离这个基类。

我还想使用可编写脚本的对象来保持东西干净,并为不同的类别/敌人隐藏伤害数字、健康值等,但这是另一篇文章的问题。

我将附上我的当前状态和状态机,以便对普通玩家/NPC 共有的状态以及我有多少种不同的状态进行基本的视觉理解。

每次复制粘贴这些状态或状态机或用不同的名称重写每个状态脚本听起来并不高效或不合逻辑,所以我恢复到之前的提交。我能想到的唯一方法是从CharacterStateMachine(我的StateMachine的名称)派生并覆盖一些方法,例如Attack(播放远程攻击动画并造成不同的伤害数字而不是近战攻击伤害),但我不知道该怎么做正是如此。

我还没有进一步了解,当我尝试根据自己的需求进行研究时,我找不到可以遵循的具体解决方案。所以我在这里。

感谢您的时间和投入!

c# unity-game-engine inheritance polymorphism state-machine
1个回答
0
投票

我不知道你是否还在尝试这样做。但是有一个相对简单的解决方案,您可以使用它来允许自己允许类,而无需添加那么多额外的代码。如果您为包含其可以使用的武器的每种类型的类创建一个可编写脚本的对象。通过使用一个 int 值数组来表示它对不同情况的反应,你可以让每个带有附加类的 AI 从数组中请求特定值,并将其添加到你计算的任何值中,以查看它对新状态的影响有多大过渡到。

可编写脚本的对象的示例如下:

string className: /*Name of the class.*/
int classID: /*An int to more easily identify the class in the future.*/
weapon[] weaponAccess: /*All weapons the class can use.*/
int[] classStats /*All the stats for the class. So how far it will normally go, typical HP, and so on.*/ [health, walkingSpeed, runningSpeed, fearFactor]

在攻击状态下,您可以让AI进行快速检查,以确定它属于哪个类别并影响适当的值以及它可以攻击多远。这取决于您希望每个类影响哪些变量以及它们如何变化。然后它可以从武器阵列中选择一种武器。这可以随机完成,也可以根据某些因素确定使用哪种武器。

使用基于每个类别的信息的攻击状态的 sudo 代码示例如下:

attackState: characterBaseState
{
  class currentClass = statemachine.currentClass;

  weapon currentWeaponOut;

  float minDist, maxDist;

  chooseWeapon(){
    currentWeaponOut = random.range(0,currentClass.weaponAccess.Length)
  }

  distanceToPlayer()
  {
    float dist = random.range(minDist + currentClass.classStats[3],maxDist + currentClass.classStats[3];

    //The rest of the code to move to a new position.
  }
}

sudo 代码基于我认为您当前处于攻击状态的内容,但您可以更改值以及您想要查看每个类的内容以及它如何影响状态。希望这有助于您解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.