Unity特殊文件夹以及各平台Application.xxxPath的路径图文详解教程

  • Post author:
  • Post category:其他





Chinar blog



www.chinar.xin





Unity中的各种路径




本文提供全流程,中文翻译。


Chinar

的初衷是将一种简单的生活方式带给世人

使有限时间 具备无限可能




Chinar

―― 心分享、心创新!

助力快速完成

Unity

中常用路径的认识

为初学者节省宝贵的时间,避免采坑!



Chinar

教程效果:


在这里插入图片描述






全文高清图片,点击即可放大观看

(很多人竟然不知道)






1




Assets

――

资产 根目录




1.1 Path Info

――

路径信息


介绍:这个是程序的数据文件所在文件夹的路径,也就是Assets文件夹的路径

Application.dataPath

举个例子

在这里插入图片描述





1.2 Effect

――

作用


通过这个路径可以访问项目中任何文件夹中的资源,很多API都是基于这个文件目录的

查找目录都需要带上Assets,比如

AssetDatabase

;



注意:Application.dataPath是不允许在移动端使用的, 如果移动端有使用的话会直接卡住!因为移动端是没有访问权限的

Android:通常它会直接指向APK。例外情况是,如果您正在运行拆分二进制构建,在这种情况下它将指向OBB。





2




Resources

――

资源 文件夹


!!

存放资源的特殊文件夹

!!




2.1 Path Info

――

路径信息


默认情况下,

Unity

是没有

Resources

文件夹的,我们需要自行创建



Resources

文件夹放在

Assets

目录下面

举个例子

在这里插入图片描述



只要文件夹名称叫

“Resources”

,它可以出现在根目录

Assets

下的任何位置,包括子目录中


如:

Assets/Resources




与:

Assets/xxx/xxx/xxx/Resources


两者是一样的。并且可以同时存在多个 Resources 文件夹





低版本Unity, 项目中虽然可以有多个

Resources 文件夹 ,

但是其中如果存在同名资源,在打包时就会报错


2018之后的版本测试,尚未出现此类情况


(原因在1.2中做详细说明)


举个例子

在这里插入图片描述




2.2 Mechanism

――

机制



Resources

文件夹是一个只读的文件夹



程序运行时

,通过

Resources.Load()

等API 来读取数据对象


由于

Unity 无法判断脚本有没有访问

到 Resources 中的资源


所以 Resources 文件夹下的资源,

不管用不用

都会被打包发布到程序中


生成一个

resources.assets

( 缺省的AssetBundle )

在这里插入图片描述


建议,只放

Prefab

或者一些

Object

对象



Prefab

预制体所用到的资源会被打包发布。没有用到的资源,会被自动过滤掉





2.3 Api

――

接口函数


加载存储在 Resources 文件夹中的资源

函数名 功能


FindObjectsOfTypeAll


返回 Type 类型的所有对象

(数组)



Load


指定路径的资源


LoadAll


指定路径下的所有资源


LoadAsync


异步加载 指定路径的资源


UnloadAsset


从内存中卸载资源


UnloadUnusedAssets


卸载未使用的资源




Unity 官方API入口






3




StreamingAssets

――

二进制流 资源文件夹


!!

该目录中的任何文件,将原封不动

(不进行任何处理)

的被打包发布

!!




3.1 Path Info

――

路径信息


默认情况下,

Unity

是没有

StreamingAssets

文件夹的,我们需要自行创建



StreamingAssets

文件夹放在

Assets

目录下面


右键

Show in explorer

,打开文件浏览器


举个例子

在这里插入图片描述





3.2 Effect

――

作用



StreamingAssets 与 Resources 区别



Resources

文件夹下的资源打包发布时,会进行一次

压缩和加密



StreamingAssets

文件夹下的资源打包发布时,

原封不动(不进行任何处理)


所以

StreamingAssets

一般放置

数据资源

文件,比如 Json /Xml 等数据文件




PC/MAC

中可实现对文件的“增删改查”等操作,

但在移动端是一个只读路径





3.3 Api

――

接口函数


程序打包发布后,根据平台的差异性 (Windows, Ios ,Android)



StreamingAssets

文件夹中的资源,所在的位置也不同,目录名称也会发生变更

举个例子

返回的路径 Application.streamingAssetsPath

Mac OS / Windows


Application.dataPath + "/StreamingAssets"


iOS


Application.dataPath + "/Raw"


Android


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


所以说,

Application.streamingAssetsPath

负责根据不同平台,而返回

与之对应的 Url

信息,也就是文件夹的路径





