在游戏开发中,有的单机游戏会用到保存数据到本地,或者根据本地的数据来进行下次的设置。这里,鄙人介绍TXT与xml 的读写。
首先是txt:
新建一个unity工程,创建一个cube,新建一个脚本:CreatTxt挂载到cube上。然后打开脚本。输入一下的代码:
// 脚本功能:指定位置创建一个TXT文本
//此脚本挂载在: cube上
// 初创日期:2017.9.19
// 作者:张曙光
// 第一次修改:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System .IO ;//引入文件流操作命名空间
public class CreatTxt : MonoBehaviour {
// Use this for initialization
void Start () {
CreateFile ("D:/MyTxt.txt","这是你写的信息");
CreateFile ("D:/MyTxt.txt","Hello!I am Jtro!");
}//End of Start
/// <summary>
/// Creates the file.创建文本的方法
/// </summary>
/// <param name="_filePath">File path. 文件的路径</param>
/// <param name="_data">Data. 文件的内容</param>
public void CreateFile (string _filePath ,string _data)
{
StreamWriter sw;
FileInfo fi = new FileInfo (_filePath);
//如果文件不存在
if (!fi.Exists) {
//创建文件
sw = fi.CreateText ();
}
else
{
//打开文件
sw = fi .AppendText ();
}
sw.WriteLine (_data);//以行的形式写入
sw .Write (_data);//首位衔接的方式写入
sw .Close ();//关闭流
sw .Dispose ();//销毁流
}
/// <summary>
/// Destroies the file.销毁创建的文本
/// </summary>
/// <param name="_filePath">File path. 文本的路径</param>
public void DestroyFile (string _filePath)
{
if(File .Exists (_filePath))
{
File.Delete (_filePath);
Debug.Log ("删除文件: "+_filePath);
}
}
然后保存运行:
运行后的截图
下面是文件的读取:
// 脚本功能:指定位置创建一个TXT文本
//此脚本挂载在: cube上
// 初创日期:2017.9.19
// 作者:张曙光
// 第一次修改:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System .IO ;//引入文件流操作命名空间
public class CreatTxt : MonoBehaviour {
List <string>listxt = new List<string> ();
void Awake ()
{
CreateFile ("D:/MyTxt.txt","这是你写的信息");
CreateFile ("D:/MyTxt.txt","Hello!I am Jtro!");
}
// Use this for initialization
void Start () {
StartCoroutine (WWWLoadFile (_filePath:"file:///D:/MyTxt.txt"));
listxt = LoadFile (_filePath:"D:/MyTxt.txt");
foreach (var item in listxt) {
Debug.Log (item );
}
DestroyFile (_filePath:"D:/MyTxt.txt" );
}//End of Start
/// <summary>
/// Creates the file.创建文本的方法
/// </summary>
/// <param name="_filePath">File path. 文件的路径</param>
/// <param name="_data">Data. 文件的内容</param>
public void CreateFile (string _filePath ,string _data)
{
StreamWriter sw;
FileInfo fi = new FileInfo (_filePath);
//如果文件不存在
if (!fi.Exists) {
//创建文件
sw = fi.CreateText ();
}
else
{
//打开文件
sw = fi .AppendText ();
}
sw.WriteLine (_data);//以行的形式写入
//sw .Write (_data);//首位衔接的方式写入
sw .Close ();//关闭流
sw .Dispose ();//销毁流
}
/// <summary>
/// Destroies the file.销毁创建的文本
/// </summary>
/// <param name="_filePath">File path. 文本的路径</param>
public void DestroyFile (string _filePath)
{
if(File .Exists (_filePath))
{
File.Delete (_filePath);
Debug.Log ("删除文件: "+_filePath);
}
}
/// <summary>
/// Loads the file.文件流读取文件信息
/// </summary>
/// <returns>The file. 文件路径</returns>
/// <param name="_filePath">File path.</param>
public List <string>LoadFile (string _filePath)
{
List<string > str = new List<string> ();//实例化
//如果文件不存在,返回空
if (!File .Exists (_filePath))
{
Debug.Log ("文件未找到: " + _filePath);
return null;
}
StreamReader sr;
sr = File.OpenText (_filePath);
string strLine = "";
//如果第一行的内容不为空
while ((strLine= sr.ReadLine ())!=null)
{
str.Add (strLine);//将每一行的内容存入链表中
}
sr.Close ();
sr.Dispose ();
return str;
}
/// <summary>
/// WWWs the load file.WWW的方式读取文件
/// </summary>
/// <returns>The load file.</returns>
/// <param name="_filePath">File path. 文件的地址</param>
public IEnumerator WWWLoadFile (string _filePath)
{
//如果是本地路径,路径前加“file:///”
WWW www = new WWW (_filePath);//实例化
Debug .Log (_filePath);
yield return www;
if (www.error == null) {
Debug.Log (www.text+"WWW");
} else {
Debug.Log ("文本读取错误: "+www .error);
}
}
}
OK,TXT的先介绍到这
下面是xml的使用方法,一样的,新建工程,新建cube,新建一个脚本:XmlData,不继承MonoBehavior。写下如下代码:
// 脚本功能:
//此脚本挂载在:null上
// 初创日期:
// 作者:张曙光
// 第一次修改:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System .Xml .Serialization ;//命名空间,序列化用
/// <summary>
/// Xml data.XML的数据类
/// </summary>
//[XmlRoot ("MyRoot")] //更改节点名称
public class XmlData {
//[XmlElement ("玩家名称")] // 更改子节点名称
public string playName;
//[XmlElement ("等级")]
public int level;
//[XmlIgnore] //忽略
public int gold;
public XmlData() //构造函数
{
playName = "Jtro01";
level = 1;
gold = 100;
}
}
这里的不能改节点名称,不知为何。等我找到原因再修改。
然后新建一个脚本:SerializerXml,编写如下代码:
// 脚本功能:通用的xml读写功能
//此脚本挂载在: cube 上
// 初创日期:2017.9.20
// 作者:张曙光
// 第一次修改:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System .Xml .Serialization ;//引入命名空间,负责把对象序列化到xml,并从xml中反序列化
using System ;
using System .IO ;
public class SerializerXml : MonoBehaviour {
static SerializerXml instance;
/// <summary>
/// Start this instance.单例
/// </summary>
public static SerializerXml Instance
{
get {
if (instance == null)
{
GameObject singleton = new GameObject ();
singleton .name = "SerializerXmlManager";
instance = singleton.AddComponent <SerializerXml > ();
}
return instance;
}
}
//定义一个委托
public delegate void WWWLoadFromXmlEventHandler (object obj);
//WWW加载XML完成事件
public event WWWLoadFromXmlEventHandler onWWWLoadFormXmlOver;
/// <summary>
/// Saves to xml.保存xml
/// </summary>
/// <param name="filePath">File path.文件的路径</param>
/// <param name="sourceObj">Source object.源对象</param>
/// <param name="Type">Type.类型 </param>
/// <param name="xmlRootName">Xml root name.根节点的名字</param>
public void SaveToXml (string filePath ,object sourceObj, Type type = null ,string xmlRootName = null)
{
if(!string .IsNullOrEmpty (filePath )&&sourceObj != null)
{
type = type != null ? type : sourceObj.GetType ();//三元表达式
//三元表达式等同于:
// if (type != null) {
// type = type;
// } else {
// type = sourceObj.GetType ();
// }
using (StreamWriter writer = new StreamWriter (filePath))
{
XmlSerializer xmlSerializer = string.IsNullOrEmpty (xmlRootName) ? new XmlSerializer (type) : new XmlSerializer (type, new XmlRootAttribute (xmlRootName));
xmlSerializer.Serialize (writer, sourceObj);
Debug.Log ("保存成功!");
}
}
}
/// <summary>
/// Loads the form xml.加载xml
/// </summary>
/// <returns>The form xml. </returns>
/// <param name="filePath">File path.xml路径 </param>
/// <param name="type">Type. 反序列化类型</param>
public object LoadFormXml (string filePath,Type type)
{
object result = null;
if (File .Exists (filePath))
{
using (StreamReader reader = new StreamReader (filePath))
{
XmlSerializer xmlSerializer = new XmlSerializer (type);
result = xmlSerializer.Deserialize (reader);
}
}
return result;
}
/// <summary>
/// WWWs the load for xml.WWW的方式加载XML
/// </summary>
/// <param name="_firlUrl">Firl URL. xml的地址</param>
/// <param name="type">Type.反序列化的类型</param>
public void WWWLoadForXml(string _firlUrl,Type type)
{
StartCoroutine (WWW_LoadForXml (_firlUrl ,type));
}
/// <summary>
/// WWW load for xml.WWW的方式加载XML
/// </summary>
/// <returns>The w load for xml.</returns>
/// <param name="_fileUrl">File URL.</param>
/// <param name="type">Type.</param>
IEnumerator WWW_LoadForXml(string _fileUrl ,Type type)
{
object obj = null;
WWW www = new WWW (_fileUrl);
yield return www;
if (www.error == null) {
XmlSerializer xmlSerializer = new XmlSerializer (type);
byte[] b = System.Text.Encoding.UTF8.GetBytes (www.text);
MemoryStream ms = new MemoryStream (b);
obj = xmlSerializer.Deserialize (ms);
ms.Close ();
}
else
{
}
//将加载完成的xml对象发送到监听对象上
if(onWWWLoadFormXmlOver !=null)
{
onWWWLoadFormXmlOver (obj);
}
}
// Use this for initialization
//序列化XML保存实例
void Start () {
// XmlData xmlData = new XmlData ();
// xmlData .playName = "Jtro02";
// xmlData.level = 2;
// xmlData .gold = 200;
// //最关键的一步:序列化生成XML
// SerializerXml .Instance .SaveToXml ("D:/myXml.xml",xmlData);
//反序列读取实例,start里面的方法运行后注释,D盘就有了xml文件了。然后反序列化读取
//非WWW加载
// XmlData xmlData = SerializerXml .Instance .LoadFormXml ("D:/myXml.xml",typeof (XmlData))as XmlData;
// Debug.Log ("name: "+xmlData .playName +"Level: "+xmlData .level+"gold: "+xmlData .gold);
//WWW的加载方式,监听WWW加载完毕事件
SerializerXml .Instance .onWWWLoadFormXmlOver +=onWWWLoadXmlOver;
SerializerXml.Instance.WWWLoadForXml ("file:///D:/myXml.xml", typeof(XmlData));
}//End of Start
void onWWWLoadXmlOver (object obj)
{
XmlData xmlData = obj as XmlData;
Debug.Log ("...name:" + xmlData.playName + " level:" + xmlData.level + " gold:" + xmlData.gold);
//取消监听
SerializerXml .Instance .onWWWLoadFormXmlOver -=onWWWLoadXmlOver;
}
}
然后运行,运行的时候先把start方法中的这一部分:文章来源:https://www.toymoban.com/news/detail-756127.html
// XmlData xmlData = new XmlData ();
// xmlData .playName = "Jtro02";
// xmlData.level = 2;
// xmlData .gold = 200;
// //最关键的一步:序列化生成XML
// SerializerXml .Instance .SaveToXml ("D:/myXml.xml",xmlData);
的注释删除掉,也就是让这部分代码起作用。
运行一次,再注释。然后可以用下面的方法读取了。文章来源地址https://www.toymoban.com/news/detail-756127.html
到了这里,关于Unity中的文件读写TXT 与XML的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!