2015-01-26 16:35:47 chaixinke 阅读数 546
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22599 人正在学习 去看看 姜雪伟

Unity3D读取XML文档信息
分类: Unity3D XML C# 5327人阅读 评论(0)收藏 举报
  1. using System;  
  2. using UnityEngine;  
  3. using System.IO;  
  4. using System.Xml;  
  5. using System.Linq;  
  6. using System.Text;  
  7. using System.Collections.Generic;  
  8.   
  9.   
  10. namespace Address  
  11. {  
  12.     /// <summary>  
  13.     /// 地址数据  
  14.     /// </summary>  
  15.     public class AddressData  
  16.     {  
  17.          
  18.   
  19.           
  20.           
  21.   
  22.         /// <summary>  
  23.         ///当前城市ID  
  24.         /// </summary>  
  25.         public static string _nowProvinceId;  
  26.   
  27.   
  28.         /// <summary>  
  29.         /// 所有省名字  
  30.         /// </summary>  
  31.         public static List<string> allProvinceName = new List<string>();  
  32.   
  33.           
  34.         /// <summary>  
  35.         /// 所有城市id  
  36.         /// </summary>  
  37.         public List<string> allCityId = new List<string>();  
  38.   
  39.         ///<summary>  
  40.         ///所有城市名字  
  41.         ///</summary>  
  42.         public List<string> allCityName = new List<string>();  
  43.   
  44.         public static string localUrl = Application.dataPath + "/XMLFile1.xml";  
  45.   
  46.         /// <summary>  
  47.         /// 加载xml文档  
  48.         /// </summary>  
  49.         /// <returns></returns>  
  50.         public static  XmlDocument ReadAndLoadXml()  
  51.         {  
  52.             XmlDocument doc = new XmlDocument();  
  53.             Debug.Log("加载xml文档");  
  54.             doc.Load(localUrl);  
  55.             return doc;  
  56.   
  57.         }  
  58.   
  59.   
  60.   
  61.         /// <summary>  
  62.         /// 从本地加载xml并获取所有省的名字  
  63.         /// </summary>  
  64.         /// <param name="url"></param>  
  65.         /// <returns></returns>  
  66.         public static List<string> GetAllProvinceName()  
  67.         {  
  68.             List<string> _allProvinceName = new List<string>();  
  69.   
  70.             XmlDocument xmlDoc = ReadAndLoadXml();  
  71.   
  72.             //所有province节点  
  73.             XmlNode provinces = xmlDoc.SelectSingleNode("province");  
  74.   
  75.             foreach (XmlNode province in provinces)  
  76.             {  
  77.                 XmlElement _province = (XmlElement)province;  
  78.                   
  79.                 //所有provinceName添加到列表  
  80.                 allProvinceName.Add(_province.GetAttribute("name"));  
  81.                   
  82.             }  
  83.             Debug.Log("所有省数目"+allProvinceName.Count);  
  84.             _allProvinceName = allProvinceName;  
  85.   
  86.             return _allProvinceName;  
  87.         }  
  88.   
  89.         /// <summary>  
  90.         /// 根据当前省ID返回当前省的所有城市名  
  91.         /// </summary>  
  92.         /// <param name="nowProvinceId"></param>  
  93.         /// <returns></returns>  
  94.         public static List<string> GetAllCityNameByNowProvinceId(string nowProvinceId)  
  95.         {  
  96.   
  97.             List<string> nowAllCityName = new List<string>();  
  98.   
  99.             XmlDocument xmlDoc = ReadAndLoadXml();  
  100.   
  101.             //所有province节点  
  102.             XmlNode provinces = xmlDoc.SelectSingleNode("province");  
  103.   
  104.             foreach (XmlNode province in provinces)  
  105.             {  
  106.                 XmlElement _province = (XmlElement)province;  
  107.                   
  108.                 //当前城市id  
  109.                 if (nowProvinceId == _province.GetAttribute("id"))  
  110.                 {  
  111.                     foreach (XmlElement city in _province.ChildNodes)  
  112.                     {  
  113.                         XmlElement _city = (XmlElement)city;  
  114.                         //当前城市的所有cityName添加到列表  
  115.                         nowAllCityName.Add(_city.GetAttribute("name"));  
  116.                     }  
  117.                 }  
  118.   
  119.             }  
  120.   
  121.             return nowAllCityName;  
  122.         }  
  123.   
  124.         /// <summary>  
  125.         /// 根据省的ID返回省的名字  
  126.         /// </summary>  
  127.         /// <param name="provinceId"></param>  
  128.         /// <returns></returns>  
  129.         public static string GetProvinceName(string provinceId)  
  130.         {  
  131.             string _provinceName = "";  
  132.   
  133.             XmlDocument xmlDoc = ReadAndLoadXml();  
  134.   
  135.             //所有province节点  
  136.             XmlNode provinces = xmlDoc.SelectSingleNode("province");  
  137.   
  138.             foreach (XmlNode province in provinces)  
  139.             {  
  140.                 XmlElement _province = (XmlElement)province;  
  141.   
  142.   
  143.                 if (provinceId == _province.GetAttribute("id"))  
  144.                 {  
  145.                     //获取实际省名  
  146.                     _provinceName= _province.GetAttribute("name");  
  147.   
  148.                 }  
  149.             }  
  150.   
  151.   
  152.             return _provinceName;  
  153.         }  
  154.   
  155.         /// <summary>  
  156.         /// 根据城市ID返会城市名字  
  157.         /// </summary>  
  158.         /// <param name="cityId"></param>  
  159.         /// <returns></returns>  
  160.         public static string GetCityName(string cityId)  
  161.         {  
  162.             string cityName="";  
  163.   
  164.             XmlDocument xmlDoc = ReadAndLoadXml();  
  165.   
  166.             //所有province节点  
  167.             XmlNode provinces = xmlDoc.SelectSingleNode("province");  
  168.   
  169.             foreach (XmlNode province in provinces)  
  170.             {  
  171.                 XmlElement _province = (XmlElement)province;  
  172.   
  173.   
  174.                 if (_nowProvinceId == _province.GetAttribute("id"))  
  175.                 {  
  176.                     foreach (XmlElement city in _province.ChildNodes)  
  177.                     {  
  178.                         XmlElement _city = (XmlElement)city;  
  179.   
  180.                         if (cityId == _city.GetAttribute("id"))  
  181.                         {  
  182.                             //获取实际城市名  
  183.                             cityName = _city.GetAttribute("name");  
  184.                         }  
  185.                     }  
  186.   
  187.                 }  
  188.             }  
  189.             return cityName;  
  190.         }  
  191.     }  
  192.     
  193. }  



  1. using UnityEngine;  
  2.   
  3. using System.Collections;  
  4. using System.Collections.Generic;  
  5. using Address;  
  6.   
  7. public class FinalTest : MonoBehaviour {  
  8.   
  9.     // Use this for initialization  
  10.     void Start ()   
  11.     {  
  12.         List<string> allp = new List<string>();  
  13.         allp = AddressData.GetAllProvinceName();  
  14.           
  15.         Debug.Log(AddressData.allProvinceName.Count);  
  16.         Debug.Log(allp.Count);  
  17.   
  18.         List<string> allCity = new List<string>();  
  19.         allCity = AddressData.GetAllCityNameByNowProvinceId("01");  
  20.         Debug.Log(allCity.Count);  
  21.         for (int i = 0; i < allCity.Count; i++)  
  22.         {  
  23.             Debug.Log(allCity[i]);  
  24.         }  
  25.   
  26.         string a = AddressData.GetProvinceName("02");  
  27.         Debug.Log(a);  
  28.     }  
  29.   
  30.     // Update is called once per frame  
  31.     void Update()   
  32.     {  
  33.       
  34.     }  
  35. }  




  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <province>  
  3.   
  4.   <province id ="01" name="江苏">  
  5.     <city id ="01" name ="南京"></city>  
  6.     <city id ="02" name ="镇江"></city>  
  7.     <city id ="03" name ="南通"></city>  
  8.   </province>  
  9.   <province id ="02" name="河南">  
  10.     <city id ="01" name ="郑州"></city>  
  11.     <city id ="02" name ="开封"></city>  
  12.     <city id ="03" name ="洛阳"></city>  
  13.   </province>  
  14.     
  15.   
  16. </province>  
