当前位置: 首页 > news >正文

Unity3d中Tab控件的实现

1.按如下结构建立一个Tabs

2.Tabs上添加Toggle Group组件

3.Tab上添加Toggle、ToggleHighlightStaysActiveAfterLosingFocus

4.Page上添加Canvas Group

5.在Menu上添加TabMenu,系统会自动识别,无需手动赋值(识别错误的话见下文)。这样就完成了Tab控件的制作

6.如果Page下有Toggle,TabMenu会识别错误,需要手动赋值。

解决方法:注释TabMenu.cs以下代码,再手动赋值

7.设定初始选中项,将对应的Tab下的Toggle的isOn勾上,其余Tab的取消勾选就可以了。

附:

TabMenu.cs代码

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;namespace ChristinaCreatesGames.UI
{public class TabMenu : MonoBehaviour{[Header("Current Index")][SerializeField] private int pageIndex = 0;[Header("Components")][SerializeField] private ToggleGroup toggleGroup;[SerializeField] private List<Toggle> tabs = new List<Toggle>();[SerializeField] private List<CanvasGroup> pages = new List<CanvasGroup>();[Header("Event to call")]public UnityEvent<int> OnPageIndexChanged;private void Initialize(){toggleGroup = GetComponentInChildren<ToggleGroup>();tabs.Clear();pages.Clear();tabs.AddRange(GetComponentsInChildren<Toggle>());pages.AddRange(GetComponentsInChildren<CanvasGroup>());}private void Reset(){Initialize();}private void OnValidate(){Initialize();OpenPage(pageIndex);tabs[pageIndex].SetIsOnWithoutNotify(true);}private void Awake(){foreach (var toggle in tabs){toggle.onValueChanged.AddListener(CheckForTab);toggle.group = toggleGroup;}}private void OnDestroy(){foreach (var toggle in tabs){toggle.onValueChanged.RemoveListener(CheckForTab);}}private void CheckForTab(bool value){for (int i = 0; i < tabs.Count; i++){if (!tabs[i].isOn) continue;pageIndex = i;}OpenPage(pageIndex);}private void OpenPage(int index){EnsureIndexIsInRange(index);for (int i = 0; i < pages.Count; i++){bool isActivePage = (i == pageIndex);pages[i].alpha = isActivePage ? 1.0f : 0.0f;pages[i].interactable = isActivePage;pages[i].blocksRaycasts = isActivePage;}if (Application.isPlaying)OnPageIndexChanged?.Invoke(pageIndex);}private void EnsureIndexIsInRange(int index){if (tabs.Count == 0 || pages.Count == 0){Debug.Log("Forgot to setup Tabs or Pages");return;}pageIndex = Mathf.Clamp(index, 0, pages.Count - 1);}public void JumpToPage(int page){EnsureIndexIsInRange(page);tabs[pageIndex].isOn = true;}}
}

ToggleHighlightStaysActiveAfterLosingFocus.cs代码

using UnityEngine;
using UnityEngine.UI;namespace ChristinaCreatesGames.UI
{public class ToggleHighlightStaysActiveAfterLosingFocus : MonoBehaviour{[SerializeField] private Toggle toggle;[SerializeField] private Image  imageToKeepFocusActive;private void Reset(){toggle = GetComponent<Toggle>();}private void Awake(){toggle.onValueChanged.AddListener(OnToggleValueChanged);OnToggleValueChanged(toggle.isOn);}private void OnDestroy(){toggle.onValueChanged.RemoveListener(OnToggleValueChanged);}private void OnToggleValueChanged(bool isOn){if (imageToKeepFocusActive == null) return;imageToKeepFocusActive.color = toggle.isOn ? toggle.colors.highlightedColor : Color.clear;}}
}

参考视频

http://www.dtcms.com/a/481800.html

相关文章:

  • 桥梁主动防撞预警系统方案
  • 【node】运行windows7下的高版本node.js
  • 解密NLP:从入门到精通
  • 如何说课网站建设当地公交建设公司的官网
  • 哪里有网站开发服务器西安关键词排名提升
  • npx 与 npm 区别
  • diffusion model(0.5) score-SDE 关于score function与noise的关系
  • leetcode724 寻找数组的中心下标
  • AI用户洞察新纪元:atypica.AI如何重塑商业决策逻辑
  • 彻底解决 Zip4j 解压中文文件名乱码问题(含混合编码与 Mac 特殊情况)
  • 河北农业网站建设公司凡科互动官网登录
  • 企业网站建设的成本构成吉林市网站建设招标
  • git push 报错 push rejected (一文读懂并解决)
  • 从缓存到分库分表:MySQL 高并发海量数据解决方案全解析
  • 苍穹外卖-缓存套餐 Spring Cache day07
  • 垂直电商网站建设方案wordpress主题开发时间
  • 报告工具更新!Word附注一键期末转期初
  • 优化A7M4相机直播图像传输:避免质量损失,实现端到端高保真
  • 平替MongoDB金仓多模数据库在电子证照国产化中的实践与优势
  • AWS WAF 深度体验:全新控制台,开启云原生WAF与CloudFront无缝联防新纪元
  • 【统计字母出现最多次数不分大小写按字典顺序输出】2022-11-9
  • 怎么查自己的网站备案编号本人已履行网站备案信息
  • 电子商务网站建设结论谷歌查询关键词的工具叫什么
  • Ubuntu 安装 SSH,并开启 root 远程登录
  • python学习之路(一)
  • 电源唐大师
  • QT-常用控件(四)-输入类
  • newstar2025 web week1week2题解(少一道)
  • 【C++】vector常用接口的使用
  • ES6 面试题及详细答案 80题 (62-80)-- 类与继承