Unity中的文件读写TXT 与XML

这篇具有很好参考价值的文章主要介绍了Unity中的文件读写TXT 与XML。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在游戏开发中,有的单机游戏会用到保存数据到本地,或者根据本地的数据来进行下次的设置。这里,鄙人介绍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);
        }
    }

然后保存运行:
运行后的截图
unity读取文本,unity,xml,游戏引擎

下面是文件的读取:

//    脚本功能:指定位置创建一个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);
        }
    }
}

unity读取文本,unity,xml,游戏引擎

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方法中的这一部分:

 //      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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中读取文本文件txt

    文件创建 如果文件不存在就是创建,如果文件存在就是打开操作 文件对象创建 文件读 以下的函数都是文件对象的成员函数 read() 一次性读取文件的所有内容放在一个大字符串中,即存在内存中 readline() 逐行读取文本,结果是一个list readlines() 一次性读取文本的所有内容,结

    2024年02月05日
    浏览(38)
  • C++读取.txt文本文件操作

    用C++读取.txt文本文件步骤如下:定义一个文件流对象、打开文件、读文件、关闭文件。 1.定义文件流对象 涉及文件操作的程序一般都会使用fstream类,所以要在程序开头包含头文件fstream。 一个文件流对象与一个输入文件相关联,定义一个文件流对象infile。 2.打开文件 一般将

    2024年02月11日
    浏览(43)
  • 【Unity】读写ProjectSettings、UserSettings、Library文件夹中的文件

    【Unity】读写ProjectSettings、UserSettings、Library文件夹中的文件 AssetDatabase 类提供的 LoadAssetAtPath 方法和 CreateAsset 方法只能读写Assets、Packages文件夹中的资产,如果想要读写其他文件夹(ProjectSettings、UserSettings、Library等)中的资产,需要使用 UnityEditorInternal.InternalEditorUtility 类。

    2024年02月04日
    浏览(82)
  • 【uniapp】实现对TXT文本文件的读取和保存下载

    开发一个uniapp项目时,需要实现对文本的读取和保存文件到本地,虽然可以跨平台,但还是有几个平台不受支持的,接下来讲讲怎么兼容处理读写文本文件这个问题。 项目都按照uniapp官方文档说明写,发现此功能对应的 App 和 H5 平台是没有实现的 App H5 微信小程序 QQ小程序

    2024年02月04日
    浏览(35)
  • 读取JSON文件 如何在Unity中读取Json文件中的数据

    Josn是一种轻量级的数据交换格式,JSON能够描述四种简单的类型(字符串、数字、布尔值及null)和两种结构化类型(对象及数组),在Unity里经常用Json来处理大量的字符串,容易解析,效率非常快。 基本结构 1、语法 数据存在键值对中 数据由逗号分隔 花括号保存对象 方括号保存

    2024年02月15日
    浏览(32)
  • Python读取指定的TXT文本文件并从中提取指定数据的方法

      本文介绍基于 Python 语言,遍历文件夹并从中找到文件名称符合我们需求的多个 .txt 格式文本文件,并从上述 每一个文本文件 中,找到 我们需要的指定数据 ,最后得到 所有文本文件中 我们 需要的数据的合集 的方法。   首先,我们来明确一下本文的具体需求。现有

    2024年02月14日
    浏览(31)
  • Python - 读取pdf、word、excel、ppt、csv、txt文件提取所有文本

    本文对使用python读取pdf、word、excel、ppt、csv、txt等常用文件,并提取所有文本的方法进行分享和使用总结。 可以读取不同文件的库和方法当然不止下面分享的这些,本文的代码主要目标都是:方便提取文件中所有文本的实现方式。 这些库的更多使用方法,请到官方文档中查

    2024年02月13日
    浏览(38)
  • Unity3D操作数据之Txt文档操作(创建、读取、写入、修改)

    Unity3D操作数据之Txt文档操作(创建、读取、写入、修改) 其实读取Txt文档非常简单、也不需要导入 插件 ,仅需引入相应的 命名空间 即可。 命名空间: using System.IO 要注意的一点是,文档格式设置为UTF-8,不然中文可能显示不太正确。 使用写入语句会自动创建对应的文档 使用

    2024年02月02日
    浏览(50)
  • C语言——读写TXT文件中的(多行多列矩阵型)浮点型数据的两种方式

    文本行输入函数:fgets(读文本) 函数原型 参数 str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。 n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。 stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字

    2023年04月08日
    浏览(28)
  • Unity文本框解析读取mqtt服务器JSON数据

    本次内容是讲述如何将mqtt服务器中接收到的数据在Unity3D的文本框控件中显示JSON键值对中的“值”。 需求: 1.GameObject——UI——Text (将Unity 3D的文本框控件置于场景) 命名空间引用: using UnityEngine.UI; 2. Newtonsoft插件 命名空间引用: Newtonsoft.Json.Linq; 3.MQTT通讯需求: (1)h

    2023年04月08日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包