目录

一、目的

1、想知道:Unity中安卓、PC端配置文件:只有读,没有写

二、参考

1、Unity安卓配置文件:读和写

三、注意:

1、每次修改Resource内部的配置文件就可以。

1、发现使用www和协程读取配置文件,会导致配置文件没有读取完毕,就开始了运行其他程序,然后报错,所以下面是不用www和协程读取配置文件。

四、操作:一:完成:

1、注意:

1、文件夹设置

1、xml内容

1、运行效果:PC、手机正常运行 读取成功,并且每次都会为了保持配置文件在persistentDataPath中创建最新的配置文件,保持和Resource内容一致,

1、总体代码:


 

一、目的

1、想知道:Unity中安卓、PC端配置文件:只有读,没有写

 

二、参考

1、Unity安卓配置文件:读和写


  • 总结:good:读写功能都有。

 

三、注意:

1、每次修改Resource内部的配置文件就可以。

1、发现使用www和协程读取配置文件,会导致配置文件没有读取完毕,就开始了运行其他程序,然后报错,所以下面是不用www和协程读取配置文件。

 

四、操作:一:完成:

1、注意:

①不能使用www或者协程的方法,因为那样会导致配置文件没有读取完毕就开始运行其他程序了,所以这个方法目前读取最好

①为了保持配置文件在persistentDataPath中最新的,所以需要删除之前persistentDataPath的配置文件,重新创建配置文件

①目前我的代码中没有修改配置文件的方法,可以参考我写的其他安卓配置文件读写方法,方法一样的

 

1、文件夹设置

unity游戏安卓运行 安卓玩unity_unity游戏安卓运行

 

1、xml内容

<config>
  <butterfly>
    <flySpeed>50</flySpeed>
    <allowDistanceMin>6</allowDistanceMin>
    <distanceMinNeedMoveAwayUI>20</distanceMinNeedMoveAwayUI>
    <time_allowAtUIMax> 2</time_allowAtUIMax>
	<time_howLongDestroy>0.1</time_howLongDestroy>
	<time_interval_createButterfly>4</time_interval_createButterfly>
	<totalNum_butterfly>4</totalNum_butterfly>
  </butterfly>
  <mouseClick>
	<time_hideMouseClick>2</time_hideMouseClick>
    <time_changeMouseClick>0.2</time_changeMouseClick>  
  </mouseClick>
  <addScoreEffects>
	<time_duration_addScoreMove>2</time_duration_addScoreMove>
  </addScoreEffects>
</config>

<!-- 
butterfly:蝴蝶有关的
flySpeed:蝴蝶飞行的速度
allowDistanceMin:蝴蝶允许的与目标点最小距离,小于这个距离说明蝴蝶到达目标点了
distanceMinNeedMoveAwayUI:需要离开目标点的最小距离,当小于这个距离时候,代表手指动了或者摄像头移动了,蝴蝶就要飞走了
time_allowAtUIMax:蝴蝶允许在UI中的最长时间,超过这个时间蝴蝶就要飞走,单位:秒
time_howLongDestroy:蝴蝶被点击后多久才消失,单位:秒
time_interval_createButterfly:蝴蝶诞生的间隔,单位:秒
totalNum_butterfly:蝴蝶在场景中同时出现的总数量

mouseClick:鼠标点击后出现特效有关的
time_hideMouseClick:鼠标点击位置出现的特效多久后消失,单位:秒
time_changeMouseClick:鼠标点击位置出现的特效图片切换的时间,让其出现动态效果,单位:秒

addScoreEffects:加分特效有关的
time_duration_addScoreMove:加分特效移动的持续时间,单位:秒

-->

 

1、运行效果:PC、手机正常运行 读取成功,并且每次都会为了保持配置文件在persistentDataPath中创建最新的配置文件,保持和Resource内容一致,

 

1、总体代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Xml;

/// <summary>
/// 功能:读取所有配置文件
/// </summary>

public class My_test10_config : MonoBehaviour
{
    #region["蝴蝶的配置文件"]
    /// <summary>蝴蝶飞行的速度</summary>
    [HideInInspector]
    public float flySpeed = -1;

    /// <summary>蝴蝶允许的与目标点最小距离,小于这个距离说明蝴蝶靠近目标点了</summary>
    [HideInInspector]
    public float allowDistanceMin = -1;

    /// <summary>蝴蝶允许的与目标点最小距离,小于这个距离说明蝴蝶靠近目标点了</summary>
    [HideInInspector]
    public float distanceMinNeedMoveAwayUI = -1;


    /// <summary>蝴蝶允许在UI中的最长时间,超过这个时间蝴蝶就要飞走,单位:秒</summary>
    [HideInInspector]
    public float time_allowAtUIMax = -1;

    /// <summary>蝴蝶被点击后多久才消失,单位:秒</summary>
    [HideInInspector]
    public float time_howLongDestroy = -1;

