Unity资源路径及加载外部资源介绍

本文详细介绍了Unity3D中不同资源路径的应用场景与读取方法,包括Resources、StreamingAssets、AssetBundle及PersistentDataPath等,同时提供了各路径在Android与iOS平台上的具体表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Unity3D中的资源路径

路径属性 路径说明
Application.dataPath 此属性用于返回程序的数据文件所在文件夹的路径。例如在Editor中就是Assets了。
Application.streamingAssetsPath 此属性用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径。放在Unity工程StreamingAssets文件夹中的资源发布后都可以通过这个路径读取出来。
Application.persistentDataPath 此属性用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件。
Application.temporaryCachePath 此属性用于返回一个临时数据的缓存目录。

Unity3D中的资源的处理种类

Unity中的资源资源的处理种类大致分为:Resources、StreamingAssets、AssetBundle、PersistentDataPath 四类。

Resources

是作为一个Unity的保留文件夹出现的,也就是如果你新建的文件夹的名字叫Resources,那么里面的内容在打包时都会被无条件的打到发布包中。

特点:

  1. 只读,即不能动态修改。所以想要动态更新的资源不要放在这里。
  2. 会将文件夹内的资源打包集成到.asset文件里面。因此建议可以放一些Prefab,因为Prefab在打包时会自动过滤掉不需要的资源,有利于减小资源包的大小。
  3. 资源读取使用Resources.Load()。
StreamingAssets

StreamingAssets和Resources很像。同样作为一个只读的Unity3D的保留文件夹出现。不过两者也有很大的区别,那就是Resources文件夹中的内容在打包时会被压缩和加密。而StreamingAsset文件夹中的内容则会原封不动的打入包中,因此StreamingAssets主要用来存放一些二进制文件。

特点:

  1. 只读不可写。
  2. 主要用来存放二进制文件。
  3. 只能用过WWW类来读取。
AssetBundle

AssetBundle就是把prefab或者二进制文件封装成AssetBundle文件。

特点:

  1. 是Unity3D定义的一种二进制类型。
  2. 使用WWW类来下载。
PersistentDataPath

这个路径下是可读写。而且在IOS上就是应用程序的沙盒,但是在Android可以是程序的沙盒,也可以是sdcard。并且在Android打包的时候,ProjectSetting页面有一个选项Write Access,可以设置它的路径是沙盒还是sdcard。

  1. 内容可读写,不过只能运行时才能写入或者读取。 提前将数据存入这个路径是不可行的
  2. 无内容限制。你可以从 StreamingAsset 中读取二进制文件或者从 AssetBundle 读取文件来写入 PersistentDataPath 中。
  3. 写下的文件,可以在电脑上查看。同样也可以清掉。
  4. 需要使用WWW类来读取。

android平台

路径属性 路径
Application.dataPath /data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
Application.persistentDataPath /data/data/xxx.xxx.xxx/files
Application.temporaryCachePath /data/data/xxx.xxx.xxx/cache

ios平台

路径属性 路径
Application.dataPath Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPath Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
Application.persistentDataPath Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePath Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches

资源文件的读取

接下来我们来介绍一下Resources、StreamingAssets、AssetBundle、PersistentDataPath这四个东东的读取方法。

Resources

首先我们新建一个Resources目录,并且并将资源放在这目录中。如图:

https url

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class LoadResources : MonoBehaviour {

	public Image image;

	// Use this for initialization
	void Start () {
	
		image.overrideSprite = Resources.Load ("animotiong_2", typeof(Sprite)) as Sprite;
	
	}

}

StreamingAssets

首先我们新建一个StreamingAssets目录,并且并将资源放在这目录中。如图:

https url

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using UnityEngine;
using System.Collections;

public class LoadResources : MonoBehaviour {

	string _result;


	// Use this for initialization
	void Start () {
	
		StartCoroutine(LoadXML());
	
	}
	
	IEnumerator LoadXML() {
		string sPath= Application.streamingAssetsPath + "/test.xml";
		WWW www = new WWW(sPath);
		yield return www;
		_result = www.text;
	}
}

PersistentDataPath

之前我们说过,内容可读写,不过只能运行时才能写入或者读取。 提前将数据存入这个路径是不可行的。也就是说,PersistentDataPath是在运行时生成的,例如通过网络下载资源存在放PersistentDataPath中。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using UnityEngine;
using System.Collections;

public class LoadResources : MonoBehaviour {

	string _result;

	// Use this for initialization
	void Start () {
	
		StartCoroutine(LoadXML());
	
	}
	
	IEnumerator LoadXML() {
		string sPath= Application.persistentDataPath + "/test.xml";
		sPath = "file://" + sPath;
		WWW www = new WWW(sPath);
		yield return www;
		_result = www.text;

	}
}

