仿Dota2战斗属性系统

21 篇文章 1 订阅
17 篇文章 0 订阅

1.属性的类型:

public enum AttributeType : byte
{
    Hp = 0,//血量
    Mp = 1,//魔量
    PhyAtk = 2,//物理攻击
    PhyDef = 3,//物理抗性(护甲)
    MagicDef = 4,//魔抗
    HpRecover = 5,//Hp 恢复
    MpRecover = 6,//Mp 恢复
    AtkSpeed = 7,//攻击速度
    AtkCd = 8,//攻击间隔
    AtkRange = 9,//攻击范围
    Strength = 10,//力量
    Aglie = 11,//敏捷
    Intellect = 12,//智力
}

2.Dota 中属性的特色加成:
//力量: 每点增加19点的生命
//每点提高0.03点 / 秒的生命回复速度
//敏捷: 每7点增加1点的护甲
//每点提升1 % 的攻击速度
//智力: 每点增加13点的魔法
//每点提高0.04点 / 秒的魔法回复速度
3.单个属性块的定义:

[System.Serializable]
public class AttributeItem
{
    public AttributeType type;//属性类型
    public float delValue;//成长数值
    public float maxValue;//最大数值
    public float curValue;//当前数值
    public AttributeItem() { }
    public AttributeItem(AttributeType pType,float pValue,float pDelValue = 0) {
        type = pType;
        curValue = pValue;
        maxValue = pValue;
        delValue = pDelValue;
    }
    public void OnLevelUp(){
        curValue += delValue;
        maxValue += delValue;
    }
    public void OnSetCurValue(float pValue)
    {
        curValue = pValue;
    }
    public void OnAddDeltaValue(float pDelValue,bool pChangeMax)
    {
        curValue += pDelValue;
        if(pChangeMax)
            maxValue += pDelValue;
    }
}

4.完整属性定义:

public enum DamageType : byte
{ 
    PhyDamge = 0,//物理伤害
    MagicDamge = 1,//魔法伤害
    PureDamge = 2,//纯粹伤害,真实伤害
}
public class BattleAttribute
{
    public const float StrengthToHp = 19f;
    public const float StrengthToHpRecover = 0.03f;
    public const float AglieToPhyDef = 0.143f;
    public const float AglieToAtkSpeed = 0.01f;
    public const float IntellectToMp = 13f;
    public const float IntellectToMpRecover = 0.04f;

    private Dictionary<AttributeType, AttributeItem> attributes = new Dictionary<AttributeType, AttributeItem>();
    public static float GetPhyDef(float pDefValue)//护甲减免公式
    {
        return 0.052f * pDefValue / (0.9f + 0.048f * pDefValue);
    }
    public static float GetDamgeValue(BattleAttribute pAtker, BattleAttribute pDefer, DamageType pType,float pValue)
    {
        if (pType == DamageType.PhyDamge)
        {
            var defValue = pDefer.GetAttributeCurValueReal(AttributeType.PhyDef);
            return pValue * (1-GetPhyDef(defValue));
        }
        else if (pType == DamageType.MagicDamge){
            var magicValue = pDefer.GetAttributeCurValueReal(AttributeType.MagicDef);
            return pValue *(1- magicValue*0.01f);
        }
        else{
            return pValue;
        }
    }
    //升级
    public void OnLevelUp() {
        foreach (var temp in attributes)
        {
            temp.Value.OnLevelUp();
        }
    }
    //每秒进行恢复
    public void OnSecondRecover()
    {
        var curHp = GetAttributeCurValueReal(AttributeType.Hp);
        var maxHp = GetAttributeMaxValueReal(AttributeType.Hp);
        if (curHp < maxHp) {
            var hpAddValue = GetAttributeCurValueReal(AttributeType.HpRecover);
            var realValue = curHp + hpAddValue;
            if (realValue > maxHp)
                realValue = maxHp;
            SetAttributeItemValue(AttributeType.Hp,realValue);
        }
        var curMp = GetAttributeCurValueReal(AttributeType.Mp);
        var maxMp = GetAttributeMaxValueReal(AttributeType.Mp);
        if (curMp < maxMp){
            var mpAddValue = GetAttributeCurValueReal(AttributeType.MpRecover);
            var realValue = curMp + mpAddValue;
            if (realValue > maxMp)
                realValue = maxMp;
            SetAttributeItemValue(AttributeType.Mp, realValue);
        }
    }
    public void AddAttributeItemValue(AttributeType pAttributeType, float pAdValue,bool pChangeMax)
    {
        attributes[pAttributeType].OnAddDeltaValue(pAdValue, pChangeMax);
    }
    public void SetAttributeItemValue(AttributeType pAttributeType ,float pValue)
    {
        attributes[pAttributeType].OnSetCurValue(pValue);
    }
    public float GetAttributeMaxValueReal(AttributeType pAttributeType)
    {
        float value = GetAttributeMaxValue(pAttributeType);
        if (pAttributeType == AttributeType.Hp)
        {
            var strengValue = GetAttributeCurValue(AttributeType.Strength);
            value += strengValue * StrengthToHp;
        }
        else if (pAttributeType == AttributeType.Mp)
        {
            var IntellectValue = GetAttributeCurValue(AttributeType.Intellect);
            value += IntellectValue * IntellectToMp;
        }
        return value;
    }
    public float GetAttributeCurValueReal(AttributeType pAttributeType)
    {
        float value = GetAttributeCurValue(pAttributeType);
        if (pAttributeType == AttributeType.HpRecover)
        {
            var strengValue = GetAttributeCurValue(AttributeType.Strength);
            value += strengValue * StrengthToHpRecover;
        }
        else if (pAttributeType == AttributeType.MpRecover)
        {
            var intellValue = GetAttributeCurValue(AttributeType.Intellect);
            value += intellValue * IntellectToMpRecover;
        }
        else if (pAttributeType == AttributeType.PhyDef)
        {
            var aglieValue = GetAttributeCurValue(AttributeType.Aglie);
            value += aglieValue * AglieToPhyDef;
        }
        else if (pAttributeType == AttributeType.AtkCd)
        {
            var aglieValue = GetAttributeCurValue(AttributeType.Aglie);
            var atkSpeed = GetAttributeCurValue(AttributeType.AtkSpeed);
            value = value / (1 + (aglieValue + atkSpeed) * AglieToAtkSpeed);
        }
        return value;
    }
    private float GetAttributeCurValue(AttributeType pAttributeType)
    {
        return attributes[pAttributeType].curValue;
    }
    private float GetAttributeMaxValue(AttributeType pAttributeType)
    {
        return attributes[pAttributeType].maxValue;
    }
    public void AddAttributeItem(AttributeItem pAttributeItem)
    {
        if (!attributes.ContainsKey(pAttributeItem.type))
        {
            attributes.Add(pAttributeItem.type, pAttributeItem);
        }
    }

}

