SRPG游戏开发(四十二)第九章 战斗系统 - 四 计算战斗数据II(Calculate Combat Data II)

返回总目录

第九章 战斗系统(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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值