怪物配置

怪物配置V1

1
2
3
4
5
6
7
8
9
10
11
12
<?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>
</item>
<item ID="1002">
<mName>地狱魔卫</mName>
<resPath>PrefabNPC/MonsterBoss_1</resPath>
</item>
<item/>
</root>

怪物的路径写在配置文件里,是为了动态加载用?

修改地图配置map.xml,为地图增加怪物出生点位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<item ID="10000">
<mapName>圣光主城</mapName>
<sceneName>sceneMainCity</sceneName>
<power>0</power>
<mainCamPos>17.4,7,50</mainCamPos>
<mainCamRota>45,135,0</mainCamRota>
<playerBornPos>22,-1.1,45</playerBornPos>
<playerBornRota>0,0,0</playerBornRota>
</item>
<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|1001,-7.55,13.1,3,0#|1001,18.86,13.6,3.7,-107.3|1001,14.35,13.35,5.95,-117.4|1001,15.11,13.35,1.63,-66.1#|1001,18.16,8.8,32,188|1001,15.38,8.8,30.8,145.5|1001,15.38,8.8,40.7,173.3|1001,9,8.9,38.6,145.5|1001,15.38,8.8,40.7,173.3|1001,9,8.9,38.6,145.5|2001,11.4,8.85,41,142</monsterList>
</item>
</root>

配置解析

我们在读取地图配置里面的monsterList时,类似之前我们的TaskRewardData配置,我们将长字符串解析到MonsterData类里,然后在MapCfg类中缓存一个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
case "monsterList":
{
string[] valArr = element.InnerText.Split('#');
for (int waveIndex = 0; waveIndex < valArr.Length; waveIndex++)
{
if (waveIndex == 0) continue;
string[] tempArr = valArr[waveIndex].Split('|');
for (int j = 0; j < tempArr.Length; j++)
{
if(j == 0) continue;
string[] arr = tempArr[j].Split(",");
MonsterData md = new MonsterData()
{
ID = int.Parse(arr[0]),
mWave = waveIndex,
mIndex = j,
mCfg = GetMonsterCfg(int.Parse(arr[0])),//注意这里不要写成ID了,要写成int.Parse(arr[0])
mBornPos = new Vector3(float.Parse(arr[1]), float.Parse(arr[2]), float.Parse(arr[3])),
mBornRota = new Vector3(0, float.Parse(arr[4]), 0)
};
mapCfg.monsterList.Add(md);//注意列表要先new 出来
}
}
}
break;

如果感觉配置中monsterList的数据较长,我们可以像skillmove那样将属于List的配置数据做成一个新的表格,然后使用ID将两个配置表关联起来。

怪物相关API

怪物Controller

1
2
3
4
5
6
namespace DarknessWarGodLearning
{
public class MonsterController : Controller
{
}
}

PlayerController中对characterController的引用提到父类Controller

怪物Entity

1
2
3
4
5
6
namespace DarknessWarGodLearning
{
public class EntityMonster : EntityBase
{
}
}

怪物prefab挂载Monster Controller脚本和Character Controller组件,调整好相关参数并赋值。

BattleMgr中添加怪物加载的API

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
MapCfg mapCfg;

public void LoadMonsterByWaveID(int waveID)
{
for (int i = 0; i < mapCfg.monsterList.Count; i++)
{
MonsterData md = mapCfg.monsterList[i];
if(md.mWave == waveID)
{
GameObject m = resSvc.LoadPrefab(md.mCfg.resPath, true);
m.transform.localPosition = md.mBornPos;
m.transform.localEulerAngles = md.mBornRota;
m.transform.localScale = Vector3.one;

m.name = "m" + md.mWave + "_" + md.mIndex;

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

};
MonsterController mc = m.GetComponent<MonsterController>();
mc.Init();
em.controller = mc;

m.SetActive(false);
}
}
}

MapMgr

MapMgr需要引用BattleMgr,我们在BattleMgr里面注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using UnityEngine;

namespace DarknessWarGodLearning
{
public class MapMgr : MonoBehaviour
{
private int waveIndex = 1;//默认生成第一波怪物
private BattleMgr battleMgr;
public void InitMgr(BattleMgr battle)//在`BattleMgr`里面注入
{
battleMgr = battle;

//实例化第一批怪物
battleMgr.LoadMonsterByWaveID(waveIndex);

PECommon.Log("Init MapMgr Done");
}
}
}