您当前的位置: 首页 >  unity

野奔在山外的猫

暂无认证

  • 4浏览

    0关注

    85博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Unity 笔记】AssetBundle API认识

野奔在山外的猫 发布时间:2021-05-25 14:56:00 ,浏览量:4

开发平台: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;

/// 
/// 数据成员
/// 
public class MyData : ScriptableObject
{
	public List 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();  //创建实例
		md.content = new List();
		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)
关注
打赏
1659777066
查看更多评论
立即登录/注册

微信扫码登录

0.0412s