2020-01-19 18:03:28 m0_38116456 阅读数 39
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22599 人正在学习 去看看 姜雪伟
  1. 之前看过很多人总结的unity3d读取XML,各式各样的都有,今天心血来潮,自己也总结一篇供大家参考,如有不当,欢迎大家留言讨论,废话不多说了,进入正题,先上个效果图吧

  1. 编写xnl文档,为了方便各种数据直接转化显示,我特意凑了5种不同的数据类型供大家参考
  2. 新建空物体LoadXml,编写LoadingXML脚本,进行读取文件

以下就是读取的全过程,对需要调取的数据进行封装,并提供get,set方法方便外界调用

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System.IO;

using System.Xml;

 

public class LoadingXML : MonoBehaviour

{

    public static LoadingXML instance;

    private string xmlfilePath;

 

    private int id;

    private string name;

    private byte age;

    private char sex;

    private float grade;

 

    public int Id { get => id; set => id = value; }

    public string Name { get => name; set => name = value; }

    public byte Age { get => age; set => age = value; }

    public char Sex { get => sex; set => sex = value; }

    public float Grade { get => grade; set => grade = value; }

 

    void Awake()

    {

        instance = this;

        //声明xml文件的路径

        xmlfilePath = Application.streamingAssetsPath + "/database.xml";

        if (File.Exists(xmlfilePath))

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlfilePath);

