前言
在前面三篇文章中,我们简单的搭建好了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

最低0.47元/天 解锁文章
1573

被折叠的 条评论
为什么被折叠?



