目录为Assets/Scripts/ConfigReader目录下
MapLoadConfig.cs
这个文件主要是从config中读取并持有地图信息。
先来看看这个config文件长什么样:
Assets/Resources/Config/MapLoadCfg.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MapLoadCfg xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<info MapID="1001">
<LoadScene>pvp_001</LoadScene>
<MiniMap>MiniMap_001</MiniMap>
<NameCn>圣光营地</NameCn>
<ACameraPos>1</ACameraPos>
<BCameraPos>6</BCameraPos>
<ShowPic>135</ShowPic>
<PlayerNum>6</PlayerNum>
<PlayerMode>3V3</PlayerMode>
<ShopID>1001</ShopID>
<CameraType>2</CameraType>
<IsAI>1</IsAI>
<IsNormal>1</IsNormal>
<IsRank>1</IsRank>
<IsTrain>0</IsTrain>
<IsDungeon>0</IsDungeon>
</info>
<info MapID="1002">
<LoadScene>pvp_002</LoadScene>
<MiniMap>MiniMap_002</MiniMap>
<NameCn>奥斯深渊</NameCn>
<ACameraPos>15</ACameraPos>
<BCameraPos>20</BCameraPos>
<ShowPic>133</ShowPic>
<PlayerNum>6</PlayerNum>
<PlayerMode>3V3</PlayerMode>
<ShopID>1001</ShopID>
<CameraType>1</CameraType>
<IsAI>1</IsAI>
<IsNormal>1</IsNormal>
<IsRank>1</IsRank>
<IsTrain>0</IsTrain>
<IsDungeon>0</IsDungeon>
</info>
<info MapID="1000">
<LoadScene>pvp_000</LoadScene>
<MiniMap>MiniMap_002</MiniMap>
<NameCn>奥斯深渊新手</NameCn>
<ACameraPos>100</ACameraPos>
<BCameraPos>105</BCameraPos>
<ShowPic>133</ShowPic>
<PlayerNum>6</PlayerNum>
<PlayerMode>3V3</PlayerMode>
<ShopID>1001</ShopID>
<CameraType>1</CameraType>
<IsAI>0</IsAI>
<IsNormal>0</IsNormal>
<IsRank>0</IsRank>
<IsTrain>1</IsTrain>
<IsDungeon>0</IsDungeon>
</info>
</MapLoadCfg>
然后是代码:
using System;
using UnityEngine;
using System.Xml;
using System.Collections.Generic;
public enum EBattleMatchType
{
EBMT_NONE,
//人机
EBMT_Ai,
//普通
EBMT_Normal,
//天梯
EBMT_Rank,
//新手
EBMT_Train,
//副本
EBMT_Dungeon,
}
//主要是从config中读取并持有地图信息
//继承单例
public class MapLoadConfig: Singleton<MapLoadConfig>
{
//uint:mapID
//MapInfo:MapInfo
//目前来说,这个项目里面有三个Map
private Dictionary<uint, MapInfo> mMapList = new Dictionary<uint, MapInfo>();
private XmlDocument mXmlDoc = null;
//构造函数
public MapLoadConfig()
{
//编辑器内的目录为Assets/Resources/Config
ReadConfig ("Config/MapLoadCfg");
}
//根据MapId来取得Map信息
public MapInfo GetMapInfo(uint id)
{
if (mMapList.ContainsKey(id))
{
return mMapList [id];
}
return null;
}
//根据地图名称来获取Map信息
public MapInfo GetMapInfo(string name)
{
foreach (MapInfo info in mMapList.Values)
{
if (info.mLoadScene == name)
{
return info;
}
}
return null;
}
//通过匹配模式找地图
//把类型是type的地图全部返回
//这里说明每一个匹配模式可以从多张地图中选择一张来玩
public List<MapInfo> GetMapList(EBattleMatchType type)
{
List<MapInfo> mapList = new List<MapInfo> ();
foreach (MapInfo info in mMapList.Values)
{
bool bIs = false;
switch(type)
{
case EBattleMatchType.EBMT_Normal:
bIs = info.mIsNormal;
break;
case EBattleMatchType.EBMT_Ai:
bIs = info.mIsAI;
break;
case EBattleMatchType.EBMT_Rank:
bIs = info.mIsRank;
break;
case EBattleMatchType.EBMT_Train:
bIs = info.mIsTrain;
break;
case EBattleMatchType.EBMT_Dungeon:
bIs = info.mIsDungeon;
break;
case EBattleMatchType.EBMT_NONE:
bIs = true;
break;
}
if (bIs)
{
mapList.Add (info);
}
}
return mapList;
}
//载入配置表
public void ReadConfig(string xmlFilePath)
{
//ResourcesManager部分的东西
ResourceUnit xmlfileUnit = ResourcesManager.Instance.loadImmediate (xmlFilePath, ResourceType.ASSET);
TextAsset xmlfile = xmlfileUnit.Asset as TextAsset;
if (!xmlfile)
{
Debug.LogError ("error infos: 没有找到指定的xml文件:" + xmlFilePath);
}
mXmlDoc = new XmlDocument ();
//加载xml
mXmlDoc.LoadXml (xmlfile.text);
//这个文件里其实也只有这个MapLoadCfg节点
XmlNodeList infoNodeList = mXmlDoc.SelectSingleNode ("MapLoadCfg").ChildNodes;
//(XmlNode xNode in infoNodeList)
for (int i = 0; i < infoNodeList.Count; i++)
{
if ((infoNodeList[i] as XmlElement).GetAttributeNode("MapID") == null)
{
continue;
}
//获取MapID
string mapId = (infoNodeList [i] as XmlElement).GetAttributeNode ("MapID").InnerText;
MapInfo mapInfo = new MapInfo ();
mapInfo.mId = Convert.ToUInt32 (mapId);
//读取信息到MapInfo
foreach (XmlElement xEle in infoNodeList[i].ChildNodes)
{
#region 搜索
switch (xEle.Name)
{
case "LoadScene":
mapInfo.mLoadScene = Convert.ToString(xEle.InnerText);
break;
case "MiniMap":
mapInfo.mMiniMap = Convert.ToString(xEle.InnerText);
break;
case "NameCn":
mapInfo.mName = Convert.ToString(xEle.InnerText);
break;
case "ACameraPos":
mapInfo.mACameraPos = Convert.ToString(xEle.InnerText);
break;
case "BCameraPos":
mapInfo.mBCameraPos = Convert.ToString(xEle.InnerText);
break;
case "ShowPic":
mapInfo.mShowPic = Convert.ToString(xEle.InnerText);
break;
case "PlayerNum":
mapInfo.mPlayerNum = Convert.ToInt32(xEle.InnerText);
break;
case "PlayerMode":
mapInfo.mPlayerMode = Convert.ToString(xEle.InnerText);
break;
case "CameraType":
mapInfo.mCameraType = Convert.ToInt32(xEle.InnerText);
break;
case "IsAI":
mapInfo.mIsAI = Convert.ToBoolean(Convert.ToInt32(xEle.InnerText));
break;
case "IsNormal":
mapInfo.mIsNormal = Convert.ToBoolean(Convert.ToInt32(xEle.InnerText));
break;
case "IsRank":
mapInfo.mIsRank = Convert.ToBoolean(Convert.ToInt32(xEle.InnerText));
break;
case "IsTrain":
mapInfo.mIsTrain = Convert.ToBoolean(Convert.ToInt32(xEle.InnerText));
break;
case "IsDungeon":
mapInfo.mIsDungeon = Convert.ToBoolean(Convert.ToInt32(xEle.InnerText));
break;
case "ShopID":
mapInfo.mShopID = Convert.ToInt32(xEle.InnerText);
break;
}
#endregion
}
mMapList.Add (mapInfo.mId, mapInfo);
}
}
}
//与MapLoadCfg配置文件里的数据对应
public class MapInfo
{
public uint mId; //地图ID
public string mName; //地图名
public string mLoadScene; //对应场景资源
public string mMiniMap; //对应小地图
public string mACameraPos; //基地爆炸相机移动目标点A
public string mBCameraPos; //基地爆炸相机移动目标点B
public string mShowPic; //UI地图
public int mPlayerNum; //总人数
public string mPlayerMode; //战争模式2v2
public int mCameraType; //相机类型: 1:斜45度 2:水平
public bool mIsAI; //是否人机
public bool mIsNormal; //是否普通
public bool mIsRank; //是否天梯
public bool mIsTrain; //是否新手
public bool mIsDungeon; //是否副本
public int mShopID;
}