其中的护甲系统减免值得研究:

    public static float GetPhyDef(float pDefValue)//护甲减免公式
    {
        return 0.052f * pDefValue / (0.9f + 0.048f * pDefValue);
    }

5.列举几个属性模板

public class AttributeModel 
{
    public int Hp = 450;
    public int Mp = 300;
    public int PhyAtk = 50;
    public int PhyDef = 3;
    public int MagicDef = 15;
    public float HpRecover = 1.5f;
    public float MpRecover = 0.5f;
    public float AtkSpeed = 0;
    public float AtkCd = 1.7f;
    public float AtkRange = 3;
    public int Strength = 18;
    public int Aglie = 12;
    public int Intellect = 23;
    public float StrengthGrow = 2.1f;
    public float AglieGrow = 1.7f;
    public float IntellectGrow = 2.5f;
    public BattleAttribute GetBattleAttribute()
    {
        var battleAttribute = new BattleAttribute();
        var hp = new AttributeItem(AttributeType.Hp, Hp);
        battleAttribute.AddAttributeItem(hp);
        var mp = new AttributeItem(AttributeType.Mp, Mp);
        battleAttribute.AddAttributeItem(mp);
        var phyAtk = new AttributeItem(AttributeType.PhyAtk, PhyAtk);
        battleAttribute.AddAttributeItem(phyAtk);
        var phyDef = new AttributeItem(AttributeType.PhyDef, PhyDef);
        battleAttribute.AddAttributeItem(phyDef);
        var magicDef = new AttributeItem(AttributeType.MagicDef, MagicDef);
        battleAttribute.AddAttributeItem(magicDef);
        var hpRecover = new AttributeItem(AttributeType.HpRecover, HpRecover);
        battleAttribute.AddAttributeItem(hpRecover);
        var mpRecover = new AttributeItem(AttributeType.MpRecover, MpRecover);
        battleAttribute.AddAttributeItem(mpRecover);
        var atkSpeed = new AttributeItem(AttributeType.AtkSpeed, AtkSpeed);
        battleAttribute.AddAttributeItem(atkSpeed);
        var atkCD = new AttributeItem(AttributeType.AtkCd, AtkCd);
        battleAttribute.AddAttributeItem(atkCD);
        var atkRange = new AttributeItem(AttributeType.AtkRange, AtkRange);
        battleAttribute.AddAttributeItem(atkRange);
        var strength = new AttributeItem(AttributeType.Strength, Strength, StrengthGrow);
        battleAttribute.AddAttributeItem(strength);
        var aglie = new AttributeItem(AttributeType.Aglie, Aglie, AglieGrow);
        battleAttribute.AddAttributeItem(aglie);
        var intellect = new AttributeItem(AttributeType.Intellect, Intellect, IntellectGrow);
        battleAttribute.AddAttributeItem(intellect);
        return battleAttribute;
    }
}

public static class AttributeDef
{
    public static Dictionary<int, AttributeModel> allModelData = new Dictionary<int, AttributeModel>() {
        { 1,new AttributeModel(){ 
            Hp = 450,Mp = 300,PhyAtk = 50,PhyDef = 3,MagicDef = 15,HpRecover = 1.5f,MpRecover = 0.5f,AtkCd = 1.7f, AtkSpeed = 0,AtkRange = 3,
            Strength =18, Aglie = 12,Intellect = 23,StrengthGrow = 2.1f,AglieGrow = 1.7f,IntellectGrow = 2.5f
        } },
        { 2,new AttributeModel(){
            Hp = 100,Mp = 200,PhyAtk = 30,PhyDef = 1,MagicDef = 0,HpRecover = 1,MpRecover = 0.2f,AtkCd = 2,AtkSpeed = 0,AtkRange = 3,
            Strength = 0, Aglie = 0,Intellect = 0,StrengthGrow = 0,AglieGrow = 0,IntellectGrow = 0
        } }
    };
    public static BattleAttribute GetBattleAttribute(int pModelId)
    {
        if (allModelData.ContainsKey(pModelId))
        {
            return allModelData[pModelId].GetBattleAttribute();
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值