前言

实战系列是用于记录ET的使用(踩坑)经验。

热更新

首先,ET的8.1版本(以下称ET)没有自带资源更新的代码,需要自己参考ET和YooAsset的方式实现。
那么第一步就是先创建一个自定义下载组件DownloadComponent,在Init中执行CodeLoader(代码热更)之前添加它。

运行Unity,定位到目录Assets/Scripts/Loader/Resource,创建DownloadComponent.cs

public class DownloadComponent: Singleton<DownloadComponent>, ISingletonAwake
{
    //添加Awake方法,检查是否需要下载

    //添加CheckDownloadStatus方法,检查是否下载完毕
}

打开YooAsset资源更新篇,拷贝官方推荐代码,填入即可。
然后打开场景的Global,找到Init,双击进去,在热更代码前添加DownloadComponent,修改后如下:

private async ETTask StartAsync()
{
    //xxxxxx

    DownloadComponent downloadComponent = World.Instance.AddSingleton<DownloadComponent>();
    await downloadComponent.CheckDownloadStatus();

    CodeLoader codeLoader = World.Instance.AddSingleton<CodeLoader>();

    //xxxxxx
}

打开ResourcesComponent调整CDN地址,选择菜单YooAsset/AssetBundle Collector配置要打包的目录。如此,热更新就配置完成了。

UI框架

一套成熟的UI框架可以为如今市面上大部分主UI玩法的游戏省去大量的开发时间,如果用ET自带的UI框架未免过于简陋。
在这里本人推荐使用YIUI作为UI框架,当然了如果不适应别人的写法想要自己写一套也可以。

接下来我会参考本人编写的BFEX框架提供一个自己实现的思路。
首先在AUIEvent中添加OnShow(params object[] args)用于每次打开UI时的刷新,然后在对应的UIEvent中添加OnShow。这样在显示浮动提示时只需要OpenUI即可,就不需要每次关闭重新进入Awake
然后改造UIComponentCreate,改为OpenUI或者任何你顺眼的名字,方法调整为如下内容,按需调整:

public static async ETTask<UI> OpenUI(this UIComponent self, string uiType, UILayer uiLayer, params object[] args)
{
    if (!self.UIs.TryGetValue(uiType, out var ui))
    {
        ui = await self.UIGlobalComponent.OnCreate(self, uiType, uiLayer);
        self.UIs.Add(uiType, ui);
    }
    await self.UIGlobalComponent.OnShow(self, uiType, uiLayer, args);
    return ui;
}

之后在配套的Remove改为CloseUI,也可以自己添加配套的HideUIShowUI。如此,一个简单的自己实现的UI框架就大功告成了。

最后添加生成代码的脚本省去复制粘贴修改的成本,可参考UI代码生成写属于自己的代码生成脚本。
目前个人在ET实现的UI框架是在公司项目中使用,不便过多展示,大概就是生成并自动绑定一个Mono脚本到UI根节点,ET获取对应的UIBind组件,就可以访问到全部的UI组件了,UI的生命周期添加了OnShowOnBeforeDestroy用于展示和通用关闭,添加了UI反切和模块的概念,只会同时打开一个UI,打开其它模块的UI就会关闭全部当前模块的UI,添加了Node(Panel)作为二级页面,添加了Unit作为子游戏对象。

最后修改:2024 年 05 月 29 日
如果觉得我的文章对你有用,请随意赞赏