unity安卓环境特殊文件夹(热更时候的用法)

本文介绍了一个Unity项目的热更新实现过程,包括如何利用Application.persistentDataPath和Application.streamingAssetsPath进行资源的下载、替换与删除操作,并提供了具体的代码示例。
  1. Application.dataPath  这个不想过多结束。此属性用于返回程序的数据文件所在文件夹的路径。例如在Editor中就是Assets了。
  2. Application.streamingAssetsPath     这个文件夹内的东西可读不可以写,可以被复制和替换,但是不能被删除。热更新涉及的Assetbundle和Lua文本一般都放在这个文件夹下。
  3. Application.persistentDataPath       这个文件夹在运行过程中既可以读也可以写。可以用File.Exist,也可以用File.Delete。但是注意在安卓移动平台下不能用File.Copy(),只能用www类来下载。然后用File.WriteAllBite这个文件夹来复制。

  1. coldshower一般在做热更的时候会把服务器的资源下载到Application.persistentDataPath ,然后再把Application.persistentDataPath 中的资源替换到

Application.streamingAssetsPath 。之后再异步判断一下Application.persistentDataPath这个资源还有吗,有的话用File.Delete的方法删除。这里注意必须用异步的方法。CS我在试验的时候发现,用同步的方法有时候不能删除Application.persistentDataPath这个文件夹内的东西。


我在下面的项目中用了移动平台动态读取Debug内容的方法,

我们需要借助 Android SDK 来查看可以使用双击打开,但是我以前这样打开会 时不时的自动退出,,以我自己的路径为例(先连接手机,手机打开开发者模式,打开USB调试,还有别把手机设成只充电模式):然后找到,打开 sdk 路径下 E:\Android\sdk\tools ,按住shift,右键,在此处选择用命令窗口打开,然后输入ddms.bat  


接下来就是和这位老哥一样的方法了http://blog.youkuaiyun.com/u014230923/article/details/51615746

最后放上我工程的代码截图.项目下载为链接: https://pan.baidu.com/s/1jHLp9sU 密码: u4se



using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.IO;




public class lzysd : MonoBehaviour {
    // Use this for initialization
    void Start()
    {
        m_infile = DataPathTWO + "index.xml";
        m_outfile = DataPath + "index.xml";
        if (Directory.Exists(DataPath)) Directory.Delete(DataPath, true);
        Directory.CreateDirectory(DataPath);
        if (Directory.Exists(DataPath))
        {
            Debug.Log("今天在手机上也可以创建文件夹");
        }


        StartCoroutine(OnExtractResource2());


    }


    // Update is called once per frame
    void Update()
    {




    }
    string m_infile = "";
    string m_outfile = "";
    string GUIwenzi = "";


    public void WAYTWO()
    {


        if (Application.platform == RuntimePlatform.Android)
        {


            StartCoroutine(OnExtractResource3());


        }
    }


    IEnumerator OnExtractResource2()
    {




     
        WWW www2 = new WWW(m_infile);
        yield return www2;


        if (www2.isDone)
        {
            Debug.Log("今天在手机上的沙盒中仍然存在文件++++++");
            File.WriteAllBytes(m_outfile, www2.bytes);
        }




        www2.Dispose();
        www2 = null;


         www2 = new WWW(m_outfile);
        yield return www2;


        if (www2.isDone)
        {
            Debug.Log("今天在手机上的沙盒中仍然存在文件--------------");
            File.WriteAllBytes(m_infile, www2.bytes);
        }


        //  www3.Dispose();


        Thrre();
        www2.Dispose();
        www2 = null;
        //临时增加,会被删除
        StartCoroutine(OnExtractResource3());
        yield break;


    }


    IEnumerator OnExtractResource3()
    {
        yield return new WaitForSeconds(0);


        if (File.Exists(m_outfile))
        {
            File.Delete(m_outfile);
            Debug.Log("今天在手机上的沙盒中仍然存在文件+3");


        }
        else
        {
            Debug.Log("今天在手机上的沙盒中文件直接就没有了+3");
        }
        if (File.Exists(m_outfile))
        {
            Debug.Log("今天在手机上的沙盒中仍然存在文件");


        }
        else
        {
            Debug.Log("今天在手机上的沙盒中文件直接就没有了+1");
        }


      
    }


    void Thrre()
    {
        if (File.Exists(m_outfile))
        {
            Debug.Log("今天在手机上的沙盒中仍然存在文件");


        }
        else
        {
            Debug.Log("今天在手机上的沙盒中文件直接就没有了+1");
        }




        if (File.Exists(m_outfile))
        {
            Debug.Log("今天在手机上的沙盒中仍然存在文件+2");


        }
        else
        {
            Debug.Log("今天在手机上的沙盒中文件直接就没有了+2");
        }


        if (File.Exists(m_outfile))
        {
            File.Delete(m_outfile);
            Debug.Log("今天在手机上的沙盒中仍然存在文件+3");


        }
        else
        {
            Debug.Log("今天在手机上的沙盒中文件直接就没有了+3");
        }
    }












    public string DataPath
    {
        get
        {


            if (Application.isMobilePlatform)
            {
                return Application.persistentDataPath + "/";
            }
            return "c:/";
        }
    }


    public string DataPathTWO
    {
        get
        {


            if (Application.isMobilePlatform)
            {
                return Application.streamingAssetsPath + "/";
            }
            return "c:/";
        }
    }


}

提供的引用内容中未提及在Unity中针对Android平台遍历外部文件夹的方法。不过,一般而言,在Unity中针对Android平台遍历外部文件夹可以借助Java插件或者Unity的`AndroidJavaClass`和`AndroidJavaObject`来实现与Android系统的交互。 以下是一个简单示例代码,展示了如何使用`AndroidJavaClass`和`AndroidJavaObject`来遍历Android外部存储文件夹: ```csharp using UnityEngine; using System.Collections.Generic; public class AndroidFolderTraversal : MonoBehaviour { void Start() { // 获取Android环境AndroidJavaClass environmentClass = new AndroidJavaClass("android.os.Environment"); // 获取外部存储目录 AndroidJavaObject externalStorageDirectory = environmentClass.CallStatic<AndroidJavaObject>("getExternalStorageDirectory"); string externalStoragePath = externalStorageDirectory.Call<string>("getPath"); // 创建Java的File类对象 AndroidJavaClass fileClass = new AndroidJavaClass("java.io.File"); AndroidJavaObject externalStorageFile = new AndroidJavaObject("java.io.File", externalStoragePath); // 调用listFiles方法获取文件和文件夹列表 AndroidJavaObject[] filesAndFolders = externalStorageFile.Call<AndroidJavaObject[]>("listFiles"); if (filesAndFolders != null) { List<string> fileNames = new List<string>(); foreach (AndroidJavaObject file in filesAndFolders) { string fileName = file.Call<string>("getName"); fileNames.Add(fileName); } // 输出文件名列表 foreach (string name in fileNames) { Debug.Log(name); } } } } ``` 上述代码通过`AndroidJavaClass`和`AndroidJavaObject`调用了Android系统的相关类和方法,获取了外部存储目录并遍历了其中的文件和文件夹
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值