    /// <summary>float类型:蝴蝶诞生的间隔</summary>
    [HideInInspector]
    public float time_interval_createButterfly = -1;

    /// <summary>int类型:蝴蝶在场景中同时出现的总数量</summary>
    [HideInInspector]
    public int totalNum_butterfly = -1;

    #endregion

    #region["鼠标点击后出现特效有关的"]
    /// <summary>鼠标点击位置出现的特效多久后消失</summary>
    [HideInInspector]
    public float time_hideMouseClick = -1;

    /// <summary>鼠标点击位置出现的特效图片切换的时间,让其出现动态效果</summary>
    [HideInInspector]
    public float time_changeMouseClick = -1;

    #endregion


    #region["加分特效有关的"]
    /// <summary>加分特效移动的持续时间</summary>
    [HideInInspector]
    public float time_duration_addScoreMove = -1;
    #endregion

    /// <summary>配置文件的名字</summary>
    private string str_configName = "config.xml";

    string path;

    private void Awake()
    {
        // GetPath02();

        //测试:不使用www来加载配置文件
        path = Application.persistentDataPath + "/config.xml"; 

        SetFileToPersistent();

        LoadXml();
    }


    /// <summary>
    /// 功能:将Resources中的配置文件加载到persistentDataPath中
    /// </summary>
    void SetFileToPersistent()
    {
        //StreamWriter一定要记得关闭.不关闭人家不鸟你之前做什么,
        FileInfo info = new FileInfo(path);
        if (info.Exists)
        {
            //为了保持配置文件在persistentDataPath中最新的,所以需要删除之前的,重新创建配置文件
            File.Delete(path);

            //TextAsset ts = Resources.Load("TestXml/testXml") as TextAsset;
            TextAsset ts = Resources.Load("test10/config/config") as TextAsset;
            string content = ts.text;
            StreamWriter sw = info.CreateText();
            sw.Write(content);
            sw.Close();
            sw.Dispose();
        }
        else if (!info.Exists)
        {
            //TextAsset ts = Resources.Load("TestXml/testXml") as TextAsset;
            TextAsset ts = Resources.Load("test10/config/config") as TextAsset;
            string content = ts.text;
            StreamWriter sw = info.CreateText();
            sw.Write(content);
            sw.Close();
            sw.Dispose();
            //result.text = "添加Xml文件陈宫";
        }
        // else result.text = "已存在Xml文件";
    }



    / <summary>
    / 功能:通过不同的平台,找到配置文件位置
    / 准备修改GetPath的缺点
    / 缺点:
    / 网页:
    / </summary>
    //public void GetPath02()
    //{
    //    string localPath;
    //    if (Application.platform == RuntimePlatform.Android)
    //    {
    //        localPath = "jar:file://" + Application.dataPath + "!/assets" + "/test10/" + str_configName; //在Android中实例化WWW不能在路径前面加"file://"
    //        Debug.Log(localPath);
    //    }
    //    else
    //    {
    //        localPath = "file://" + UnityEngine.Application.streamingAssetsPath + "/" + "test10/" + str_configName;//在Windows中实例化WWW必须要在路径前面加"file://"
    //        Debug.Log(localPath);
    //    }
    //    //CopyFiles02(localPath);

    //   CopyFiles03(localPath);
    //}

    / <summary>
    / 安卓写xml:
    / 网页:
    / 缺点:不是每次都创建新的配置文件在设备的缓存地方
    / </summary>
    //private void CopyFiles02(string path)
    //{
    //    WWW www = new WWW(path);
    //    //print("www.bytes"+www.bytes);
    //    // yield return www;
    //    if (www.isDone)
    //    {
    //        string newPath = Application.persistentDataPath + "/" + str_configName;
    //        // string newPath = Application.persistentDataPath + "/" +"test10/"+ str_configName;
    //        if (File.Exists(newPath))
    //        {
    //            //如果缓存的地方有配置文件就将其删除,换成最新的
    //            //print("如果缓存的地方有配置文件就将其删除,换成最新的,这样所有的只需要设置一个配置文件就可以了");
    //            File.Delete(newPath);
    //            File.WriteAllBytes(newPath, www.bytes);
    //        }
    //        else if (!File.Exists(newPath))
    //        {
    //            print("缓存的地方没有配置文件");
    //            File.WriteAllBytes(newPath, www.bytes);
    //        }
    //    }
    //    LoadXml();
    //}

