19、StreamingAssets和Resources目录的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19、StreamingAssets和Resources目录的区别相关的知识,希望对你有一定的参考价值。

参考技术A 都是只读的、Resources会加密,StreamingAssets不加密。
当时是想播放一段音频,于是我把资源放在StreamingAssets目录下,用WWW加载a.ogg,然后并没有得到我想要的结果。但是放在Resources目录下面,Resources.Load()却能播放。后来经过研究,终于知道了这么几个概念的意思,也就清楚了前面为什么不能播放。

要说明这个原因,首先说一下AssetBundle。很多人应该知道这是unity3d里面用来打包资源的,支持的格式有限,如文理、音频、二进制、文本等。像一些.cs文件、.mp4文件是没法打包的。Resources目录下的资源在打包之后,也会生成AssetBundle,只是Resources下的资源会被系统自动处理。

那AssetBundle到底是什么呢?其实可以把它简单看成是一个资源集合,必须用WWW类来进行读取,而Resources可以看成是一个特殊的WWW,只能对于Resources目录的资源。而WWW读取的内容也必须是AssetBundle,所以一个单独的ogg文件无法用WWW读取,必须先打包成AssetBundle,才能用WWW读取。

StreamingAssets又是什么呢?这是个Raw目录,里面的内容不会加密、编码。比如png、ogg、AssetBundle文件,原来什么样,打包就是什么样。要使用这些文件的话,必须用对应的类来访问,如AssetBundle用WWW类,mp4用播放器插件加载(包括解析),用WWW加载mp4是不行的,因为识别不出来。

Resource文件下所有的文件不管是否使用都会打包。
相同资源放在不同目录,会造成冗余资源的打包。

Unity读取StreamingAssets路径下的文件

    /// <summary>
    ///读取StreamingAssets中的文件 
    /// </summary>
    /// <param name="path">StreamingAssets下的文件路径</param>
    /// <returns>读取到的字符串</returns>
    public static string GetTextForStreamingAssets(string path)
    {
        string localPath = "";
        if (Application.platform == RuntimePlatform.Android)
        {
            localPath = Application.streamingAssetsPath + "/" + path;
        }
        else
        {
            localPath = "file:///" + Application.streamingAssetsPath + "/" + path;
        }

        WWW www = new WWW(localPath);

        if (www.error != null)
        {
            Debug.LogError("error while reading files : " + localPath);
            return ""; //读取文件出错
        }
        while (!www.isDone) { }
        Debug.Log("File content :  " + www.text);//www下面还有获取字节数组的属性
        return www.text;
    }

以上是关于19、StreamingAssets和Resources目录的区别的主要内容,如果未能解决你的问题,请参考以下文章

unity使用文件流操作streamingassets下的文件

Unity读取StreamingAssets路径下的文件

Unity读取StreamingAssets路径下的文件

unity发布web后,怎么获取StreamingAssets文件夹的路径

csharp Unity2017.1f3 StreamingAssetsスニペット

unity 播放视频 WWW下载StreamingAssets文件