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

Chinar blog www.chinar.xin

Unity中的各种路径


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

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

使有限时间 具备无限可能

Chinar ―― 心分享、心创新!

助力快速完成 Unity 中常用路径的认识

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

Chinar 教程效果:
Unity特殊文件夹以及各平台Application.xxxPath的路径图文详解教程_第1张图片


文章目录

  • 1
    • Assets ―― 资产 根目录
      • 1.1 Path Info ―― 路径信息
      • 1.2 Effect ―― 作用
  • 2
    • Resources ―― 资源 文件夹
      • 2.1 Path Info ―― 路径信息
      • 2.2 Mechanism ―― 机制
      • 2.3 Api ―― 接口函数
  • 3
    • StreamingAssets ―― 二进制流 资源文件夹
      • 3.1 Path Info ―― 路径信息
      • 3.2 Effect ―― 作用
      • 3.3 Api ―― 接口函数
  • 4
    • Persistent ―― 持久数据 文件夹
      • 4.1 Path Info ―― 路径信息
      • 4.2 Effect ―― 作用
  • 5
    • Application.temporaryCachePath ―― 临时路径
      • 5.1 PathInfo ―― 路径信息
      • 5.2 Effect ―― 作用
  • 6
    • Summarize ―― 总结
  • 支持
    • May Be ―― 开发者,总有一天要做的事!


全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Assets ―― 资产 根目录


1.1 Path Info ―― 路径信息

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

Application.dataPath
举个例子
Unity特殊文件夹以及各平台Application.xxxPath的路径图文详解教程_第2张图片


1.2 Effect ―― 作用

通过这个路径可以访问项目中任何文件夹中的资源,很多API都是基于这个文件目录的
查找目录都需要带上Assets,比如AssetDatabase;

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

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


2

Resources ―― 资源 文件夹

!! 存放资源的特殊文件夹 !!

2.1 Path Info ―― 路径信息

默认情况下, Unity 是没有 Resources 文件夹的,我们需要自行创建

Resources文件夹放在Assets目录下面

举个例子
Unity特殊文件夹以及各平台Application.xxxPath的路径图文详解教程_第3张图片


只要文件夹名称叫 “Resources”,它可以出现在根目录 Assets 下的任何位置,包括子目录中

如:Assets/Resources
与:Assets/xxx/xxx/xxx/Resources

两者是一样的。并且可以同时存在多个 Resources 文件夹
低版本Unity, 项目中虽然可以有多个 Resources 文件夹 , 但是其中如果存在同名资源,在打包时就会报错

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

(原因在1.2中做详细说明)
举个例子
Unity特殊文件夹以及各平台Application.xxxPath的路径图文详解教程_第4张图片


2.2 Mechanism ―― 机制

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

程序运行时,通过 Resources.Load() 等API 来读取数据对象

由于Unity 无法判断脚本有没有访问到 Resources 中的资源

所以 Resources 文件夹下的资源,不管用不用都会被打包发布到程序中

生成一个resources.assets ( 缺省的AssetBundle )

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

建议,只放 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,打开文件浏览器
举个例子

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


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 类访问资产,才可对数据进行正确读取
举个例子
Unity特殊文件夹以及各平台Application.xxxPath的路径图文详解教程_第7张图片
简化代码

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


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


    /// 
    /// 发起请求
    /// 
    /// 地址
    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
举个例子
Unity特殊文件夹以及各平台Application.xxxPath的路径图文详解教程_第8张图片


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: [email protected]

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

你可能感兴趣的:(Unity,3D,Unity3D初级入门必学)