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;
}
}