在学习AssetBundle之前需要了解AssetBundle
AssetBundle标签:
在unity中creat一个cube,然后将其作为预设,选中预设可以在右下方看到assetBundle的标签为null
这个时候你可以为Cube新建一个(new)标签,【AssetBundle的标签要全为小写字母,可以加后缀,也可以不加,有三种写法1:cube 2:cube.unity3d 3:cube.assetbundle】
改完之后,我们就可以创建创建AssetBundle包了,
本例子用到了编辑器扩展来创建AssetBundle,你也可以直接把函数写在Start()方法里运行
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class Test : MonoBehaviour {
/// <summary>
/// 编辑器扩展,该脚本需要放到Editor文件夹下
/// 需要注意的:放在Editor文件夹下的脚本在打包时不会被发布出去(也就是不会被打包出去)
/// </summary>
[MenuItem("Bulid/Bulid AssetBundles")]
//unity的编辑器扩展,使用的时候需要引入命名空间using UnityEditor
//当点击Bulid AssetBundles的时候,会执行下面的方法
static void BulidAllAssetBundle()
{
//打包AssetBundles的方法
//unity5里面的BuildPipeline方法
//测试本地加载 方法 StreamingAssets的路径下
#if UNITY_ANDROID//宏定义 选择发布平台:这样写可以在发布不同平台的时候不需要修改代码
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,
BuildAssetBundleOptions.UncompressedAssetBundle,
BuildTarget.Android);
#elif UNITY_IPHONE
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,
BuildAssetBundleOptions.UncompressedAssetBundle,
BuildTarget.IOS);
#elif UNITY_STANDALONE_WIN||UNITY_EDITOR
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,//打包后文件的存放路径
BuildAssetBundleOptions.UncompressedAssetBundle,//是否压缩
BuildTarget.StandaloneWindows);//标准window平台,AssetBundles资源在不同平台下不共享
#endif
}
}
脚本写好后,在unity编辑面板会有Built
点击里面的Bulid AssetBundles就把场景中的带有assetbundle标签的物体打包成了assetbundle了
打包成功之后,在StreamingAssets文件夹下有这些文件
打包好了后,我们需要的是加载它,这个时候当然需要写脚本了(小谈一下:打包之后,被打包成AssetBundle包的那些预制体就可以删除了,因为已经没啥用了,但是你要记清楚他的名字,因为在加载AssetBundle包的时候不仅需要知道assetBundle标签名,还需要知道他的预制体名)
首先说第一种加载方式:(最简单的获取刚刚打包路径去加载)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class load : MonoBehaviour {
//这个路径是打包的路径,(简单的说就是你的AssetBundle包的路径)
private string pathUrl;
private void Start()
{
pathUrl =
//pathUrl = “file://” + Application.dataPath + “/StreamingAssets/”;
#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
}
void OnGUI()
{
if (GUILayout.Button(“LoadAsset”))
{
StartCoroutine(LoadAsset(“cube”, “Cube”));
}
}
///
/// 加载assetBundle文件
///
/// 标签名
/// 预制体名
///
private IEnumerator LoadAsset(string assetBundle,string resName)
{
string mUrl = pathUrl + assetBundle;
Debug.Log(mUrl);
//file://D:/AssetBundleTest/Assets/StreamingAssets/cube
WWW www = new WWW(mUrl);
// Debug.Log(www.url);
yield return www;//等待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);//false:卸载用过的,true卸载全部
//非托管资源:GC处理不了的,一些流文件
}
//非托管资源:GC处理不了的,一些流文件都会继承IDisposable接口
www.Dispose();//释放资源
}
}
将脚本挂在场景中的一个空物体上,运行,点击LoadAsset就可以加载出那个cube了
第二种,我随便将打包出的AssetBundle包放一个地方,只告诉你位置,标签和名字,然后使用unity去加载这个Cube。(其实第二种就是将这三个变量变成公有变量,代码还是第一种的代码,稍微有点改变)
首先介绍这三种变量:
1:位置,我放到了这里
标签名:cube 预制体为:Cube
脚本如下:
需要注意的是:你复制的路径前加上file://然后"“改为”/"
以上就是简单的AssetBundle打包还有,加载AssetBundle包
下面是一些需要记住的知识:
针对这个问题的解决方法是(假如这个cube需要一个脚本,那就把脚本加在cube的组件上,)然后再打包AssetBundle,一定要记得(预制体在打包之后可以删除,但是Scripts在挂在游戏对象上打包之后不能删除,删除后将加载不出来)
以上是我的总结,可能有很多欠缺,我慢慢的修改
最后小小宣传下:一个致力于unity游戏,模型,等资源的淘宝店铺,店里有unity3d成品游戏(源工程,源代码),场景资源,模型资源等,一切资源都特别优惠,店铺链接:【unity3D素材包/unity3d中世纪村庄包Medieval Village Pack】https://m.tb.cn/h.eaENjDH?sm=2b946c 点击链接,再选择浏览器咑閞;或復·制这段描述¥kIKkbAV3c3C¥后到?淘♂寳♀?