06 UI管理器4

工具类

上一节的末尾,我们需要创建很多UI来测试,因为需要很多Button事件,所以我们写了很多函数,然后…然后一个一个拖到了Button上…很明显的能够感到,这个过程是真的很痛苦…这才五六个Button而已,而实际上我们可能需要几十个几百个Button事件,如果我们都采用这样直接拖放的方式…那是真的痛苦…

在UI下新建一个静态工具类,就叫UIUtility吧~

/// <summary>
/// UI工具类
/// </summary>
public static class UIUtility
{
    /// <summary>
    /// 根据路径获取某个child的某个组件 
    /// </summary>
    private static T Find<T>(Transform trans, string path)
    {
        var child = trans.Find(path);
        return child.GetComponent<T>();
    }


    /// <summary>
    /// 根据路径给按钮添加一个OnClick方法
    /// </summary>
    public static void RegisterButton(this Transform trans, string path, UnityAction action)
    {
        var btn = Find<Button>(trans, path);
        btn.onClick.AddListener(action);
    }

    /// <summary>
    /// 根据路径获取一个Text组件
    /// </summary>
    public static Text FindText(this Transform trans, string path)
    {
        return Find<Text>(trans, path);
    }
}

可以根据需要自己添加其他方法,比如查找一个Image组件或者另外啥东西

顺带一提,其实这些方法可以写在UIBase里,那样的话用起来会更加方便,但是我还是觉得这部分只是作为工具方法,哪怕没有这部分方法我们的UI也是能够运行的,作为扩充,我就没有放到UIBase里,而是直接写了一个工具类,大家可以根据自己的想法自行处理~

然后我们新建两个UI

1

注意,这两个UI不要相互遮挡,其次必须是Pop类型,等下就明白为啥了~

然后在Config中注册,并Genertated

然后编写咱们的UI脚本,此时就可以用上咱们写的工具方法了~

public class Update1 : UIBase
{
    private UIManager manager;

    private Text text;
    
    public override void Load()
    {
        /// 一定要把UI类型设置为PopUp
        UIType = UIType.PopUp;

        manager = SGFEntry.Instance.GetManager<UIManager>();

        text = transform.FindText("Image/Text");
        
        transform.RegisterButton("Image/Button",(() =>
        {
            manager.Open(UIs.Update2);
        }));
    }

    public override void UnLoad()
    {
        
    }
}
public class Update2 : UIBase
{
    private UIManager manager;

    private Text text;
    
    public override void Load()
    {
        UIType = UIType.PopUp;

        manager = SGFEntry.Instance.GetManager<UIManager>();

        text = transform.FindText("Image/Text");
        
        /// 这里是关闭
        transform.RegisterButton("Image/Button",(() =>
        {
            manager.CloseCurrent();
        }));
    }

    public override void UnLoad()
    {
        
    }
}

然后在Test脚本中,默认打开Update1

public class test : MonoBehaviour
{
    private UIManager uiManager;
    void Start()
    {
        uiManager = SGFEntry.Instance.GetManager<UIManager>();
        uiManager.Open(UIs.Update1);
    }
}

运行一下,发现Button是有效的,现在可不用一个一个拖放点击事件了,方便了非常,非常,非常多!!!

OnUpdate更新

写到这,其实还有一个生命周期我们是没有使用的,那就是OnUpdate!

现在我们给两个UI补上这个

public class Update1 : UIBase
{
    public override void OnUpdate(float deltaTime)
    {
        text.text = deltaTime.ToString();
    }
}

public class Update2 : UIBase
{
    public override void OnUpdate(float deltaTime)
    {
        text.text = deltaTime.ToString();
    }
}

还需要在UIManager中添加这个功能

public class UIManager : ManagerBase
{
    #region 管理器生命周期

    public override void Update(float time)
    {
        currentUI.OnUpdate(time);
    }
    
    #endregion
}

可以注意到,我们只会在每一帧更新当前UI,其他UI是不会被更新的

再次运行脚本,你会发现此时,只有Update2会更新

1

更多功能

目前为止,大体上的UI管理算是完成了,但是仍然有很多地方需要扩展,比如典型的,你会发现现在打开UI的时候我们是没法传递参数的

比较简单的做法是在Show()方法里加一个Object类型的参数,这样就可以传递任意数据,本来是打算写这一部分逻辑的,但我想了想,其实没有必要,数据的传递和UI本身已经有点脱离了,我不想把数据发送也写在UI模块里,我们应该有通用的事件管理模块

另外,现在的UI管理器和UI界面本身,不带有任何消息,比如我们Open()一个UI,但实际上我们不知道具体什么时候在加载UI,什么时候在显示UI,因为现在没有任何事件或者说回调写在我们的管理器中,这一部分也是需要考虑的

好了!暂时放下UI这部分,让我们开启一个新的模块,事件管理器~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值