Android

平台上使用压缩

.apk

文件,

streamingAsset

中的数据文件包含在压缩的

.jar文件



所以需要使用

UnityWebRequest

类访问资产,才可对数据进行正确读取


举个例子

在这里插入图片描述



简化代码

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;


/// <summary>
/// 测试获取 StreamAssets 下的数据资源,(图片),并显示在UI上
/// </summary>
public class ChinarWebRequest : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(SendUrl(Application.streamingAssetsPath + "/Chinar.png"));
    }


    /// <summary>
    /// 发起请求
    /// </summary>
    /// <param name="url">地址</param>
    private IEnumerator SendUrl(string url)
    {
        using (UnityWebRequest uw = UnityWebRequest.Get(url))
        {
            yield return uw.SendWebRequest();
            if (uw.error != null)
            {
                Debug.Log(uw.error);
            }
            else
            {
                if (uw.responseCode == 200) //200表示接受成功
                {
                    Texture2D texture = new Texture2D(400, 350);                                                            //创建Texture
                    texture.LoadImage(uw.downloadHandler.data);                                                             //加载Image
                    Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.one / 2); //得到精灵对象
                    GameObject.Find("Chinar-Image").GetComponent<Image>().sprite = sprite;                                  //赋值到UI上
                }
            }
        }
    }
}




4




Persistent

――

持久数据 文件夹


!!

可读可写,常用于存放用户数据。应用程序更新,不会对其中文件造成影响

!!


它是一个用户数据文件目录,构建

Unity

应用程序时,自动生成该文件夹




4.1 Path Info

――

路径信息


Assets目录下创建一个

Editor

文件夹



创建编辑器扩展的脚本,注意:引用

UnityEditor

命名空间

using UnityEditor;
using UnityEngine;


public class ChinarEditor: MonoBehaviour
{

    [MenuItem("Chinar/打开 PersistentDataPath")]//添加菜单项
    private static void PersistentDataPath()
    {
        Application.OpenURL("file:///" + Application.persistentDataPath);//打开路径目录
    }
}


点击编辑器按钮

Chinar

–>

PersistentDataPath



举个例子

在这里插入图片描述





4.2 Effect

――

作用


此文件夹可读、可写


常用于存储一些可持久化的用户数据文件


此目录只对应一个应用程序,只要应用不被卸载 / 或是公司名且应用名称不做更改 / 此目录中的文件不会进行任何更改!


只能在应用程序运行时,才能读写操作



Chinar 建议将获得的文件,或是用户的基本信息,等等数据文件,保存到此目录中


例如,将

AssetBundle

包中读取的数据,写入该目录中





5




Application.temporaryCachePath

――

临时路径




5.1 PathInfo

――

路径信息


在编辑器扩展脚本中接着写

#if UNITY_EDITOR
    [MenuItem("Chinar/TemporaryCachePath")]
#endif
    private static void TemporaryCachePath()
    {//打开目标路径
        Application.OpenURL("file:///" + Application.temporaryCachePath);
    }

点击编辑器按钮

Chinar

–>

TemporaryCachePath


举个例子


打开文件夹:

在这里插入图片描述


我们发现,Windows平台临时数据储存路径与数据持久化路径是一样的.





5.2 Effect

――

作用


临时数据的缓存目录





6




Summarize

――

总结


各路径含义:

属性名称 含义


Application.dataPath


此属性用于返回程序的数据文件所在文件夹的路径


Application.streamingAssetsPath


此属性用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径。


Application.persistentDataPath


此属性用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件


Application.temporaryCachePath


此属性用于返回一个临时数据的缓存目录。


各路径在几种平台下的目录:

IOS Android Windows Mac


Application.dataPath

Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data /data/app/xxx.xxx.xxx.apk /Assets /Assets


Application.streamingAssetsPath

Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw jar:file:///data/app/xxx.xxx.xxx.apk/!/assets /Assets/StreamingAssets /Assets/StreamingAssets


Application.persistentDataPath

Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents /data/data/xxx.xxx.xxx/files C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName /Users/xxxx/Library/Caches/CompanyName/Product Name


Application.temporaryCachePath

Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches /data/data/xxx.xxx.xxx/cache C:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName /var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name




支持




May Be

――

开发者,总有一天要做的事!



拥有自己的服务器,无需再找攻略


Chinar

提供一站式《零》基础教程

使有限时间 具备无限可能!






Chinar 知你所想,予你所求!

(

Chinar Blog

)








Chinar




END



本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email:

ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址



版权声明:本文为ChinarCSDN原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。