Unity 中 StreamingAssets 加载详解

Android、iOS、PC加载路径及方式

Posted by SWZ on January 30, 2020

简介

StreamingAssets目录必须在Assets根目录下,该目录下所有资源也会被打包到游戏里,不同于Resources目录,该目录下的资源不会进行压缩,同样是只读不可写的。Unity基本也没有提供从该路径下直接读取资源的方法,只有www可以加载audioClip、texture和二进制文件,但Unity提供了从该目录加载AssetBundle的方法。


加载路径

可以通过Application.streamingAssetsPath来获得该文件夹的实际位置。 ↑ 等同于 ↓

  • Unity Editor, Win, Linux, PS4, Xbox, NS : Application.dataPath + "/StreamingAssets"

  • macOS : Application.dataPath + "/Resources/Data/StreamingAssets"

  • iOS : Application.dataPath + "/Raw"

  • Android : "jar:file://" + Application.dataPath + "!/assets"

    !!注意!!

    对于anroid平台,path参数需要使用Application.dataPath + "!assets/xxxx"的格式才能读取。 其它平台path参数使用Application.streamingAssetsPath+"/xxxxxx"即可读取。

详细格式:

  • Unity Editor, Win, Linux, PS4, Xbox, NSE:/myProj/Assets/StreamingAssets

  • macOS : /myProj/Assets/StreamingAssets

  • iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data/Raw

  • Andoridjar:file:///data/app/包名-1/base.apk!/assets


加载方式

  • 非Android:支持File或者Stream的读取
  • Android:必须用WWW加载,和jar:file://这个前缀有关,不支持File或者Stream的读取

平台区分方式

利用宏定义

string filePath = 
#if UNITY_ANDROID && !UNITY_EDITOR
        "jar:file://" + Application.dataPath + "!/assets/" + flodername + "/";
#elif UNITY_IPHONE && !UNITY_EDITOR
        Application.dataPath + "/Raw/";
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
 "file://" + Application.dataPath + "/StreamingAssets" + "/" + flodername + "/";
#else
        string.Empty;
#endif

利用RuntimePlatform

private static string StreamingAssetsDataPath
{
	get
    {
    	if (Application.platform == RuntimePlatform.Android)
        	return "jar:file://" + Application.dataPath + "!/assets/";
        else if (Application.platform == RuntimePlatform.IPhonePlayer)
            return Application.dataPath + "/Raw/";
        else
        	return "file://" + Application.dataPath + "/StreamingAssets/";
	}
}