欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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)
  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)