关于Unity的特殊目录打包到安卓读写
一:存放资源的文件夹
-
StreamingAssets文件夹:
(图片来源网络,侵删)- 可读取的平台:所有平台都可以读取其中的文件。
- 可写入的平台:PC(Windows、Mac)和iOS可以直接在StreamingAssets文件夹中写入文件。
-
PersistentDataPath文件夹(通常用于存储运行时生成的数据):
- 可读取的平台:所有平台都可以读取其中的文件。
- 可写入的平台:所有平台都可以在PersistentDataPath文件夹中写入文件。
-
TemporaryCachePath文件夹(用于存储临时缓存文件):
- 可读取的平台:所有平台都可以读取其中的文件。
- 可写入的平台:所有平台都可以在TemporaryCachePath文件夹中写入文件。
-
Assets文件夹(用于存放项目资源):
- 可读取的平台:所有平台都可以读取Assets文件夹中的文件。
- 可写入的平台:没有平台可以直接在Assets文件夹中写入文件。所有修改需要在编辑器环境下进行。
- Resource文件夹:所有平台只可读取不可修改
二:对应的路径
string streamingAssetsPath = Application.streamingAssetsPath;
string persistentDataPath = Application.persistentDataPath;
string temporaryCachePath = Application.temporaryCachePath;
string dataPath = Application.dataPath;
上述路径在不同的平台以及设备上路径会有所不同,Unity会正确的返回路径,相关资料官方文档有。
三:不同文件夹支持的读或写的API
1.StreamingAssets文件夹:
在Window平台上是支持C# IO类进行读写操作的,但是在安卓平台上是不支持传统C# IO 读取操作,因为资源存放在应用沙盒中。应该使用Unity自带的API UnityWebRequest类进行读取资源
例如读取一张图片
IEnumerator enumerator() { url = Path.Combine(Application.streamingAssetsPath, "Img", "bg3.png"); UnityWebRequest requst = UnityWebRequestTexture.GetTexture(url); requst.SendWebRequest(); while (!requst.isDone) { yield return null; } texture = DownloadHandlerTexture.GetContent(requst); bg.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); }
2.PersistentDataPath文件夹
在Windows平台以及安卓平台都是支持C# IO类进行读写的,需要注意的是安卓方面比较多的坑
以下主要介绍安卓方面的注意事项
为了能进行正常读取 需要在配置文件申请读取和修改存储权限具体方法网上寻找
另一种方法是在Unity里面打包界面选择该权限
Project Settings-->Player-->Android-->Other Settings-->Write Permission-->External
下面代码块主要是判断持久化文件目录中有没有该文件,此时如果没有该文件夹
Application.persistentDataPath+"/song" 在安卓端是会报错的.在PC端不会
所以在检测该文件是否存在之前还要检测文件夹是否存在
string url = Path.Combine(Application.persistentDataPath, "song","uu.mp3"); if (File.Exists(url)) { ...... }
上面是用传统IO类进行读写操作,如果用UnityWebRequest类进行加载资源时需要注意的是要在资源路径前面加上 "file://" 标记为本地文件 否则会找不到文件
例如 错误的: string url = Application.persistentDataPath+"/song"+"/uu.mp3"
正确的: string url = "file://"+ Application.persistentDataPath+"/song"+"/uu.mp3";
例如读取本地歌曲
string songFileName = "song.mp3"; string filePath = System.IO.Path.Combine(Application.persistentDataPath, songFileName); string fileUrl = "file://" + filePath; UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(fileUrl, AudioType.MPEG); yield return www.SendWebRequest(); if (www.result == UnityWebRequest.Result.Success) { AudioClip audioClip = DownloadHandlerAudioClip.GetContent(www); } else { Debug.Log("无法读取歌曲文件:" + www.error); }