角色基础属性系统开发
在大多数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);
}
}
}
案例只是最开始,需求还不太全时的开发,随着项目进行的深度,会在现在的基础上进行二次开发,还会添加一些特定的需求,并会在现有的代码上添加功能代码,甚至重构。文中涉及的一些内容或许不全,期待有心人的交流!!!