            //得到根节点

            XmlNode xn = xmlDoc.SelectSingleNode("students");

 

            //得到根节点的所有子节点

            XmlNodeList xnl = xn.ChildNodes;

 

            // 将节点转换为元素,便于得到节点的属性值

            foreach (XmlNode xn1 in xnl)

            {

                // 将节点转换为元素,便于得到节点的属性值

                XmlElement xe = (XmlElement)xn1;

                //将读取的数据转化为int

                Id = int.Parse(xe.GetAttribute("Id"));

                Name = xe.GetAttribute("Name").ToString();

                //得到book节点的子节点

                XmlNodeList xnIO = xe.ChildNodes;

                //将读取的数据转化为byte

                Age = byte.Parse(xnIO.Item(0).InnerText);

                //将读取的数据转化为char

                Sex = char.Parse(xnIO.Item(1).InnerText);

                //将读取的数据转化为float

                Grade = float.Parse(xnIO.Item(2).InnerText);

 

            }

        }

        else {

            Debug.Log("weifaxian");

        }

    }

5.在unity3d建立5个text用于显示文本,如下:

6.新建空物体ManagerUI,并编写脚本LoadUIData,下面直接上脚本

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

 

public class LoadUIData : MonoBehaviour

{

    private Text Tx_01;

    private Text Tx_02;

    private Text Tx_03;

    private Text Tx_04;

    private Text Tx_05;

    // Start is called before the first frame update

    void Start()

    {

        Tx_01 = GameObject.Find("Canvas/Tx_01").GetComponent<Text>();

        Tx_02 = GameObject.Find("Canvas/Tx_02").GetComponent<Text>();

        Tx_03 = GameObject.Find("Canvas/Tx_03").GetComponent<Text>();

        Tx_04 = GameObject.Find("Canvas/Tx_04").GetComponent<Text>();

        Tx_05 = GameObject.Find("Canvas/Tx_05").GetComponent<Text>();

        LoadData();

    }

    void LoadData()

    {

        //int转化为string

        Tx_01.text = (LoadingXML.instance.Id).ToString();

        Tx_02.text = LoadingXML.instance.Name;

        //byte转化为string

        Tx_03.text = (LoadingXML.instance.Age).ToString();

        //char转化为string

        Tx_04.text = (LoadingXML.instance.Sex).ToString();

        //float转化为string

        Tx_05.text = (LoadingXML.instance.Grade).ToString();

}

7.运行即可看到效果

2013-07-11 11:00:39 AWNUXCVBN 阅读数 24821
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22599 人正在学习 去看看 姜雪伟
using System;
using UnityEngine;
using System.IO;
using System.Xml;
using System.Linq;
using System.Text;
using System.Collections.Generic;
 
namespace Address
{
	/// <summary>
	/// 地址数据
	/// </summary>
	public class AddressData
	{ 
		/// <summary>
		///当前城市ID
		/// </summary>
		public static string _nowProvinceId;
 