    / <summary>
    /功能: 安卓写xml:
    / 解决:不是每次都创建新的配置文件在设备的缓存地方
    / 
    / </summary>
    //private void CopyFiles03(string path)
    //{
    //    WWW www = new WWW(path);
    //    //print("www.bytes"+www.bytes);
    //    // yield return www;
    //    if (www.isDone)
    //    {
    //        string newPath = Application.persistentDataPath + "/" + str_configName;
    //        // string newPath = Application.persistentDataPath + "/" +"test10/"+ str_configName;
    //        if (File.Exists(newPath))
    //        {
    //            //如果缓存的地方有配置文件就将其删除,换成最新的
    //            //print("如果缓存的地方有配置文件就将其删除,换成最新的,这样所有的只需要设置一个配置文件就可以了");
    //            File.Delete(newPath);
    //            //TODO:因为执行的太快了,所以没有创建新的配置文件
    //            File.WriteAllBytes(newPath, www.bytes);
    //            //LoadXml();
    //        }
    //        else if (!File.Exists(newPath))
    //        {
    //            print("缓存的地方没有配置文件");
    //            MyDebug.Add("缓存的地方没有配置文件","");
    //            File.WriteAllBytes(newPath, www.bytes);
    //        }
    //    }
    //    LoadXml();
    //}

    /// <summary>
    /// 安卓读xml:
    /// 网页:
    /// </summary>
    public void LoadXml()
    {
        string path = Application.persistentDataPath + "/" + str_configName;

        string strs = File.ReadAllText(path);
        //Debug.Log(strs);
        //MyDebug.Add(strs, "");

        if (!File.Exists(path))
        {
            print("配置文件路径错误");
            MyDebug.Add("配置文件路径错误", "");
            return;
        }
        else if (File.Exists(path))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(path);
            XmlNodeList node = xmlDoc.SelectSingleNode("config").ChildNodes;
            //遍历节点
            foreach (XmlElement ele in node)
            {
                // Debug.Log(ele.Name);
                #region["鼠标点击后出现特效有关的"]
                if (ele.Name == "mouseClick")
                {
                    foreach (XmlElement i1 in ele.ChildNodes)
                    {
                        switch (i1.Name)
                        {
                            case "time_hideMouseClick":
                                time_hideMouseClick = float.Parse(i1.InnerText);
                                if (time_hideMouseClick == -1)
                                    MyDebug.Add("time_hideMouseClick:读取失败", "");
                                break;

                            case "time_changeMouseClick":
                                time_changeMouseClick = float.Parse(i1.InnerText);
                                if (time_changeMouseClick == -1)
                                    MyDebug.Add("time_changeMouseClick:读取失败", "");
                                break;

                            default:
                                break;
                        }
                    }
                }
                #endregion

                #region["加分特效有关的"]
                else if (ele.Name == "addScoreEffects")
                {
                    foreach (XmlElement i1 in ele.ChildNodes)
                    {
                        switch (i1.Name)
                        {
                            case "time_duration_addScoreMove":
                                time_duration_addScoreMove = float.Parse(i1.InnerText);
                                if (time_duration_addScoreMove == -1)
                                    MyDebug.Add("time_duration_addScoreMove:读取失败", "");
                                break;

                            default:
                                break;
                        }
                    }
                }
                #endregion

                #region["蝴蝶的配置文件"]
                else if (ele.Name == "butterfly")
                {
                    //蝴蝶
                    foreach (XmlElement i1 in ele.ChildNodes)
                    {
                        //Debug.Log(i1.Name);
                        switch (i1.Name)
                        {
                            case "flySpeed":
                                flySpeed = float.Parse(i1.InnerText);
                                if (flySpeed == -1)
                                    MyDebug.Add("flySpeed:读取失败", "");
                                break;

                            case "distanceMinNeedMoveAwayUI":
                                distanceMinNeedMoveAwayUI = float.Parse(i1.InnerText);
                                if (distanceMinNeedMoveAwayUI == -1)
                                    MyDebug.Add("distanceMinNeedMoveAwayUI:读取失败", "");
                                break;

                            case "allowDistanceMin":
                                allowDistanceMin = float.Parse(i1.InnerText);
                                if (allowDistanceMin == -1)
                                    MyDebug.Add("allowDistanceMin:读取失败", "");
                                break;

                            case "time_allowAtUIMax":
                                time_allowAtUIMax = float.Parse(i1.InnerText);
                                if (time_allowAtUIMax == -1)
                                    MyDebug.Add("time_allowAtUIMax:读取失败", "");
                                break;

                            case "time_howLongDestroy":
                                time_howLongDestroy = float.Parse(i1.InnerText);
                                if (time_howLongDestroy == -1)
                                    MyDebug.Add("time_howLongDestroy:读取失败", "");
                                break;

                            case "time_interval_createButterfly":
                                time_interval_createButterfly = float.Parse(i1.InnerText);
                                if (time_interval_createButterfly == -1)
                                    MyDebug.Add("time_interval_createButterfly:读取失败", "");
                                break;

                            case "totalNum_butterfly":
                                totalNum_butterfly = int.Parse(i1.InnerText);
                                if (totalNum_butterfly == -1)
                                    MyDebug.Add("totalNum_butterfly:读取失败", "");
                                break;

                            default:
                                print("配置文件内部有个节点读取失败");
                                MyDebug.Add("配置文件内部有个节点读取失败", "");
                                break;
                        }
                    }
                }
                #endregion


            }
        }

    }




}