老样子,先分享一个链接,主题就是 AssetBundle 的创建和加载。
http://www.cnblogs.com/tekkaman/p/4040081.html
首先,不负责任的说一下,创建 AssetBundle 的代码原链接找不到了,所以就不上了。
1、AssetBundle 的创建。这里我采用了 BuildPipline 来完成创建,并写了一个自定义菜单。
创建一个脚本,代码如下
using UnityEngine;
using UnityEditor; // 需要手动添加此项
public class CustomEditor : MonoBehaviour {
[MenuItem("Custom Editor/Build AssetBundles")] // 菜单的层次和名称
static void CreateAssetBundlesMain() // 菜单执行的操作,一定要是 static
{
BuildPipeline.BuildAssetBundles( // 为选中的对象创建 AssetBundle
"Assets/StreamingAssets", // AssetBundle 创建完成后存储的位置
BuildAssetBundleOptions.None, // 因为 CollectDependency 在 5.4 版本以后已经成为默认包含的选项,所以这里为 None
targetPlatform : BuildTarget.StandaloneWindows64); // 创建的 AssetBundle 对应的平台
}
[MenuItem("Custom Editor/Clean Cache")] // 清除缓存
static void CleanCache()
{
Caching.CleanCache(); // 清除缓存
Debug.LogFormat("Clean cache finished.");
}
}
这样就完成了 Custom Editor / Build AssetBundles 和 Custom Editor / Clean Cache 两个菜单项的创建。
创建 AssetBundle 的操作:
I、在 Project 视图中选中要创建 AssetBundle 的资源(可以是图片、声音、动画等,也可以是文件夹),在右下角添加 Asset Label,如图所示
II、得到的 AssetBundle 如下图所示:
说明的是:需要对每个资源分配 Asset Label,同时,加载过程中需要考虑依赖关系,先加载被依赖的资源。
2、加载时的操作:
两种方式加载,第一种是直接从本地的 AssetBundle 文件中加载,要求创建时不能压缩,关键操作的脚本如下:
AssetBundle asset = AssetBundle.LoadFromFile("Assets/StreamingAssets/mut.prb");
Object mutObj = asset.LoadAsset("MutPrb");
第二种方式,使用 WWW 完成下载和加载,关键操作分为两部分:
I、下载资源文件的函数:
/// <summary>
/// 从给定地址下载并加载资源
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
IEnumerator LoadWWW(string path)
{
WWW www = WWW.LoadFromCacheOrDownload(path, 0);
yield return www;
if(null == www)
{
Debug.LogFormat("Null www");
yield break;
}
if (!string.IsNullOrEmpty( www.error))
{
Debug.LogFormat("Error found : " + www.error);
yield break;
}
asset = www.assetBundle; // 获得 AssetBundle
mutObj = asset.LoadAsset("MutPrb"); // 从 AssetBundle 中加载指定名称的资源
}
函数返回值为 IEnumerator,调用时使用 StartCoroutine 调用。
II、下载文件并加载资源
StartCoroutine(LoadWWW("file:///G:/workspace/Demos/Assets/StreamingAssets/mut.prb")); // 一定要使用 file:/// 才能从本地进行下载
完成加载后,可以从 Object 进行实例化得到保存的预制体,如下:
GameObject obj = Instantiate(mutObj) as GameObject; // 实例化一个对象
到这里,已经可以实现将资源导出为 AssetBundle 然后再加载近场景的过程了,接下来看完整脚本。
3、加载时挂在游戏对象上的完整脚本:
using UnityEngine;
using System.Collections;
public enum LoadMode
{
www, // 使用 WWW 从服务器下载资源并进行实例化
fromFile, // 直接从本地 AssetBundle 文件加载
}
public class CreateMutWhereYouHit : MonoBehaviour {
AssetBundle asset;
Object mutObj;
LoadMode loadMode = LoadMode.www;
// 初始化时完成加载
void Start () {
Caching.CleanCache(); // 清除缓存
Debug.LogFormat("Persistent data path is : {0}", Application.persistentDataPath.ToString());
switch (loadMode)
{
case LoadMode.fromFile: // 直接从本地 AssetBundle 文件加载
asset = AssetBundle.LoadFromFile("Assets/StreamingAssets/mut.prb");
mutObj = asset.LoadAsset("MutPrb");
break;
case LoadMode.www: // 使用 WWW 从服务器下载资源并进行实例化
StartCoroutine(LoadWWW("file:///G:/workspace/Demos/Assets/StreamingAssets/mut.prb"));
// 一定要使用 file:/// 才能从本地进行下载
break;
}
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
Vector3 iactPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 获取鼠标点击的屏幕位置变换到世界坐标系下的位置
GameObject obj = Instantiate(mutObj) as GameObject; // 实例化一个对象
iactPos.z = obj.transform.localPosition.z;
obj.transform.localPosition = iactPos;
obj.SetActive(true);
}
}
void OnDestroy()
{
if(null!=asset)
asset.Unload(true); // true 的时候,会将在使用的资源也释放。 false 仅释放内存中的镜像
}
/// <summary>
/// 从给定地址下载并加载资源
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
IEnumerator LoadWWW(string path)
{
WWW www = WWW.LoadFromCacheOrDownload(path, 0);
yield return www;
if(null == www)
{
Debug.LogFormat("Null www");
yield break;
}
if (!string.IsNullOrEmpty( www.error))
{
Debug.LogFormat("Error found : " + www.error);
yield break;
}
asset = www.assetBundle; // 获得 AssetBundle
mutObj = asset.LoadAsset("MutPrb"); // 从 AssetBundle 中加载指定名称的资源
}
}
完整脚本的功能是在鼠标点击的位置创建一个预制体,这里放出完整脚本的目的,是为了让读者能够查找一些我疏忽而未指出的细节。
关于链接,讲到了很多选项的作用,另外再推荐一个链接:
http://www.xuanyusong.com/archives/2405
这个是雨凇的,其实经常看雨凇的 Unity 先关的东西,但是没有怎么推荐过雨凇的链接,是有原因的:
1、每次其都是一个比较具体的实验,有可参考的东西,但是毕竟是方向性的东西,所以不够;
2、感觉他代入的感觉跟我理解的走势不太一致,这个纯属个人原因。
不过他的东西还是很多,而且是这方面的大牛,所以还是给大家推荐一下。