这加载方式看起来与StreamingAssets很相识,但是注意这里多了行sPath = "file://" + sPath;这很重要!!想要通过WWW类加载PersistentDataPath必须使用file://协议实现加载。


本文90%的内容都是参考:
http://www.tuicool.com/articles/qMNnmm6

里面有讲述AssetBundle的加载方式。

<think>我们正在使用Unity的Luban插件,并且需要验证资源路径配置。根据引用[1],Luban是一个强大的游戏配置解决方案,我们可以在Unity项目中使用它。用户的问题是关于资源路径校验的,即如何配置Luban来验证在配置文件中指定的资源路径Unity项目中是有效的。步骤: 1.理解需求:在配置文件中,我们可能会指定一些资源路径(如预制体、图片等),我们需要确保这些路径Unity项目中是存在的,避免运行时因为资源缺失而报错。2.Luban的验证机制:Luban支持自定义验证规则。我们可以通过编写自定义的验证器(validator)来实现资源路径的校验。3.实现思路:-在Luban的配置文件中定义资源路径字段(例如:prefabPath,imagePath等)。-编写一个自定义的验证器,该验证器将检查配置中给出的路径是否在Unity项目的Assets目录下存在。-在生成配置数据时,Luban会运行这个验证器,如果路径不存在,则生成失败并报错。4.具体步骤(参考引用[1]中的Luban配置流程):a.在Luban的配置中,为需要验证资源路径的字段添加验证规则。b.编写一个C#脚本(作为外部类型转换器或验证器)来执行路径检查。c.在Luban的配置文件中引用这个验证器。5.代码示例:-首先,在Luban的配置定义文件(通常是.xlsx或.xml)中,定义字段并指定验证器。例如:```item_id,item_name,prefab_path1,Apple,Assets/Resources/Prefabs/Apple.prefab```我们需要为prefab_path字段添加验证规则。-然后,编写一个验证器类,例如`ResourcePathValidator`。这个类需要实现Luban的验证接口。-验证器代码示例(需要放在Luban的Tools目录下,并在配置中指定):```csharpusing System.IO;using Luban.Job.Common.Types;usingLuban.Job.Common.TypeVisitors;using Luban.Job.Common.Utils;namespace MyGame{publicclass ResourcePathValidator: ITypeVisitor{public staticResourcePathValidator Ins{ get; }= newResourcePathValidator();publicvoid Validate(ITypetype,string path, stringvalue){if(type.IsString){//假设我们的Unity项目根目录是已知的,这里需要获取到Unity项目的Assets目录string assetsPath =Path.Combine(Application.dataPath,value);if(!File.Exists(assetsPath)&& !Directory.Exists(assetsPath)){throw newSystem.Exception($"资源路径'{value}'不存在(在{path})");}}}}}```注意:上述代码中的`Application.dataPath`是Unity的API,不能在非Unity环境下使用。因此,我们需要在Luban的校验环境中模拟Unity项目的路径结构。实际上,Luban的校验是在生成阶段(编辑阶段)进行的,所以我们可以通过指定Unity项目的根目录来检查路径。-修改:由于Luban生成配置是在外部工具中运行,我们可以通过环境变量或配置文件来指定Unity项目的Assets目录的绝对路径。然后在验证器中使用这个绝对路径来拼接资源路径。例如,我们在gen.bat中设置一个环境变量:```batset UNITY_PROJECT_PATH=D:\YourUnityProject```然后在验证器中:```csharpstringunityProjectPath =Environment.GetEnvironmentVariable("UNITY_PROJECT_PATH");if (string.IsNullOrEmpty(unityProjectPath)){throw newException("环境变量UNITY_PROJECT_PATH未设置!");}stringfullPath= Path.Combine(unityProjectPath, "Assets",value);```-在Luban的配置定义中,为字段指定验证器:在定义表时,我们可以为字段添加validator属性,例如(以xml定义为例):```xml<tablename="item"><var name="prefab_path" type="string" validator="MyGame.ResourcePathValidator"/></table>``` 6.配置Luban使用这个验证器:在Luban的配置文件中(如designer_config.xml),需要包含这个自定义验证器所在的程序集。通常,我们需要将这个验证器编译成一个dll,然后在Luban配置中引用。但是,根据引用[1]中的示例,我们可以将自定义脚本放在Tools目录下,并在gen.bat中指定编译。具体步骤可能如下:-在Luban/Tools目录下创建一个csproj项目文件,将验证器代码文件包含进去,并编译成dll。-在gen.bat中,使用dotnet build编译这个项目,然后在运行Luban生成命令时,通过`--custom_plugin`参数指定这个dll。另一种更简单的方式(如果Luban支持内联脚本):在Luban的配置文件中直接引用源代码文件(需要Luban支持)。 7.运行生成:运行gen.bat时,Luban会执行验证器,如果资源路径不存在,就会报错。8.注意事项:-路径分隔符:Windows使用反斜杠,而Unity中使用正斜杠。在验证器中,我们使用`Path.Combine`可以处理不同操作系统的分隔符问题。-路径区分大小写:在Windows上不区分,但在其他操作系统可能区分。如果项目跨平台,需要注意。 9.替代方案:如果Luban的验证器机制比较复杂,也可以考虑在生成配置后,在Unity中编写一个编辑器脚本,遍历生成的配置数据并检查资源路径是否存在。但这会增加额外的步骤,不如在生成时直接验证。总结:通过自定义Luban验证器,我们可以在生成配置数据的同时验证资源路径,确保配置数据的正确性。 相关问题: 1. Luban中如何自定义类型转换器? 2. Luban支持哪些内置的验证器? 3.如何在Luban中处理多语言配置?</think>### Unity Luban 资源路径校验配置指南 在 Unity 中使用 Luban 进行资源路径校验,主要通过 **自定义验证器(Validator)** 实现。以下是详细配置步骤: --- #### 一、核心实现原理 1. **Luban 验证机制** Luban 支持通过自定义验证器检查配置数据,当资源路径无效时,会在生成配置阶段抛出错误[^1]。 2. **路径校验逻辑** 使用 `System.IO` 检查路径是否存在,结合 Unity 的 `Application.dataPath` 定位资源目录。 --- #### 二、具体配置步骤 ##### 1. 创建自定义验证器脚本 在 Luban 的 `Tools` 目录下新建 `ResourcePathValidator.cs`: ```csharp using System.IO; using Luban.Job.Common.Types; using Luban.Job.Common.TypeVisitors; public class ResourcePathValidator : ITypeVisitor { public static ResourcePathValidator Ins { get; } = new ResourcePathValidator(); public void Validate(IType type, string key, string path) { if (type.IsString) { // 拼接Unity项目完整路径 string fullPath = Path.Combine(Application.dataPath, path); // 校验路径是否存在 if (!File.Exists(fullPath) && !Directory.Exists(fullPath)) { throw new System.Exception($"资源路径无效: {path} (表字段: {key})"); } } } } ``` ##### 2. 配置表字段绑定验证器 在 Excel 配置表中指定验证器(以 `.xlsx` 为例): | id | name | prefab_path (validator:ResourcePathValidator) | |----|-----------|-----------------------------------------------| | 1 | 玩家角色 | Assets/Resources/Characters/Player.prefab | | 2 | 敌人 | Assets/Resources/Characters/Enemy.prefab | > ⚠️ **关键点**:在表头字段后添加 `(validator:ResourcePathValidator)` 标记 ##### 3. 修改 Luban 生成配置 在 `designer_configs` 的根配置文件中注册验证器: ```xml <validator name="ResourcePathValidator" assembly="MyValidators" type="ResourcePathValidator" /> ``` ##### 4. 设置 Unity 项目路径(关键!) 在 `gen.bat` 中添加环境变量传递 Unity 路径: ```bat set UNITY_PROJECT_PATH=D:\YourProject\Assets dotnet Luban.Client.dll ... --env UNITY_PROJECT_PATH=%UNITY_PROJECT_PATH% ``` ##### 5. 在验证器中获取路径 修改验证器代码: ```csharp string unityRoot = Environment.GetEnvironmentVariable("UNITY_PROJECT_PATH"); string fullPath = Path.Combine(unityRoot, path); ``` --- #### 三、校验流程执行 1. 运行生成命令: ```bash ./gen.bat ``` 2. **成功情况**: 所有路径有效 → 正常生成配置数据。 3. **失败情况**: 若路径无效,Luban 会抛出错误: ``` [ERROR] 资源路径无效: Assets/Resources/Missing.prefab (表字段: prefab_path) ``` --- #### 四、最佳实践建议 1. **路径规范** 统一使用 `Assets/...` 相对路径,避免绝对路径。 2. **扩展校验** 如需检查资源类型(如必须为 Prefab),添加 UnityEditor 扩展: ```csharp #if UNITY_EDITOR var obj = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(path); if (obj == null) throw new Exception($"资源加载失败: {path}"); #endif ``` 3. **自动化集成** 在 CI/CD 流程中加入生成步骤,确保资源变更后立即暴露路径问题[^1]。 --- ### 相关问题 1. Luban 如何实现自定义数据类型校验? 2. 如何在 Luban 中处理多资源路径的批量验证? 3. Luban 生成配置时如何与 Unity 编辑器深度集成? 4. 资源路径变更时如何自动更新 Luban 配置表? > [^1]: Luban 支持通过自定义验证器和环境变量实现灵活的资源校验流程。 > [^3]: 资源路径校验需结合 System.IO 和 Unity路径规范实现跨平台兼容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值