第九章 战斗系统(Combat System)
在SRPG中,大多数情况是指角色与角色之间的战斗。而这种战斗一般有两种模式:
-
地图中直接战斗;
-
有专门的战斗场景。
这两种模式的战斗在数据上没有任何区别,只有战斗动画的区别。
就像之前描述的,SRPG也是RPG,所以战斗方式和回合制RPG的战斗几乎是相同的。主要区别是RPG每个回合需要手动操作(也有自动战斗的),直到战斗结束;而SRPG是自动战斗,且多数情况只有一个回合(额外回合也是由于技能、物品或剧情需要)。且RPG多数是多人战斗,而SRPG多数是每边就一个。
我们这一章就来写一个战斗系统。
文章目录
四 计算战斗数据II(Calculate Combat Data II)
在之前,我们只计算了一般情况下的战斗数据,这一节,我们来扩充它,让它可以计算其它种类的数据。
1 分离每一次行动(Battle Action)
在计算中,我们曾经:
-
public void BattleBegin()
中计算了准备阶段的数据; -
private void CalcBattle(CombatVariable atkVal, CombatVariable defVal)
中计算了攻击阶段的数据。
我们将这些计算方式分离出Combat
,单独建立一个类来存储这些方法。
创建类BattleAction
:
using UnityEngine;
namespace DR.Book.SRPG_Dev.CombatManagement
{
public enum BattleActionType
{
Unknow,
Prepare,
Attack,
MageAttack,
Heal,
// 其它自定义类型
}
public abstract class BattleAction : ScriptableObject
{
private string m_Message = "Unknow battle message.";
public string message
{
get {
return m_Message; }
protected set {
m_Message = value; }
}
public abstract BattleActionType actionType {
get; }
public abstract CombatStep CalcBattle(Combat combat, CombatVariable atkVal, CombatVariable defVal);
public abstract bool IsBattleEnd(Combat combat, CombatVariable atkVal, CombatVariable defVal);
public sealed override string ToString()
{
return m_Message;
}
}
}
而在Combat
中,我们只需要调用这个类就可以了。
为了能更好的控制它们,首先需要存储它们,在Combat
中添加:
public BattleAction[] m_BattleActions;
private Dictionary<BattleActionType, BattleAction> m_BattleActionDict = new Dictionary<BattleActionType, BattleAction>();
private void Awake()
{
if (m_BattleActions != null && m_BattleActions.Length > 0)
{
for (int i = 0; i < m_BattleActions.Length; i++)
{
if (m_BattleActions[i] == null)
{
continue;
}
BattleAction action = m_BattleActions[i];
if (m_BattleActionDict.ContainsKey(action.actionType))
{
Debug.LogWarningFormat(
"Battle Action {0} is exist. OVERRIDE.",
action.actionType.ToString());
}
m_BattleActionDict[action.actionType] = action;
}
}
unit0 = new CombatUnit(0);
unit1 = new CombatUnit(1);
steps = new List