Chinar blog :www.chinar.xin
Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 |
助力快速完成 Unity 中常用路径的认识 为初学者节省宝贵的时间,避免采坑! |
介绍:这个是程序的数据文件所在文件夹的路径,也就是Assets文件夹的路径
通过这个路径可以访问项目中任何文件夹中的资源,很多API都是基于这个文件目录的
查找目录都需要带上Assets,比如AssetDatabase
;
注意:Application.dataPath是不允许在移动端使用的, 如果移动端有使用的话会直接卡住!因为移动端是没有访问权限的
Android:通常它会直接指向APK。例外情况是,如果您正在运行拆分二进制构建,在这种情况下它将指向OBB。
!! 存放资源的特殊文件夹 !!
默认情况下, Unity 是没有 Resources 文件夹的,我们需要自行创建
Resources
文件夹放在Assets
目录下面
只要文件夹名称叫 “Resources”,它可以出现在根目录 Assets 下的任何位置,包括子目录中
如:Assets/Resources
与:Assets/xxx/xxx/xxx/Resources
两者是一样的。并且可以同时存在多个 Resources 文件夹
低版本Unity, 项目中虽然可以有多个 Resources 文件夹 , 但是其中如果存在同名资源,在打包时就会报错
2018之后的版本测试,尚未出现此类情况
Resources
文件夹是一个只读的文件夹
程序运行时
,通过 Resources.Load()
等API 来读取数据对象
由于Unity 无法判断脚本有没有访问
到 Resources 中的资源
所以 Resources 文件夹下的资源,不管用不用
都会被打包发布到程序中
生成一个resources.assets
( 缺省的AssetBundle )
建议,只放
Prefab
或者一些Object
对象
Prefab
预制体所用到的资源会被打包发布。没有用到的资源,会被自动过滤掉
加载存储在 Resources 文件夹中的资源
函数名 | 功能 |
---|---|
FindObjectsOfTypeAll |
返回 Type 类型的所有对象(数组) |
Load |
指定路径的资源 |
LoadAll |
指定路径下的所有资源 |
LoadAsync |
异步加载 指定路径的资源 |
UnloadAsset |
从内存中卸载资源 |
UnloadUnusedAssets |
卸载未使用的资源 |
Unity 官方API入口
!!该目录中的任何文件,将原封不动
(不进行任何处理)
的被打包发布 !!
默认情况下, Unity 是没有 StreamingAssets 文件夹的,我们需要自行创建
StreamingAssets
文件夹放在Assets
目录下面
右键 Show in explorer
,打开文件浏览器
StreamingAssets 与 Resources 区别
Resources
文件夹下的资源打包发布时,会进行一次压缩和加密
StreamingAssets
文件夹下的资源打包发布时,原封不动(不进行任何处理)
所以
StreamingAssets
一般放置数据资源
文件,比如 Json /Xml 等数据文件
在
PC/MAC
中可实现对文件的“增删改查”等操作,但在移动端是一个只读路径
程序打包发布后,根据平台的差异性 (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;
///
/// 测试获取 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上
}
}
}
}
}
!!可读可写,常用于存放用户数据。应用程序更新,不会对其中文件造成影响 !!
它是一个用户数据文件目录,构建 Unity 应用程序时,自动生成该文件夹
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
此文件夹可读、可写
常用于存储一些可持久化的用户数据文件
此目录只对应一个应用程序,只要应用不被卸载 / 或是公司名且应用名称不做更改 / 此目录中的文件不会进行任何更改!
只能在应用程序运行时,才能读写操作
Chinar 建议将获得的文件,或是用户的基本信息,等等数据文件,保存到此目录中
例如,将 AssetBundle
包中读取的数据,写入该目录中
在编辑器扩展脚本中接着写
#if UNITY_EDITOR
[MenuItem("Chinar/TemporaryCachePath")]
#endif
private static void TemporaryCachePath()
{//打开目标路径
Application.OpenURL("file:///" + Application.temporaryCachePath);
}
点击编辑器按钮 Chinar
–> TemporaryCachePath
打开文件夹:
我们发现,Windows平台临时数据储存路径与数据持久化路径是一样的.
临时数据的缓存目录
各路径含义:
属性名称 | 含义 |
---|---|
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 |
Chinar 提供一站式《零》基础教程 使有限时间 具备无限可能! |
Chinar 知你所想,予你所求!( Chinar Blog )
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: [email protected]
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址