最近有个项目要用到热更新,很久之前用过assets bundle,很长时间没用过也不太会了,于是就想好好学学。
我这边的需求是只需要实现模型资源的热更新,因此assets bundle是够用的,不需要lua啥的,assets bundle之前用起来感觉不太好用,于是就想尝试下addressables,了解了下,发现确实还是挺好用的。
搭建本地资源服务器
首先,我遇到的第一个问题就是我没有服务器,资源没地方放。这也简单,用Nodejs搭建一个本地的服务器就行了。
安装nodejs
第一步要安装nodejs,这个网上教程一堆,大家自己搞定吧;
创建项目目录
在硬盘里创建一个文件夹,用来存放热更新要用到的资源;
初始化Node.js项目
打开cmd切换到这个文件夹,输入:npm init -y 初始化一个新的Node.js项目,这将创建一个 package.json
文件,其中包含项目的基本信息;
安装 http-server
模块
http-server
是一个简单的、零配置的命令行HTTP服务器,适合用于本地开发。接着在控制台输入:npm install http-server -g
启动本地HTTP服务器
接着输入:http-server -p 8080,显示如下内容表示启动成功;
随便创建个html文件放在创建好的文件夹下,写点代码,验证下;
没啥毛病,接下来将打包好的资源放到这个文件夹下就可以了。
打包资源
打包资源之前,先把Addressables Profiles 里的Remote改成Custom,BuildPath和LoadPath改成下图(根据自己实际的来);
按照视频的操作,将一个模型资源拖拽到Local Group下面;
然后创建一个脚本,代码如下;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class SpawnObjectAddressables : MonoBehaviour
{
[SerializeField] private AssetReference reference;
string rootPath = "Assets/WONILMAX/SCi-fi_Grenade/Prefabs/Car.prefab";
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.T))
{
AsyncOperationHandle<GameObject> operationHandle = reference.LoadAssetAsync<GameObject>();
operationHandle.Completed += OperationHandle_Completed;
}
if(Input.GetKeyDown(KeyCode.W))
{
AsyncOperationHandle<GameObject> operationHandle= Addressables.LoadAssetAsync<GameObject>(rootPath);
operationHandle.Completed += OperationHandle_Completed;
}
}
private void OperationHandle_Completed(AsyncOperationHandle<GameObject> operationHandle)
{
if(operationHandle.Status==AsyncOperationStatus.Succeeded)
{
Instantiate(operationHandle.Result);
}
else
{
Debug.Log("Failed to load!");
}
}
}
脚本中我们可以看到,按T键生成刚才已经拖拽到 Local Group下面的模型,按W键要生成的模型我先不设置。
将软件发布一下,发布完成后我们可以看到,在ServerData文件夹下自动创建了一个StandaloneWindows64的文件夹,里面有三个文件;
直接将这个文件夹拷贝到本地服务器的地址下;
运行程序,按T键生成了模型,按W键没有反应;
接下来将另一个模型也拖拽到 Local Group‘;点击Build旁的小三角,选择“Update a Previus Build”,选择windows,选择addressables_content_state.bin,点击“打开”,unity会更新资源;
结束后SeverData里面会生成新的bundle的文件和替换掉另外两个文件,把这三个文件拷贝到服务器的文件夹下,删掉服务器中就得bundle文件;
运行之前打包好的软件,按T键生成了模型,按W键同样也生成了,没毛病。
好了,这样就实现了简单的模型资源热更新,实际应用过程中大家自由扩展。就这样吧。有用的话点个赞吧 !