在 ILRuntime 的基础上,搭建一个简单的UI系统(一)UIPanel

前言

在前面三篇文章中,我们简单的搭建好了ILRuntime的使用环境,然而还并没有实现具体的功能。所以在这篇文章中我们首先简单的实现下UI模块相关的功能。(暂时不考虑AB包系统,对象池系统等等,同时本篇先是简单的实现UI显示以及跳转,更多的功能在后续进行补充)

GitHub地址:https://github.com/luckyWjr/ILRuntimeDemo 方便代码查看(由于代码量比较多,下面只会贴出部分代码,感兴趣的同学还是直接看工程吧~有什么更好的意见欢迎提出指正)

 

思路

在实现代码前,我们首先要清楚我们的需求,UI系统的功能大致有加载UI,显示UI,跳转UI,UI层级管理等等。

通常我们会把一个完整的界面当成一个整体(一个prefab),比如登陆页面,主页面,商城页面等等,它们可以都继承于一个基类(暂定为UIPanel),主要功能就是显示隐藏界面,获取界面内的组件等等。

在一些界面中往往有些组件需要我们单独管理的,比如用户信息栏,商城物品的Item等,它们也可以都继承于一个基类(暂定为UIView,同时UIPanel继承于UIView),主要功能就是加载prefab,数据的显示等。

然后我们建立两个管理器,UIPanelManager和UIViewManager分别进行管理。UIPanelManager主要管理界面的显示隐藏和跳转,UIViewManager主要维护UIView的生命周期。

由于我们生成一个UIPanel的子类就需要加载对应的Prefab,比如要显示登陆界面,我们要实例化LoginPanel,同时加载LoginPanel.prefab,那么我们如何在实例化UIPanel的时候就得知其对应的Prefab是哪个呢,我们可以使用Attribute功能来实现,在每个UIPanel中进行配置对应的prefab的名称,具体代码看下文。

简单效果如图

 

代码实现

由于UI系统的逻辑后期变动会比较大,也容易出BUG,更新也会很频繁,所以我们将这部分的相关代码全部放在Hotfix部分,以便后续维护更新。目录结构大致如下

首先创建一个IView接口,用于生命周期

namespace Hotfix.UI
{
    public interface IView

    {
        //初始化,只在prefab被创建的时候执行一次
        void Init();
        //每次界面显示的时候执行
        void Show();
        void Update();
        void LateUpdate();
        void FixedUpdate();
        //界面被隐藏的时候执行,再次显示会调用Show方法
        void Hide();
        //销毁的时候执行
        void Destroy();
    }
}

然后创建UIView类实现IView接口,主要功能是加载和销毁gameobject,并在Show和Hide方法中进行显示和隐藏。

namespace Hotfix.UI
{
    public class UIView : IView
    {
        //需要加载的prefab的路径,也作为唯一标识符
        public string url { private set; get; }

        public GameObject gameObject { private set; get; }
        public Transform transform { private set; get; }
        public RectTransform rectTransform { private set; get; }

        //是否加载完成
        public bool isLoaded { get { return gameObject != null; } }

        //是否显示
        public bool isVisible
        {
            get
            {
                return isLoaded && gameObject.activeSelf;
            }
            set
            {
                if (isLoaded)
                    gameObject.SetActive(value);
            }
        }

        //若为true,将在下一帧销毁gameobject
        internal bool isWillDestroy;

        public UIView(string url)
        {
            this.url = url;
        }

        public virtual void Init()
        {
            isVisible = false;
        }

        public virtual void Show()
        {
            isVisible = true;
        }

        ......

        public virtual void Hide()
        {
            isVisible = false;
        }

        public virtual void Destroy()
        {
            isWillDestroy = true;
            if (isVisible)
            {
                Hide();
            }
        }

        //销毁gameobject
        public void DestroyImmediately()
        {
            if (!isWillDestroy)
            {
                Destroy();
            }
            GameObject.Destroy(gameObject);
            gameObject = null;
            transform = null;
            rect
本课程主要是针对ILRuntime设计一个独立的脚本热更新框,框架的优势:1.将代码热更脱离Assetbundle资源热更,独立的部分更适用于各种不同的框架。2.加快项目的逻辑更新,bug修复.(后期修bug,多数情况下并不用动到资源,只需要更新脚本代码,无需重走资源打包发布流程,大大提升效率)3.提供热更模式和正常开发模式的快速切换接口,可以让队友像平常样去开发.4.不依赖市面上的任何AB框架,完全兼容市面上各种不同的AB框架.5.重点:希望通过它,帮助你学习、了解ILRuntime真正在项目中的应用.框架的将提供以下这些接口,这些接口将从0开始,在Unity里将C#脚本编译成dll,然后将dll放到服务器上,再将dll下载下来,进行加载,到最后从Unity主工程调用热更新的代码逻辑.1.Create hotfixdll接口将热更部分的代码 编译成dll生成dll版本配置(MD5)2.更新对比接口本地跟服务器的dll进行版本对比3.下载热更dll下载dll本身的文件下载版本记录文件4.加载热更dll加载dll实例化:AppDomain初始化:注册跨域继承适配器注册委托适配器LitJson重定向调用性能优化(CLR绑定功能)调用热更接口Hotfix.HotfixApplication.Main 进入热更逻辑5.ILMonoBehaviour用于监听组件的生命周期,实际是桥接(调用)热更的逻辑AwakeStartEnableUpdateLateUpdate.......6.添加其他常用的库DOTweenLitJsonSpineGoogle.ProtobufTextAnimation可以根据上面的方式,自行添加依赖的库... 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值