【Unity 笔记】AssetBundle API认识

开发平台: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)
  1. 注意:若该路径下存在一预制体,新建的预制体会覆盖旧预制体(即 删除存在预制体并新建一个预制体)

使用游戏对象gameObject替换目标对象targetPrefab

PrefabUtility.ReplacePrefab(GameObject gameObject, Obejct targetPrefab, ReplacePrefabOptions options=ReplacePrefabOptions.Default)

依据预制体target实例化一个新的预制体

PrefabUtility.InstantiatePrefab(Object target)
  1. 注意:不同于Instantiate(),通过该函数实例化出来的预制体与源预制体是关联的。

指定URL获取指定版本的AssetBundle文件

WWW.LoadFromCacheOrDownLoad(string url, int version, uint crc=0)
  1. 返回值为 WWW实例
  2. 若缓存中不存在下载过的指定版本的AssetBundle文件,会从指定URL处下载指定版本并存储于缓存中,在后续操作中复用,而非需求再下载。

访问已下载的AssetBundle内容

WWW.assetbundle

示例:

function Start()
{
	var www = new WWW("http://myurl//myBundle.unity3d");
	yield www;
	Instantiate(www.assetBundle.mainAsset);
}

继承 ScriptableObejct 类

流程

  1. 创建 ScriptableObject 的子类,加入数据成员
  2. ScriptableObject.CreateInstance 创建实例
  3. 使用实例创建AssetBundle:
    AssetDatabase.CreateAsset -> AssetDatabase.LoadAssetPath -> BuildPipeline.BuildAssetBundle -> AssetDatabase.DeleteAsset
  4. 使用 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)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值