角色最重要的一类行为就是战斗,战斗行为最为丰富的是动作游戏
战斗行为有对应的战斗状态和战斗属性,属性是一种特殊的状态信息
战斗行为通常又可以分为攻击、防御、闪避等行为,分别有各自对应的状态和属性,是战斗状态的细分和战斗属性的扩展
1.有的游戏(不是动作游戏),攻击方式只有一种,机制是攻击到就击杀
2.在1的基础上,引入伤害和血量机制,每次攻击有固定伤害,减少固定血量,血量为0时击杀。该机制引入了基础属性,血量;攻击属性,攻击力;战斗状态:攻击中
这时的战斗机制主要是依靠移动来闪避固定的攻击。该战斗机制引入了角色的移动属性,主要是速度和方向
这种情况下,攻击动作只有一种,闪避动作也只有一种。条件主要是基于战场信息中的距离和角色战斗属性中的血量变化
血量通常有丝血1%,低血20%,半血50%,多血75%,满血98%
距离通常有1、3、5、10米等
根据不同的条件来执行不同的动作,构成不同的行为,例如:
攻击行为:
自己血量高于多血,敌人距离小于3米,执行攻击动作
敌人血量低于低血,自己血量高于低血,敌人距离小于5米,执行攻击动作
闪避行为:
自己血量低于低血,敌人距离小于5米,执行移动动作
敌人血量高于多血,敌人距离小于1米,执行移动动作
等等,仅仅是两个动作和两类条件,就可以预设出多种不同的行为,给这些不同的行为分类,就可以得到不同角色AI等级。
3.在2的基础上,引入武器和护甲机制,不同的武器有不同的攻击动作和不同的伤害。该机制引入了基础属性,护甲值;装备属性
该机制的引入会为AI增加更多可供选择的行为,仍然是先分析动作,再分析条件,最后看行为
在动作游戏中,不同武器一定是有不同的动作的。而非动作游戏,角色的动作可能仍然是相同的
因此,非动作游戏中仍然只有一种攻击动作。
在一些RPG游戏中,会对不同的武器制作不同的攻击动作,但这些动作都属于同一种攻击方式,只不过是根据不同的武器播不同的动作而已。对玩家来说,只需要按同一个按键即可。对角色AI来说也一样。
而在动作游戏中,武器会有轻击、重击、蓄力击、处决击等不同攻击方式,特殊的武器有特殊的攻击方式,普通的武器在特殊条件下还有新的攻击方式。
在操作上每种攻击方式都对应一个按钮或按键,而按钮或按键过多,会导致玩家操作不过来。因此,实际中,会通过连招、自动切换方式减轻玩家操作负担。
而对角色AI来说,没这个必要。
引入武器后,以动作游戏为基础,攻击方式变为轻击、重击、蓄力击、处决击、特殊击1、特殊击2、特殊击3
此时对于每个攻击方式而言,都会有是否可以执行的条件,只需要调用战斗系统的接口即可,同时战斗系统会根据攻击方式执行不同的动作
对角色AI而言,这里的攻击方式就是属于动作,是否可以执行属于条件
更复杂的条件是,如何选择攻击方式,低级AI就是随机,高级AI需要根据攻击方式的伤害、特点、战局情况等选择,这依赖于动态情况。通常而言,可以简单根据攻击方式伤害来选择
严格来说,选择攻击方式是多种条件组合而成,是一种决策,而不是单纯的条件。此时行为 = 决策+动作,决策与具体的游戏机制相关
在2中的攻击行为和闪避行为的条件简单,算不上决策
条件主要是角色战斗属性中的护甲变化
3.1 在3的基础上加入背包机制,可以在战斗中使用物品,例如切换背包内的武器、使用回血回体力的药品或者其他特殊物品
一般来说,回血回体力的药品都是在脱战后使用的,而切换物体是可以在战斗中的动作,某些特殊物品可以在战斗中使用,看具体的游戏机制
在此机制下,增加的动作为:切换武器,使用特殊物品1,使用特殊物品2
增加的条件为:背包是否有某物品,当前是否可以切换武器,当前是否可以使用特殊物品1、2
增加的决策为:是否需要切换武器攻击,是否需要使用特殊物品1,是否需要使用特殊物品2
这时的行为不属于攻击、闪避等行为,而属于战斗中的辅助行为
3.2 在3的基础上增加闪避动作。通常闪避动作只有动作游戏才有,可以通过闪避动作躲避攻击,而其他类型的游戏通常都是通过移动也即走位躲避攻击,在动作游戏中还可以通过跳跃来躲避攻击。
增加的动作为:闪避动作、跳跃动作
增加的条件为:当前可以是否可以闪避,敌人是否正在攻击(是否可以闪避与游戏机制有关,例如体力不足不能闪避、被控制不能闪避)
增加的决策为:选择闪避方式(不同的攻击方式甚至攻击动作,选择不同的闪避方式,与具体的游戏机制相关)
复杂化闪避行为
3.3 在3的基础上增加防御动作。通常只有动作游戏中的格斗类型游戏才有防御动作,防御方式又可以分为普通防御、格挡防御、反击防御
增加的动作为:不同防御方式的防御动作
增加的条件为:当前是否可以防御,敌人是否正在攻击
增加的决策为:选择防御方式
增加了防御行为
4.在3的基础上增加技能机制。技能丰富了已有的战斗行为,主要是丰富攻击方式,特殊的技能会丰富闪避和防御方式。通常有技能1、技能2、大招。
不同的角色有不同的技能,技能动作不同,是否可以使用和需要使用该攻击方式的条件比普通攻击方式更为复杂,并使得攻击、防御、闪避方式的决策更为复杂化。
同时,技能还会给角色引入法力属性,已有的武器和技能机制可能会使得该属性以及上述的其他战斗属性发生变化。此外,技能会为角色新增被控制的状态,引入被控制时的行为,即挣脱行为
增加的动作为:不同技能的动作、挣脱动作
增加的条件为:当前技能是否可释放、敌人是否在释放技能、自己或敌人是否在被控制,法力变化
增加了攻击、防御、闪避、挣脱行为
4.1 在4的基础上为角色引入更加复杂的属性。例如物抗、法抗、破甲、攻速、暴击等,常见于MOBA类游戏;进一步细分各类物抗、法抗、暴击等的常见于RPG类游戏
这些只是属性的增加,并没有新增动作,会新增一些条件,复杂化攻击和辅助行为。
例如,需要根据敌人的属性特点针对性的切换武器、使用物品,选择攻击方式等
5.在4的基础上增加战场机制。场景主要体现在两个方面,一是战场有各类丰富的物资可以更换物品或武器;二是战场有地形或机关可以利用。
通常来说,AI基本不会用到这种机制,在战斗中考虑战场过于复杂,高玩会考虑到。
综上所述,在战斗中角色有攻击、防御、闪避、挣脱、辅助等五类行为,每类行为都有多种行为方式,操作角色时需要根据自身和敌人的状态信息、属性信息,必要条件,做出主要的六种决策。
【代码表示】
public class RoleBattleInfo
{
public RoleBattleProperty battleProperty;
public RoleBackPack roleBackPack;
}
public class RoleBattleProperty
{
public RoleBattleState BattleState { get; set; }
public int Hp { get; set; }
public int MaxHp { get; set; }
public int Shield { get; set; }
public int MaxShield { get; set; }
public int Attack { get; set; }
public int Mp { get; set; }
public int MaxMp { get; set; }
public float Speed { get; set; }
public float MaxSpeed { get; set; }
public int Ap { get; set; }
public int MaxAp { get; set; }
public RoleBaseProperty BaseProperty { get; set; }
public RoleAttackProperty AttackProperty { get; set; }
public RoleMoveProperty MoveProperty { get; set; }
}
public enum RoleBattleState
{
Attack,
Dodge,
Assist,
Defense,
BeControlled,
}
public class RoleBaseProperty
{
public int BaseHp;
public int BaseShield;
public int BaseMp;
public int BaseAp;
}
public class RoleAttackProperty
{
public int BaseAttack { get; set; }
}
public class RoleMoveProperty
{
public float BaseSpeed { get; set; }
public Vector3 Direction { get; set; }
}
public class RoleBackPack
{
public Dictionary<int, ItemInfo> id2Info = new Dictionary<int, ItemInfo>();
}
public class ItemInfo
{
public int itemId;
public EquipmentProperty equipmentProperty;
}
public class EquipmentProperty
{
public int EquipmentId { get; set; }
public int EquipmentType { get; set; }
public int ChangeHp { get; set; }
public int ChangeMp { get; set; }
public int ChangeShield { get; set; }
public int ChangeAttack { get; set; }
public int ChangeSpeed { get; set; }
}
public class BattleCondition
{
public int Def_敌人距离;
public int Def_自己血量;
public int Def_敌人血量;
public int Def_攻击方式是否可以使用;
public int Def_自己护甲;
public int Def_敌人护甲;
public int Def_背包是否有某物品;
public int Def_是否可以切换武器;
public int Def_是否可以使用特殊物品1;
public int Def_是否可以使用特殊物品2;
public int Def_敌人是否正在攻击;
public int Def_当前是否可以闪避;
public int Def_当前是否可以防御;
public int Def_技能是否可以释放;
public int Def_敌人是否在释放技能;
public int Def_自己法力;
public int Def_自己是否在被控制;
public int Def_敌人是否在被控制;
}
public class BattleDecision
{
public int Def_选择攻击方式;
public int Def_是否需要切换武器攻击;
public int Def_是否需要使用特殊物品1;
public int Def_是否需要使用特殊物品2;
public int Def_选择闪避方式;
public int Def_选择防御方式;
public int Def_选择挣脱方式;
public int Def_选择战斗方式;
public int Def_选择装备;
}
public class BattleAction
{
public int Def_攻击动作;
public int Def_移动;
public int Def_切换武器;
public int Def_使用物品;
public int Def_闪避动作;
public int Def_跳跃动作;
public int Def_防御动作;
public int Def_技能动作;
public int Def_挣脱动作;
}
public class BattleBehaviour
{
}
public enum AttackType
{
Light,
Heavy,
Charge,
Execute,
Spectial1,
Spectial2,
Spectial3,
SKill1,
SKill2,
Ultimate,
}