开发ARPG游戏的角色基础属性系统

                                                                                                             角色基础属性系统开发

在大多数ARPG游戏里面有很多角色,每个角色都有自己的一些基础属性,根据我以往的游戏体验经验,我来总结一下:

所有角色共有的状态信息:

1.当前生命值

2.最大生命值

3.当前魔法值

4.最大魔法值

5.伤害基数

6.攻击速度

7.攻击距离

8.受伤

9.死亡

不管主角还是游戏中的一些怪物,都拥有以上的这些状态,那我们可以提取一个共同的父类,就叫角色状态类CharacterStatus,主角和其他怪物可能还有其他的一些属性和行为,他们可以继承我们这个共有的父类,新增的一些属性和行为可以在自己的类里面扩展。

那我们现在写一下这个CharacterStatus类。

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//用命名空间的好处是方便代码模块的管理

namespace ARPG.Character

{

    /// <summary>

    /// 角色状态(表达所有角色共同的状态信息)

    /// </summary>

    public abstract class CharacterStatus : MonoBehaviour

    {

        /// <summary> 生命 </summary>

        public int hP = 100;

        /// <summary> 最大生命 </summary>

        public int maxHp = 100;

        /// <summary> 魔法值 </summary>

        public int sp = 100;

        /// <summary> 最大魔法值</summary>

        public int MaxSp = 100;

        /// <summary> 伤害基值 </summary>

        public int damage = 100;

        /// <summary> 攻击速度 </summary>

        public int attackSpeed = 5;

        /// <summary> 主技能攻击距离 </summary>

        public int attackDistance = 2;

 

        #region 行为

        // 用虚方法的目的是子类可以重写父类的方法

        

        /// <summary> 受伤 模板方法 </summary>

        public virtual void OnDamage(int damage, GameObject killer)

        {

            hP -= damage;

            if (hP <= 0)

            {

                Dead(killer);

            }

        }

        /// <summary>

        /// 死亡

        /// </summary>

        /// <param name="killer">杀手</param>

        public virtual void Dead(GameObject killer)

        {

 

        }

 

        #endregion

    }

}


玩家除了拥有以上的属性和行为,还拥有一些别的属性和行为,总结一下有:

1.防御

2.等级

3.力量

4.智力

5.经验值

6.最大经验值

7.升级

8.收集经验值

我把玩家的状态类叫PlayerStatus,那根据以上信息,我们把玩家状态的属性和行为也写一下吧!

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

namespace ARPG.Character

{

    /// <summary>

    /// 玩家状态类,比角色状态类多了一些属性和行为

    /// </summary>

    public class PlayerStatus : CharacterStatus

    {

        //防御

        public int defence = 1;

        //等级

        public int level = 1;

        //力量

        public int force = 10;

        //智力

        public int intellect = 10;

        //经验值

        public int exp = 1;

        //最大经验值

        public int maxExp = 10;

        //升级

        public void LevelUp()

        { }

        //收集经验值

        public void CollectExp(int exp)

        {

            this.exp += exp;

        }

        /// <summary>

        /// 受伤方法,因为玩家有防御属性,所以受伤方法得重写

        /// </summary>

        /// <param name="damage"></param>

        /// <param name="killer">杀手</param>

        public override void OnDamage(int damage, GameObject killer)

        {

            var damageVal = damage - defence;

            if (damageVal > 0)

            {

                hP -= damageVal;

            }

            if (hP <= 0)

            {

                Dead(killer);

            }

        }

        public override void Dead(GameObject killer)

        {

           //播放自身死亡动画

            //UI部分死亡处理

        }

    }

}

 

经过分析,我发现小怪除了共同的状态属性之外,也有自己独特的状态属性和行为,如下:

1.防御值

2.躲避值

3.死亡后贡献的经验值

小怪状态类就定义为MonsterStatus,那我把它的类写一下

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

namespace  ARPG.Character

{

public class MonsterStatus : CharacterStatus {

    //防御值

    public int defence ;

    //躲避值

    public int miss;

    //死亡后提供的经验值

    public int giveExp;

 

    /// <summary>

    /// 重写受到伤害的方法

    /// </summary>

    /// <param name="damage">伤害值</param>

    /// <param name="killer">杀手</param>

    public override void OnDamage(int damage, GameObject killer)

    {

        var damageVal = damage - defence;

        if (damageVal > 0)

        {

            hP -= damageVal;

        }

        if (hP <= 0)

        {

            Dead(killer);

        }

    }

    /// <summary>

    /// 重写死亡的方法,小怪死后给玩家提供经验值

    /// </summary>

    /// <param name="killer"></param>

    public override void Dead(GameObject killer)

    {

        var status = killer.GetComponent<PlayerStatus>();

        if (status != null)

        {

            status.CollectExp(this.giveExp);

        }

        //播放死亡动画,涉及到动画组件,暂时未写,随着开发的深度,没写的都要回过头补充的,暂时先用物体销毁代替

        GameObject.Destroy(this.gameObject, 3f);

    }

}

}


    案例只是最开始,需求还不太全时的开发,随着项目进行的深度,会在现在的基础上进行二次开发,还会添加一些特定的需求,并会在现有的代码上添加功能代码,甚至重构。文中涉及的一些内容或许不全,期待有心人的交流!!!

 


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值