[unity实例] 使用xml数据 随机生成名字

159 阅读1分钟

一、通过excel生成xml数据

1. 创造xml模版

  • 制作xml模板格式文件(必须要有两个相同的数据项,否则无法在Excel中进行映射

截屏2023-02-21 上午12.14.57.png

2. 将模版导入excel,通过excel生成新的xml文件 

  • 在Excel中打开自定义菜单:文件-选项-自定义功能区-主选项卡,将开发工具添加到主选项卡。
  • 在开发工具面板里:XML-源-XML映射-添加模版文件
  • 选中源面板里的模版,映射到表格里。
  • 在开发工具面板里:XML-导出

image.png

二、在unity里加载和使用xml数据

1. 加载文件

TextAsset xml = Resources.Load<TextAsset>(filePath);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml.text);

2. 获得xml

  • 获取根节点下的所有子节点的List:
XmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes;
  • 将某一个节点转化为一个XmlElement:
XmlElement ele = nodLst[i] as XmlElement;
  • 从XmlElement里获取名称为"ID"的数据:
string value = ele.GetAttributeNode("ID").InnerText;

3. 具体函数如下

private List<string> surnameLst = new List<string>();//姓
private List<string> manLst = new List<string>();//男名
private List<string> womanLst = new List<string>();//女名

//方法一: 生成xml对应的列表
private void InitRDNameCfg()
{
    TextAsset xml = Resources.Load<TextAsset>(PathDefine.RDNameCfg);
    if (!xml)
    {
        Debug.LogError("xml file:" + PathDefine.RDNameCfg + " not exist");
    }
    else
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml.text);

        //获取根节点下的所有子节点的List
        XmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes;

        for(int i = 0; i < nodLst.Count; i++)
        {
            //将某一个节点转化为一个XmlElement
            XmlElement ele = nodLst[i] as XmlElement;
            //从XmlElement里获取名称为"ID"的数据
            string value = ele.GetAttributeNode("ID").InnerText;
            if(value != null)
            {
                int ID = Convert.ToInt32(value);
                
                foreach( XmlElement e in ele.ChildNodes)
                {
                    switch (e.Name)
                    {
                        case "surname":
                        surnameLst.Add(e.InnerText);
                            break;
                        case "man":
                            manLst.Add(e.InnerText);
                            break;
                        case "woman":
                            womanLst.Add(e.InnerText);
                            break;
                    }
                }
            }
        }
    }
}

#endregion                                           

三、随机生成名字的函数

将以下函数加载到unity中对应的按钮上,即可随机生成名字

 //获得列表里的数据
public string GetRDNameData(bool man = true)
{
    //PETools 会随机返回一个数
    string name = surnameLst[PETools.RDInt(0, surnameLst.Count - 1)];
    if (man)
    {
        name += manLst[PETools.RDInt(0, manLst.Count - 1)];
    }
    else
    {
        name += womanLst[PETools.RDInt(0, womanLst.Count - 1)];
    }
    return name;
}