方法
在程序中安装unity自带的打包工具 assetsbundle,
最低是2018好像,更低的版本要到github 上下源码然后导入到packages里
这里就不多赘述
点击需要打包的资源,在他的inspector里的最下方设置assetsbundle的名称,可以新建自定义都行,整理好之后
打开windows下的assetsbundle browser
在configure 里能看到刚刚整理好的资源已经被assetsbundle识别了,然后就是在build里设置需要打包出来的类型,是pc还是android还是ios,然后点击需要的参数进行build即可
这里需要注意,因为这只是资源的打包,热更新还需要lua代码进行更新的操作。所以当你同时导入assetsbundle和xlua资源的时候,build时,会出现xlua找不到一些组件的报错,这里需要打开genertor这个代码,找到getgenconfig这个方法,里的blocklist,在这里添加报错的那些类型,将他们设置为黑名单, 这样就不会识别到他们,也就不会报错了
new List<string>(){"UnityEngine.Light", "shadowRadius"},
new List<string>(){"UnityEngine.Light", "SetLightDirty"},
new List<string>(){"UnityEngine.Light", "shadowAngle"},
new List<string>(){"UnityEngine.Light", "shadowAngle"}
复制进去,保存。然后在
这里clear 再generate一下,打包就能成功了~
另一个方法是删除掉xlua里自带的gen和examples这两个文件,亲测也能跑通
加载打包后的资源
思路-同步
使用assetsbundle自带的api进行调用即可
有两种,一个是同步,一个异步
看需求进行调用
这里用了同步,首先创建一个assetsbundle类,作为启动类,加载streamingassets里打包备份的数据
然后通过这个启动类去加载里面具体的数据,比如gameobject和其他资源
然后进行赋值即可
public GameObject img;
void Start()
{
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "ui");
Sprite clothe = ab.LoadAsset("clothe",typeof(Sprite))as Sprite;
img.GetComponent<Image>().sprite = clothe;
}
这里为什么要用streamingassets的路径是因为,如果用assetsbundle默认的打包路径,在项目进行打包的时候,里面的所有资源都不会参与打包,只有streamingassets里的文件能参与打包,所以为了配合后面的热更新我们必须用到这个路径
这里还需要注意一点,assetsbundle这个启动类不能放在方法外去实例化,否则会直接报错,或者这样写也可以
异步代码
异步的话要用到协程,也就是IEnumerator这个东东
具体的使用如下
创建异步加载的启动类,然后获得里面的资源即可
IEnumerator getAsync(string modelName,string detailName)
{
AssetBundleCreateRequest abr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath+"/"+modelName);
yield return abr;
AssetBundleRequest ar = abr.assetBundle.LoadAssetAsync(detailName, typeof(Sprite));
yield return ar;
img.GetComponent<Image>().sprite = ar.asset as Sprite;
}
然后在start方法里调用这个协程,添加对应的ab包名称和具体的资源名称即可实现加载