Unity实现简易打AB包并且加载的简易流程
前言
相信很多人在进行Unity面试的时候,都会被问及到是不是会用Unity打包的问题。Unity两种经典的动态加载资源的方式,Resources和AssetBundles。
Resources是动态内部调用,Recouces是在编辑环境下project的一个文件夹,调用里面的资源可以使用Resources类,比如使用Resources.load方法,打包后这个文件夹是不存在的,会统一生成assets资源。
AssetBudle是外部调用,要用AssetBundle首先要把资源打包成.assetbundle文件,再动态加载这个文件,本地或者网络都可以,这样可以减少打出程序包的大小,也可以实现通过服务器加载游戏资源。这篇博客简单介绍下使用AssetBundle加载资源的方法。
步骤
1.新建项目,在Assets文件夹下建立Editor文件夹和StreamingAssets文件夹,如下图所示:
2.在Editor文件夹下建立CreateAssetBundle.cs脚本,切记,一定要在Editor文件夹下建立脚本,否则打包会报错,代码如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class CreateAssetBundle
{
[MenuItem("Bulid/BUild AssetBundles")]//编辑器菜单路径 打包
static void BulidAllAssetBundle()
{
#if UNITY_ANDROID//安卓端
Debug.Log("安卓平台打包成功");
BulidPipeline.BulidAssetBundles(Application.streamingAssetsPath,
BulidAssetBundleOptions.UncompressedAssetBundle,
BulidTarget.Android);
#elif UNITY_IPHONE//IOS
Debug.Log("IOS平台打包成功");
BulidPipeline.BulidAssetBundles(Application.streamingAssetsPath,
BulidAssetBundleOptions.UncompressedAssetBundle,
BulidTarget.iOS);
#elif UNITY_STANDALONE_WIN||UNITY_EDITOR//PC或则编辑器
Debug.Log("PC平台打包成功");
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,
BuildAssetBundleOptions.UncompressedAssetBundle,
BuildTarget.StandaloneWindows);
#endif
}
}
3.因为这个脚本不是继承MonoBehaviour的,所以不需要将它挂载到场景中,写完这个脚本后,可以看到Unity菜单栏上多了一个Build按钮,如图所示:
4.在场景中新建一个Cube,将其设置成为预制体,在预制体的Inspector下将AssetBundle的name修改为cube,如下图所示:
5.依次点击菜单栏Bulid---->Build AssetBundles,出现打包进度,完成后,可以发现AB包已经被打到了StreamingAssets文件夹中,如下图所示:
6.接着就是对打出的AB包的调用了,新建Load.cs脚本,代码如下所示:
using System.Collections;
using UnityEngine;
public class Load : MonoBehaviour
{
private string pathUrl;//AB包路径
public string abName;//AB包的名字
public string prefabsName;//想要从AB包中加载物体的名字
void Start()
{
pathUrl =
#if UNITY_ANDROID
"jar:file://"+Application.dataPath+"!/assets/";
#elif UNITY_IPHONE
Application.dataPath+"/Raw/";
#elif UNITY_STANDALONE_WIN||UNITY_EDITOR
"file://" + Application.dataPath + "/StreamingAssets/";
#endif
}
public IEnumerator LoadAsset(string assetBundle, string resName)
{
string mUrl = pathUrl + assetBundle;
WWW www = new WWW(mUrl);
yield return www;
if (!string.IsNullOrEmpty(www.error))
Debug.LogError(www.error);
else
{
Object obj = www.assetBundle.LoadAsset(resName);
yield return Instantiate(obj);
www.assetBundle.Unload(false);
}
www.Dispose();
}
private void OnGUI()
{
if (GUILayout.Button("LoasAsset"))
{
StartCoroutine(LoadAsset(abName, prefabsName));
}
}
}
7.将该脚本挂载到场景的物体上,并且将Prefabs的名称赋值到到挂载的脚本上,如下图所示:
8.运行场景,点击打包按钮,发现AB包中的物体已经被初始化到了场景中,如下图所示: