怪物增加属性

修改monster.xml配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<item ID="1001">
<mName>铁甲卫士</mName>
<resPath>PrefabNPC/MonsterSoldier_1</resPath>
<hp>200</hp>
<ad>100</ad>
<ap>80</ap>
<addef>5</addef>
<apdef>10</apdef>
<dodge>5</dodge>
<pierce>5</pierce>
<critical>2</critical>
</item>
<item ID="2001">
<mName>地狱魔卫</mName>
<resPath>PrefabNPC/MonsterBoss_1</resPath>
<hp>800</hp>
<ad>250</ad>
<ap>180</ap>
<addef>55</addef>
<apdef>60</apdef>
<dodge>20</dodge>
<pierce>10</pierce>
<critical>5</critical>
</item>
</root>

我们的怪物为了复用,需要不同的等级配置,而不同的等级配置是与地图相关联的,我们在map.xml配置中写好每个地图怪物的等级,在游戏中进入副本地图时根据怪物的等级信息动态更改怪物的属性。

1
2
3
4
5
6
7
8
9
10
11
<item ID="10001">
<mapName>荒野遗迹</mapName>
<sceneName>sceneOrge</sceneName>
<power>5</power>
<mainCamPos>-13.19,18.87,14.69</mainCamPos>
<mainCamRota>45,135,0</mainCamRota>
<playerBornPos>-10,13.2,11.5</playerBornPos>
<playerBornRota>0,145,0</playerBornRota>
<monsterList>#|1001,-4.39,13.14,3.79,-50,1|1001,-7.55,13.1,3,0,1#|1001,18.86,13.6,3.7,-107.3,2|1001,14.35,13.35,5.95,-117.4,2|1001,15.11,13.35,1.63,-66.1,2#|1001,18.16,8.8,32,188,3|1001,11.8,8.8,30.8,145.5,3|1001,15.38,8.8,40.7,173.3,3|1001,9,8.9,38.6,145.5,3|2001,11.4,8.85,41,142,1</monsterList>
</item>

在map配置的monsterList内,每个monster后面加了一个monster的等级数

怪物属性运算

由于怪物属性受等级影响,所以怪物实体需要重载一下SetBattleProps方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace DarknessWarGodLearning
{
public class EntityMonster : EntityBase
{
public MonsterData md;
public override void SetBattleProps(BattleProps battleProps)
{
int level = md.mLevel;
BattleProps p = new BattleProps
{
hp = battleProps.hp*level,
ad = battleProps.ad*level,
ap = battleProps.ap*level,
addef = battleProps.addef*level,
apdef = battleProps.apdef*level,
dodge = battleProps.dodge*level,
pierce = battleProps.pierce*level,
critical = battleProps.critical*level,

};
BattleProps = p;
HP = p.hp;
}
}
}

和玩家实体同样,在BattleMgr里面完成注入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void LoadMonsterByWaveID(int waveID)
{
for (int i = 0; i < mapCfg.monsterList.Count; i++)
{
MonsterData md = mapCfg.monsterList[i];
if(md.mWave == waveID)
{
//...

EntityMonster em = new EntityMonster
{
battleMgr= this,
stateMgr = stateMgr,
skillMgr = skillMgr,

};
//Monster BattleProp
em.md = md;//+++
em.SetBattleProps(md.mCfg.batProps);//+++

//...
}
}
}

MonsterData中各个数据类的关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MonsterCfg : BaseData<MonsterCfg>
{
public string mName;
public string resPath;
public BattleProps batProps;
}
//MonsterData是mapCfg实例化出来的
public class MonsterData : BaseData<MonsterData>
{
public int mWave;//批次
public int mIndex;//序号
public MonsterCfg mCfg;//根据ID获取monstercfg
public Vector3 mBornPos;
public Vector3 mBornRota;
public int mLevel;
}
public class BattleProps
{
public int hp;
public int ad;
public int ap;
public int addef;
public int apdef;
public int dodge;
public int pierce;
public int critical;
}

伤害运算公式

数据都准备好后,我们终于可以开始实现技能伤害运算了:

修改SkillMgrCalcDamage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
System.Random rd = new System.Random();
private void CalcDamage(EntityBase caster,EntityBase target,SkillCfg skillCfg,int damage)
{
int dmgSum = damage;
if (skillCfg.dmgType == DamageType.AD)
{
//计算闪避
int dodgeNum = PETools.RandomInt(1, 100, rd);
if (dodgeNum <= target.BattleProps.dodge)
{
//UI显示闪避
PECommon.Log("Dodge Rate:"+dodgeNum + "/" +target.BattleProps.dodge);
return;
}
//计算属性加成
dmgSum += caster.BattleProps.ad;
//计算暴击
int criticalNum = PETools.RandomInt(1,100, rd);
if(criticalNum <= caster.BattleProps.critical)
{
//计算暴击增益,在100%到200%之间
float criticalRate = 1 + (PETools.RandomInt(1,100,rd)/100.0f);
dmgSum = (int)criticalRate*dmgSum;
PECommon.Log("Critacal Rate:" + criticalNum + "/" + caster.BattleProps.critical) ;
}
//计算穿甲
//穿甲指的是攻击时无视对方一定百分比的护甲值
int targetCurAddef = (int)((1 - caster.BattleProps.pierce / 100.0f) * target.BattleProps.addef);
dmgSum -= targetCurAddef;



}else if (skillCfg.dmgType == DamageType.AP)
{
//计算属性加成
dmgSum += caster.BattleProps.ap;
//计算魔法抗性
dmgSum -= target.BattleProps.apdef;
}
else { }
//最终伤害,如果小于零则归零
if (dmgSum < 0)
{
dmgSum = 0;
}
}

激活怪物

BattleMgr中使用一个计时来延迟生成怪物

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
      public void InitMgr(int mapid)
{
//...
resSvc.AsyncLoadScene(mapCfg.sceneName, () =>
{
//...

//激活怪物
ActiveCurrentBatchMonsters();

//...
});


}


public void ActiveCurrentBatchMonsters()
{
TimerSvc.Instance.AddTimeTask( tid =>
{
foreach (var item in entityMonsterDic)
{
item.Value.controller.gameObject.SetActive(true);
}
}, 500);
}