【Unity 笔记】AssetBundle API认识
程序员文章站
2022-04-01 09:43:29
...
开发平台:Unity
编程平台:Visual Studio 2017以上
编程语言:C#
参考书籍:UNITY官方案例精讲
返回相对于工程目录的存储路径
AssetDatabase.GetAssetPath(Object assetObject)
- 例如 Assets/_Scenes/Main.unity。
返回路径下 指定类型的第一对象
AssetDatabase.LoadAssetAtPath(string assetPath, Type type)
-
assetPath
为相对于工程目录的路径,路径下不区分大小写 -
assetPath
路径下所有平台需使用前向斜线("/"),不可使用反向斜线("\")
指定路径下 基于Asset对象创建新对象
AssetDatabase.CreateAsset(Object asset, string path)
-
path
必须包含Unity支持的Asset文件扩展名
例如 材质.mat
、动画片段.anim
、其他任意文件类.asset
- 创建完成后,可通过
AssetDatabase.AddObjectToAsset()
向 Asset 添加新的对象 - 该函数不可直接从
GameObject
创建Asset
,应使用PrefabUtility
类提供函数来实现
指定路径下 创建AssetBundle
BuildPipeline.BuildAssetBundle(Object mainAsset, Object[] assets, string pathName, BuildAssetBundleOptions assetBundleOptions=BuildAssetBundleOptions.CollectDependencics|BuildAssetBundleOptions.CompleteAssets, BuildTargettargetPlatform=BuildTarget.WebPlayer)
- 该函数用于创建 asset bundles,关键参数为前三个
-
mainAsset
:存储到Asset中的主对象 -
assets
:要存储到Asset中的对象列表,完成后通过键值访问 -
pathName
:存储的文件路径
注意:为 Standalone 和 WebPlayer 平台创建的asset bundle不能再移动平台上使用。
指定路径下 删除Asset
AssetDatabase.DeleteAsset(string path)
- 删除成功,则返回 True
- 删除失败 或 路径下 Asset 文件不存在、无法删除,则返回 False
指定路径下 立即删除Asset
Object.DestroyImmediate(Object obj, bool allowDestroyAssets=false)
指定路径下 创建空预制体对象
PrefabUtility.CreateEmptyPrefab(string path)
- 注意:若该路径下存在一预制体,新建的预制体会覆盖旧预制体(即 删除存在预制体并新建一个预制体)
使用游戏对象gameObject替换目标对象targetPrefab
PrefabUtility.ReplacePrefab(GameObject gameObject, Obejct targetPrefab, ReplacePrefabOptions options=ReplacePrefabOptions.Default)
依据预制体target实例化一个新的预制体
PrefabUtility.InstantiatePrefab(Object target)
- 注意:不同于
Instantiate()
,通过该函数实例化出来的预制体与源预制体是关联的。
指定URL获取指定版本的AssetBundle文件
WWW.LoadFromCacheOrDownLoad(string url, int version, uint crc=0)
- 返回值为
WWW
实例 - 若缓存中不存在下载过的指定版本的AssetBundle文件,会从指定URL处下载指定版本并存储于缓存中,在后续操作中复用,而非需求再下载。
访问已下载的AssetBundle内容
WWW.assetbundle
示例:
function Start()
{
var www = new WWW("http://myurl//myBundle.unity3d");
yield www;
Instantiate(www.assetBundle.mainAsset);
}
继承 ScriptableObejct 类
流程
- 创建 ScriptableObject 的子类,加入数据成员
- 用
ScriptableObject.CreateInstance
创建实例 - 使用实例创建AssetBundle:
AssetDatabase.CreateAsset
->AssetDatabase.LoadAssetPath
->BuildPipeline.BuildAssetBundle
->AssetDatabase.DeleteAsset
- 使用
WWW.assetBundle
访问创建的assetBundle
示例
- Assets 根目录下新建脚本 MyData.cs
using UnityEngine;
using System.Collections.Generic;
/// <summary>
/// 数据成员
/// </summary>
public class MyData : ScriptableObject
{
public List<Vector3> content;
}
- Assets 根目录下新建脚本 MyExporter.cs,该脚本将会在Assetsc菜单下新建一子菜单项MyExporter,单击该子菜单项后会在 Assets目录 下到处MyData的实例 MyData.assetbundle
using UnityEngine;
using UnityEditor;
using System.Collection.Generic;
public class MyExporter : MonoBehavior
{
[MenuItem("Assets/MyExporter")]
static void MyExec()
{
MyData md = ScriptableObject.CreateInstance<MyData>(); //创建实例
md.content = new List<Vector3>();
md.content.Add(new Vector3(0, 1, 2));
md.content.Add(new Vector3(2, 3, 4));
md.content.Add(new Vector3(3, 4, 5));
string a = "Assets/MyData.asset";
AssetDatabase.CreateAsset(md, a); //创建新对象a
//返回路径下第一个类型为MyData的预制件
Object o = AssetDatabase.LoadAssetAtPath(a, typeof(MyData));
string b = "Assets/MyData.assetbundle";
BuildPipeline.BuildAssetBundle(o, null, b);
AssetDatabase.DeleteAsset(a);
}
}
- Assets 根目录下新建脚本 Client.cs,该脚本通过
WWW.LoadFromCacheOrDownload()
下载
using UnityEngine;
using System.Collections;
public class Client : MonoBehaviour
{
IEnumerator Start()
{
string a = "file://" + Application.dataPath + "/MyData.assetbundle";
WWW www = WWW.LoadFromCacheOrDownload(a, 1);
yield return www;
//判断获取内容是否为空
if(!string.IsNullOrEmpty(www.error))
{
print(www.error);
return false;
}
MyData md = www.assetBundle.mainAsset as MyData;
if(md != null)
{
print(md.content[0]);
}
}
}
- 输出结果为(0.0,1.0,2.0)