Unity自定义ButtonGroup类
本文只作为参考,个人水平有限,望见谅!
最近接触HTC Vive的项目中,使用的UI交互要不就是World下的UGUI,要不就是使用立体的Sprite来实现。而最经常出现的就是多个选择按钮,高亮选择,点击执行操作。所以在这里总结出两种情况下的ButtonGroup类,提供给有需要的人。PC是可以使用的,在Vive中需要导入Vive Input Utility这个插件,由于时间关系我还没试过。
ButtonGroup.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine.EventSystems;public delegate void ButtonEventArg(BaseEventData data);[System.Serializable]
public abstract class ButtonGroup
{public bool canRepeatClick;public List<ButtonEventArg> OnMouseEnter;public List<ButtonEventArg> OnMouseExit;public List<ButtonEventArg> OnMouseClick;private int currentClickIndex;private int currentEnterIndex;public void Init(int heilightIndex){OnMouseEnter = new List<ButtonEventArg>();OnMouseExit = new List<ButtonEventArg>();OnMouseClick = new List<ButtonEventArg>();currentClickIndex = heilightIndex;SetButtonSprite(currentClickIndex, true);}public void OnEnter(BaseEventData data){int index = GetIndexFromData(data);if (index == -1) return;if (currentClickIndex!=index)SetButtonSprite(currentClickIndex, false);SetButtonSprite(index, true);if (index < OnMouseEnter.Count && OnMouseEnter[index] != null)OnMouseEnter[index](data);currentEnterIndex = index;}public void OnExit(BaseEventData data){int index = currentEnterIndex;if (index == -1) return;SetButtonSprite(index, false);if (index<OnMouseExit.Count&&OnMouseExit[index] != null)OnMouseExit[index](data);currentEnterIndex = -1;}public void OnClick(BaseEventData data){int index = GetIndexFromData(data);if (index == -1) return;SetButtonSprite(index, true);if (index!=currentClickIndex)SetButtonSprite(currentClickIndex, false);if (index < OnMouseClick.Count && OnMouseClick[index] != null){if(canRepeatClick||(!canRepeatClick&&index!=currentClickIndex))OnMouseClick[index](data);}currentClickIndex = index; }protected abstract int GetIndexFromData(BaseEventData data);protected abstract void SetButtonSprite(int index, bool heilight);
}[System.Serializable]
public class UGUIButton
{public Image image;public Sprite normal;public Sprite heilight;
}[System.Serializable]
public class SpriteButton
{public SpriteRenderer image;public Sprite normal;public Sprite heilight;
}[System.Serializable]
public class UGUIButtonGroup:ButtonGroup
{public List<UGUIButton> buttonList;protected override int GetIndexFromData(BaseEventData data){PointerEventData pData = (PointerEventData)data;GameObject go = pData.pointerCurrentRaycast.gameObject;if (!go) return -1;Button bt = go.GetComponent<Button>();if (!bt) return -1;for(int i=0;i<buttonList.Count;i++){if (buttonList[i].image.Equals(bt.image))return i;}return -1;}protected override void SetButtonSprite(int index, bool heilight){if (index != -1 && index < buttonList.Count && buttonList[index] != null)buttonList[index].image.sprite = heilight ?buttonList[index].heilight :buttonList[index].normal;}
}[System.Serializable]
public class SpriteButtonGroup : ButtonGroup
{public List<SpriteButton> buttonList;protected override int GetIndexFromData(BaseEventData data){PointerEventData pData = (PointerEventData)data;GameObject go = pData.pointerCurrentRaycast.gameObject;if (!go) return -1;SpriteRenderer sp = go.GetComponent<SpriteRenderer>();if (!sp) return -1;for (int i = 0; i < buttonList.Count; i++){if (buttonList[i].image.Equals(sp))return i;}return -1;}protected override void SetButtonSprite(int index, bool heilight){if (index != -1 && index < buttonList.Count && buttonList[index] != null)buttonList[index].image.sprite = heilight ?buttonList[index].heilight : buttonList[index].normal;}
}
test.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;public class test : MonoBehaviour {public UGUIButtonGroup btGroup;void Start () {// 参数为按钮序号,-1表示不需要初始高亮按钮btGroup.Init(0); // 添加按钮事件btGroup.OnMouseClick.Add(ClickBt1);// 如果中间有一个按钮不需要事件则// btGroup.OnMouseClick.Add((BaseEventData data) => { });btGroup.OnMouseClick.Add(ClickBt2);btGroup.OnMouseClick.Add(ClickBt3);}public void Click(BaseEventData data){btGroup.OnClick(data);}void ClickBt1(BaseEventData data){Debug.Log("Button 1 Clicked!");}void ClickBt2(BaseEventData data){Debug.Log("Button 2 Clicked!");}void ClickBt3(BaseEventData data){Debug.Log("Button 3 Clicked!");}//以下为鼠标进入Button就高亮的代码//public void Enter(BaseEventData data)//{// btGroup.OnEnter(data);//}//public void Exit(BaseEventData data)//{// btGroup.OnExit(data);//}}
使用方法
1.UGUIButtonGroup
将所有Button引用和[正常态、高亮态图片]的引用拖入带有test脚本的物体中,将每个Button的Translation改为none并添加【EventTrigger】组件。最后根据需要为每个Button添加[PointClick]和[PointEnter+PointExit]事件,事件方法指定到test的物体上的[Click]和[Enter+Exit]就可以了。
2.SpriteButtonGroup
同上,只是还需要为每个Sprite添加【Box Collider】组件以及为摄像机添加 【Physics Racaster】组件即可。
Unity自定义ButtonGroup类相关推荐
- Unity自定义UI组件(十一) 雷达图、属性图
前言 借用梦想世界宠物属性图 想必大家都在游戏中见过属性图用于展示多种属性的数值,可以较为直观的对比某种属性的缺陷或者是哪种属性有优势.在三维可视化领域也会遇到类似的属性对比,用属性图来展示最为合适. ...
- Unity 自定义编辑器窗口的使用
Unity 自定义编辑器窗口功能强大,可以实现所有希望实现的功能.我在近期的项目中仿照魔兽争霸3开发了一套简单的游戏单位功能组件,其中包括单位数据.移动方式.动画播放.武器系统等等.如果用传统的Ins ...
- Unity自定义UI组件(六)日历、日期拾取器
前言 考虑到工业项目中可能会利用到类似日历的工具,就比如选取某个时间节点,所以我结合UGUI源码开发了日历工具和日期拾取器工具,简单易用,接口齐全,可中文显示,外观可自定义.只需要导入脚本,即可在Hi ...
- unity 自定义时间轴_如何创建自定义时间轴标记
unity 自定义时间轴 Starting with Unity 2019.1, Timeline supports markers! In this blog post, I will show y ...
- 什么是php model类,thinkphp的自定义model类有什么作用?
请问,thinkphp的自定义model类有什么作用?如: <?php //自定义Modle类 namespace Home\Model; use Think\Model; class StuM ...
- 掌握 ASP.NET 之路:自定义实体类简介
发布日期 : 5/24/2005| 更新日期 : 5/24/2005 Karl Seguin Microsoft Corporation 摘要:有些情况下,非类型化的 DataSet 可能并非数据操作 ...
- 自定义模板类(循环队列)
自定义模板类--循环链表 正做的这个链表的时候,遇到了,对于友元函数的处理问题 实现代码如下(配有测试main): #include <iostream> using namespace ...
- 13.6 Thread类自定义线程类
package cn.chen.thread; /** * 线程:* 多线程:* 一个java程序只是有两个线程:* 一个是主线程负责main方法代码执行,一个是垃圾回收器线程,负责* 创建线程的方式 ...
- Qt中的自定义模型类
文章目录 1 Qt中的通用模型类 1.1 Qt中的通用模型类 1.2 Qt中的变体类型QVariant 2 自定义模型类 2.1 自定义模型类设计分析 2.2 自定义模型类数据层.数据表示层.数据组织 ...
最新文章
- 黑龙江科技大学计算机类分数线,2019年黑龙江科技大学优势专业排名及分数线...
- python queue get 方法_Python Queue模块详解
- Java引用类型有哪些
- Cloud for Customer系统里的附件url,可以通过partner编程自己生成么
- 求1到100中9的个数
- PHP中Cookie的使用
- 大数据之-Hadoop3.x_MapReduce_Job提交流程---大数据之hadoop3.x工作笔记0103
- 系统学习机器学习之SVM(一)
- linux gcc换成c99标准,关于GCC和C99中可变参数宏
- 计算机录屏幕和声音的软件是什么,哪个录屏软件可以录内部声音?分享开启与调节的方法...
- Android手机使用笔记本流量上网(基于Android便携式WLAN热点)
- 2019-新年新计划
- android9原生体验,原生安卓必备软件 优化类原生ROM体验
- 获取字符串中最大的数字
- 一封来信,诉说了开源社区里的天涯若比邻
- 破解有道翻译js加密,纯小白练手
- java openCV调用摄像头并以窗体显示出来
- 大数据练习题答案(仅供参考)
- 如何高效的寻找Github项目
- 页面可视化搭建工具前生今世 1
热门文章
- 【李叫兽】为什么你有10年经验,但成不了专家?
- 如何帮助14岁孩子度过青春期
- 微信小程序学习笔记( 自定义组件 )
- U盘引导安装Solaris11_x86_64
- wifi突然没了!变成电脑感叹号,怎么办?
- 图像处理——HSV图像应用(matlab)
- [转载] 你真的知道什么是 Python“命名空间” 吗?
- 爱护乳腺,AI不宜迟 英特尔携手时尚健康粉红丝带运动,用AI技术呵护女性乳腺健康...
- ReiserFS与EXT3的比较
- android linker加载