		/// <summary>
		/// 所有省名字
		/// </summary>
		public static List<string> allProvinceName = new List<string>();
 
		/// <summary>
		/// 所有城市id
		/// </summary>
		public List<string> allCityId = new List<string>();

		///<summary>
		///所有城市名字
		///</summary>
		public List<string> allCityName = new List<string>();

		public static string localUrl = Application.streamingAssetsPath + "/XMLFile1.xml";

		/// <summary>
		/// 加载xml文档
		/// </summary>
		/// <returns></returns>
		public static  XmlDocument ReadAndLoadXml()
		{
			XmlDocument doc = new XmlDocument();
			Debug.Log("加载xml文档");
			doc.Load(localUrl);
			return doc; 
		}
 
		/// <summary>
		/// 从本地加载xml并获取所有省的名字
		/// </summary>
		/// <param name="url"></param>
		/// <returns></returns>
		public static List<string> GetAllProvinceName()
		{
			List<string> _allProvinceName = new List<string>();

			XmlDocument xmlDoc = ReadAndLoadXml();

			//所有province节点
			XmlNode provinces = xmlDoc.SelectSingleNode("provinces");

			foreach (XmlNode province in provinces)
			{
				XmlElement _province = (XmlElement)province;

				//所有provinceName添加到列表
				allProvinceName.Add(_province.GetAttribute("name")); 
			}
			Debug.Log("所有省数目"+allProvinceName.Count);
			_allProvinceName = allProvinceName; 
			return _allProvinceName;
		}

		/// <summary>
		/// 根据当前省ID返回当前省的所有城市名
		/// </summary>
		/// <param name="nowProvinceId"></param>
		/// <returns></returns>
		public static List<string> GetAllCityNameByNowProvinceId(string nowProvinceId)
		{ 
			List<string> nowAllCityName = new List<string>(); 
			XmlDocument xmlDoc = ReadAndLoadXml(); 
			//所有province节点
			XmlNode provinces = xmlDoc.SelectSingleNode("provinces"); 
			foreach (XmlNode province in provinces)
			{
				XmlElement _province = (XmlElement)province;

				//当前城市id
				if (nowProvinceId == _province.GetAttribute("id"))
				{
					foreach (XmlElement city in _province.ChildNodes)
					{
						XmlElement _city = (XmlElement)city;
						//当前城市的所有cityName添加到列表
						nowAllCityName.Add(_city.GetAttribute("name"));
					}
				} 
			} 
			return nowAllCityName;
		}

		/// <summary>
		/// 根据省的ID返回省的名字
		/// </summary>
		/// <param name="provinceId"></param>
		/// <returns></returns>
		public static string GetProvinceName(string provinceId)
		{
			string _provinceName = ""; 
			XmlDocument xmlDoc = ReadAndLoadXml(); 
			//所有province节点
			XmlNode provinces = xmlDoc.SelectSingleNode("provinces");

			foreach (XmlNode province in provinces)
			{
				XmlElement _province = (XmlElement)province; 
				if (provinceId == _province.GetAttribute("id"))
				{
					//获取实际省名
					_provinceName= _province.GetAttribute("name"); 
				}
			} 
			return _provinceName;
		}

