6.逻辑串联
6.1 知识点
创建一个Main脚本,用于控制加载界面的显示逻辑,挂载到场景中空物体
public class Main : MonoBehaviour
{
void Start()
{
AssetBundleManager.Instance.LoadAssetBundleResourceAsync<GameObject>("loading_ui", "LoadingPanel", (panelObj) =>
{
// 只需要去设置加载界面相关的内容
GameObject canvasObj = GameObject.Find("Canvas");
panelObj.transform.SetParent(canvasObj.transform, false);
// 在进行AB包热更新之前 可以先把AB包管理器中记录的相关AB包清理 这样再之后使用时才不会出问题 不然主包已经有记录
AssetBundleManager.Instance.ClearAssetBundle();
// 获取面板脚本 执行AB包相关的更新
LoadingPanel panel = panelObj.GetComponent<LoadingPanel>();
panel.BeginUpdate();
});
}
}
热更新项目中添加逻辑入口,删除之前生成的热更文件,重新生成后改成txt后缀,重新放入AB包中,打包,生成对比文件后上传
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace HotFix_Project
{
class ILRuntimeMain
{
/// <summary>
/// 热更逻辑主入口
/// </summary>
public static void StartILRuntime()
{
// 把逻辑丢给热更这边处理
Debug.Log("热更逻辑执行");
}
}
}
LoadingPanel的AB包更新完毕回调中添加热更相关逻辑
// 第二:AB包更新完毕后 需要去处理ILRuntime初始化相关的逻辑
public void ABUpdateOverDoSomthing(bool isOver)
{
if (!isOver)
{
infoTxt.text = "AB包下载更新出错,请检查网络连接或联系服务商";
return;
}
infoTxt.text = "资源加载结束";
// ILRuntime的初始化相关
ILRuntimeManager.Instance.StartILRuntime(() =>
{
// ILRuntime相关内容加载结束 就可以执行游戏逻辑了
infoTxt.text = "游戏初始化完毕";
// 热更相关逻辑执行
ILRuntimeManager.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "StartILRuntime", null, null);
// 热更相关逻辑执行
}, (info) => { infoTxt.text = info; });
}
直接运行可以看到是从服务器下载的热更AB包
发布空壳应用程序
进行打包应用程序,打包时注意也要注释 appDomain.UnityMainThreadID = Thread.CurrentThread.ManagedThreadId;
,不然也会报错。发布应用程序后可以正常运行,正常从服务器下载。
热更新表现
修改登录面板UI
修改入口代码,重新生成AB包,重新上传到服务器后,进入发布后的应用程序,会从服务器下载最新的AB包,实现热更新
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace HotFix_Project
{
class ILRuntimeMain
{
/// <summary>
/// 热更逻辑主入口
/// </summary>
public static void StartILRuntime()
{
// 把逻辑丢给热更这边处理
Debug.Log("热更逻辑执行");
GameObject.Destroy(GameObject.Find("LoadingPanel"));
AssetBundleManager.Instance.LoadAssetBundleResourceAsync<GameObject>("loading_ui", "LoadingPanel", (panelObj) =>
{
// 只需要去设置加载界面相关的内容
GameObject canvasObj = GameObject.Find("Canvas");
panelObj.transform.SetParent(canvasObj.transform, false);
});
}
}
}
再次修改入口逻辑,打一个新的AB包,从AB包中加载资源。重新生成后上传,进入我们发布后的应用程序也能实现热更新。(默认Cube资源丢失是其他问题,不用管)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace HotFix_Project
{
class ILRuntimeMain
{
/// <summary>
/// 热更逻辑主入口
/// </summary>
public static void StartILRuntime()
{
// 把逻辑丢给热更这边处理
Debug.Log("热更逻辑执行");
// 删除加载界面(只是测试 所以比较粗暴)
GameObject.Destroy(GameObject.Find("Canvas"));
// 在场景上动态创建一个立方体
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
GameObject sphere = AssetBundleManager.Instance.LoadAssetBundleResource<GameObject>("gameobject", "Sphere");
sphere.transform.position = Vector3.up;
}
}
}
6.2 知识点代码
Main
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Main : MonoBehaviour
{
void Start()
{
AssetBundleManager.Instance.LoadAssetBundleResourceAsync<GameObject>("loading_ui", "LoadingPanel", (panelObj) =>
{
//只需要去设置加载界面相关的内容
GameObject canvasObj = GameObject.Find("Canvas");
panelObj.transform.SetParent(canvasObj.transform, false);
//在进行AB包热更新之前 可以先把AB包管理器中记录的相关AB包清理 这样再之后使用时才不会出问题 不然主包已经有记录
AssetBundleManager.Instance.ClearAssetBundle();
//获取面板脚本 执行AB包相关的更新
LoadingPanel panel = panelObj.GetComponent<LoadingPanel>();
panel.BeginUpdate();
});
}
}
LoadingPanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;
public class LoadingPanel : MonoBehaviour
{
//进度条
public Image imgPro;
//当前加载信息说明
public Text infoTxt;
void Start()
{
imgPro.rectTransform.sizeDelta = new Vector2(0, 50);
infoTxt.text = "资源加载中";
}
//第一:需要去更新资源服务器上的AB包
public void BeginUpdate()
{
//第一个委托 是用于 AB包下载更新结束后 处理逻辑的
//第二个委托 是用于 更新当前加载信息的
AssetBundleUpdateManager.Instance.CheckUpdate(ABUpdateOverDoSomthing, (info) => { infoTxt.text = info; },
(nowNum, maxNum) => { imgPro.rectTransform.sizeDelta = new Vector2(nowNum / maxNum * 1600, 50); });
}
//第二:AB包更新完毕后 需要去处理ILRuntime初始化相关的逻辑
public void ABUpdateOverDoSomthing(bool isOver)
{
if (!isOver)
{
infoTxt.text = "AB包下载更新出错,请检查网络连接或联系服务商";
return;
}
infoTxt.text = "资源加载结束";
//ILRuntime的初始化相关
ILRuntimeManager.Instance.StartILRuntime(() =>
{
//ILRuntime相关内容加载结束 就可以执行游戏逻辑了
infoTxt.text = "游戏初始化完毕";
//热更相关逻辑执行
ILRuntimeManager.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "StartILRuntime", null, null);
//热更相关逻辑执行
}, (info) => { infoTxt.text = info; });
}
}
ILRuntimeMain
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace HotFix_Project
{
class ILRuntimeMain
{
/// <summary>
/// 热更逻辑主入口
/// </summary>
public static void StartILRuntime()
{
//把逻辑丢给热更这边处理
Debug.Log("热更逻辑执行");
//删除加载界面(只是测试 所以比较粗暴)
GameObject.Destroy(GameObject.Find("Canvas"));
//在场景上动态创建一个立方体
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
GameObject sphere = AssetBundleManager.Instance.LoadAssetBundleResource<GameObject>("gameobject", "Sphere");
sphere.transform.position = Vector3.up;
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com