前言
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包中的物体已经被初始化到了场景中,如下图所示:
2万+

被折叠的 条评论
为什么被折叠?



