关于Unity的特殊目录打包到安卓读写

04-26 953阅读

一:存放资源的文件夹

  1. StreamingAssets文件夹:

    关于Unity的特殊目录打包到安卓读写
    (图片来源网络,侵删)
    • 可读取的平台:所有平台都可以读取其中的文件。
    • 可写入的平台:PC(Windows、Mac)和iOS可以直接在StreamingAssets文件夹中写入文件。
  2. PersistentDataPath文件夹(通常用于存储运行时生成的数据):

    • 可读取的平台:所有平台都可以读取其中的文件。
    • 可写入的平台:所有平台都可以在PersistentDataPath文件夹中写入文件。
  3. TemporaryCachePath文件夹(用于存储临时缓存文件):

    • 可读取的平台:所有平台都可以读取其中的文件。
    • 可写入的平台:所有平台都可以在TemporaryCachePath文件夹中写入文件。
  4. Assets文件夹(用于存放项目资源):

    • 可读取的平台:所有平台都可以读取Assets文件夹中的文件。
    • 可写入的平台:没有平台可以直接在Assets文件夹中写入文件。所有修改需要在编辑器环境下进行。
  5. 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);
}
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]