		/// <summary>
		/// 根据城市ID返会城市名字
		/// </summary>
		/// <param name="cityId"></param>
		/// <returns></returns>
		public static string GetCityName(string cityId)
		{
			string cityName=""; 
			XmlDocument xmlDoc = ReadAndLoadXml(); 
			//根节点
			XmlNode provinces = xmlDoc.SelectSingleNode("provinces");

			foreach (XmlNode province in provinces)
			{
				XmlElement _province = (XmlElement)province; 
				if (_nowProvinceId == _province.GetAttribute("id"))
				{
					foreach (XmlElement city in _province.ChildNodes)
					{
						XmlElement _city = (XmlElement)city;

						if (cityId == _city.GetAttribute("id"))
						{
							//获取实际城市名
							cityName = _city.GetAttribute("name");
						}
					} 
				}
			}
			return cityName;
		}
	}

}


<?xml version="1.0" encoding="utf-8"?>  
<provinces>   
  <province id ="01" name="江苏">  
    <city id ="01" name ="南京"></city>  
    <city id ="02" name ="镇江"></city>  
    <city id ="03" name ="南通"></city>  
  </province>  
  <province id ="02" name="河南">  
    <city id ="01" name ="郑州"></city>  
    <city id ="02" name ="开封"></city>  
    <city id ="03" name ="洛阳"></city>  
  </province>   
</provinces> 


2014-03-01 15:08:14 cheng219101 阅读数 1237
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22599 人正在学习 去看看 姜雪伟
using UnityEngine;
using System.Collections;
using System.IO;
using System.Xml;

public class testXML : MonoBehaviour {
void Start () {
LoadXML();
}
void LoadXML()
{
string path = Application.dataPath+@"/Resources/testXML.xml";
if(File.Exists(path))
{
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNodeList node = doc.SelectSingleNode("Version").ChildNodes;
XmlNodeList xe = node.Item(node.Count-1).ChildNodes;
foreach(XmlElement element in xe)
{
if(element.Name.Equals("details"))
{
Debug.Log("details:"+element.InnerText);
}
}
}
}

}

XML

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE DataAccess[]>   
<Version>  
<item1>
<vname value="1.0.1"></vname>
<details>1111</details>
</item1>
<item2>
<vname value="1.0.2"></vname>
<details>2222</details>
</item2>  
</Version> 

结果:2222

2019-05-23 14:29:14 weixin_42224118 阅读数 265
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22599 人正在学习 去看看 姜雪伟

在Unity3D中读取外部文本文件的方法有很多,这里记录一种读取XML文件的方法。
仅限PC端
首先是XML文件,命名为:xmlData.xml

<item>
       <data1>
         <id>1</id>
         <name>china</name>
         <year>2019</year>
         <sex>男</sex>
       </data1>
       <data2>
         <id>2</id>
         <name>usa</name>
         <year>2017</year>
         <sex>女</sex>
       </data2>
</item>

下面是代码部分:
引用命名空间:

using System.Xml;
using System.IO;
using UnityEngine.UI;

在UI文本中显示读取的数据,创建Text文本显示:

 public Text text1;
 public Text text2;
 public Text text3;
 public Text text4;

读取路径:
这里读取的是存放在StreamingAssets文件中的xml文件。

string filePath = Application.streamingAssetsPath + "/xmlData.xml";

后续代码:

 //检查文件是否存在,并进行实例化
if (File.Exists(filePath))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(filePath);
            XmlNodeList node = xmlDoc.SelectSingleNode("item").ChildNodes;
              //遍历节点
              foreach (XmlElement x1 in node)
            {         
                if (x1.Name == "data1")
                {
                    foreach (XmlElement data1 in x1.ChildNodes)
                    {
                    Debug.LogFormat("Name:{0},InnerText:{1} \n", data1.Name, data1.InnerText);     
                     //以名称进行判断
                     switch (data1.Name)
                     {
                            case "id":
                                text1.text = data1.InnerText;
                                break;
                            case "name":
                                text2.text = data1.InnerText;
                                break;
                            case "year":
                                text3.text = data1.InnerText;
                                break;
                            case "sex":
                                text4.text = data1.InnerText;
                                break;
                        }
                     }
                  }
               } 
            } 

测试:
在这里插入图片描述

在这里插入图片描述
打包后,将StreamingAssets中的xmlData.xml文件进行修改,把2016改为2019,效果如下:

1
成功。

最新 Unity3D 读取XML中的内容代码

博文 来自: luyuncsd123
没有更多推荐了,返回首页