【游戏面包屑】简单的导航栏设计

前言

为了便于UI的开发,设计了一个简单的导航栏结构。目前版本的导航栏抽象类简化了导航栏选项的事件监听、移除。后续根据需求再丰富功能、结构。

本次实例用于设计角色·技能UI窗口的左侧导航栏以及右下角的按钮集。让事件能统一管理,减少过多的事件方法并简化的代码编写。


实现效果:

   角色·技能界面


代码

UI的通用接口(IButtonProcessor可能用于RadioButton等各类的设计,所有抽出为接口)

using UnityEngine.UI;

/// <summary>
/// 游戏UI
/// 说明:
///     1.包含UI方面的各个接口
/// </summary>
namespace GameUI
{
    /// <summary>
    /// 按钮处理器
    /// </summary>
    public interface IButtonProcessor
    {
        void OnClickEvent(string key,Button button);
    }
}

抽象类TCBarClass

using GameUI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

/// <summary>
/// 导航栏工具类-基类
/// </summary>
public abstract class TCBarClass : IButtonProcessor
{
    //保存匿名委托的引用
    private Dictionary<string, UnityAction> dicBarButtonsAction = new Dictionary<string, UnityAction>();
    //导航按钮集
    public Dictionary<string, Button> dicBarButtons = new Dictionary<string, Button>();
    /// <summary>
    /// 移除本类相关的事件
    /// 说明:
    ///     1.dicBarButtons按钮集事件
    /// </summary>
    public virtual void ClearEvent()
    {
        //为按钮选项dicBarButton移除事件
        foreach (KeyValuePair<string, Button> item in dicBarButtons)
        {
            //添加委托事件
            //item.Value.onClick.RemoveAllListeners();              //可以通过RemoveAllListeners直接进行事件删除(该操作会删除绑定上的所有事件)
            
            //获取匿名委托索引并通过其来删除(反注册)事件
            item.Value.onClick.RemoveListener(dicBarButtonsAction[item.Key]);
            dicBarButtonsAction.Remove(item.Key);
        }
    }//ClearEvent_end

    /// <summary>
    /// 将目标游戏对象的子对象(含有Button组件)加入导航按钮集
    /// 流程:将所有需要添加事件的按钮加入dicBarButtons
    /// 注:dicBarButtons的key与OnClickEvent(string key, Button button)的key一致即可。若是采用默认的key匹配规则:通过名字来匹配,会比较容易、方便。
    /// 说明:根据按钮对象的结构进行编写,如不采用默认的barItem预设体结构,请重写override该方法
    /// barItem预设体结构为barItem-bg(Image)、btnClick(Button)
    /// </summary>
    /// <param name="barContent">目标游戏对象</param>
    public virtual void InitDicBarButtonsByGameObj(GameObject barContent)
    {
        foreach (Transform item in barContent.transform)
        {
            foreach (Transform item2 in item)
            {
                Button tryButton;
                bool hasButton;
                //尝试获取Button
                hasButton = item2.TryGetComponent<Button>(out tryButton);
                if (hasButton)
                {
                    //如果有Button组件,则给dicBarButtons加入数据
                    //传入为barItem的name与其btnClick的按钮
                    dicBarButtons.Add(item.name, tryButton);
                }
            }
        }//遍历barContent子对象
    }//InitDicBarButtonsByGameObj_end

    /// <summary>
    /// 初始化BarButton的事件.
    /// 说明:为dicBarButtons的按钮添加OnClickEvent()事件.
    ///     前提:dicBarButtons的初始化完成.
    ///             1.使用InitDicBarButtonsByGameObj(GameObject barContent)进行dicBarButtons的自动化初始化.
    ///             2.手动进行dicBarButtons添加.
    /// 注:调用本
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值