前言
为了便于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添加.
/// 注:调用本