本文只作为参考,个人水平有限,望见谅!
最近接触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类相关推荐

  1. Unity自定义UI组件(十一) 雷达图、属性图

    前言 借用梦想世界宠物属性图 想必大家都在游戏中见过属性图用于展示多种属性的数值,可以较为直观的对比某种属性的缺陷或者是哪种属性有优势.在三维可视化领域也会遇到类似的属性对比,用属性图来展示最为合适. ...

  2. Unity 自定义编辑器窗口的使用

    Unity 自定义编辑器窗口功能强大,可以实现所有希望实现的功能.我在近期的项目中仿照魔兽争霸3开发了一套简单的游戏单位功能组件,其中包括单位数据.移动方式.动画播放.武器系统等等.如果用传统的Ins ...

  3. Unity自定义UI组件(六)日历、日期拾取器

    前言 考虑到工业项目中可能会利用到类似日历的工具,就比如选取某个时间节点,所以我结合UGUI源码开发了日历工具和日期拾取器工具,简单易用,接口齐全,可中文显示,外观可自定义.只需要导入脚本,即可在Hi ...

  4. unity 自定义时间轴_如何创建自定义时间轴标记

    unity 自定义时间轴 Starting with Unity 2019.1, Timeline supports markers! In this blog post, I will show y ...

  5. 什么是php model类,thinkphp的自定义model类有什么作用?

    请问,thinkphp的自定义model类有什么作用?如: <?php //自定义Modle类 namespace Home\Model; use Think\Model; class StuM ...

  6. 掌握 ASP.NET 之路:自定义实体类简介

    发布日期 : 5/24/2005| 更新日期 : 5/24/2005 Karl Seguin Microsoft Corporation 摘要:有些情况下,非类型化的 DataSet 可能并非数据操作 ...

  7. 自定义模板类(循环队列)

    自定义模板类--循环链表 正做的这个链表的时候,遇到了,对于友元函数的处理问题 实现代码如下(配有测试main): #include <iostream> using namespace ...

  8. 13.6 Thread类自定义线程类

    package cn.chen.thread; /** * 线程:* 多线程:* 一个java程序只是有两个线程:* 一个是主线程负责main方法代码执行,一个是垃圾回收器线程,负责* 创建线程的方式 ...

  9. Qt中的自定义模型类

    文章目录 1 Qt中的通用模型类 1.1 Qt中的通用模型类 1.2 Qt中的变体类型QVariant 2 自定义模型类 2.1 自定义模型类设计分析 2.2 自定义模型类数据层.数据表示层.数据组织 ...

最新文章

  1. 黑龙江科技大学计算机类分数线,2019年黑龙江科技大学优势专业排名及分数线...
  2. python queue get 方法_Python Queue模块详解
  3. Java引用类型有哪些
  4. Cloud for Customer系统里的附件url,可以通过partner编程自己生成么
  5. 求1到100中9的个数
  6. PHP中Cookie的使用
  7. 大数据之-Hadoop3.x_MapReduce_Job提交流程---大数据之hadoop3.x工作笔记0103
  8. 系统学习机器学习之SVM(一)
  9. linux gcc换成c99标准,关于GCC和C99中可变参数宏
  10. 计算机录屏幕和声音的软件是什么,哪个录屏软件可以录内部声音?分享开启与调节的方法...
  11. Android手机使用笔记本流量上网(基于Android便携式WLAN热点)
  12. 2019-新年新计划
  13. android9原生体验,原生安卓必备软件 优化类原生ROM体验
  14. 获取字符串中最大的数字
  15. 一封来信,诉说了开源社区里的天涯若比邻
  16. 破解有道翻译js加密,纯小白练手
  17. java openCV调用摄像头并以窗体显示出来
  18. 大数据练习题答案(仅供参考)
  19. 如何高效的寻找Github项目
  20. 页面可视化搭建工具前生今世 1

热门文章

  1. 【李叫兽】为什么你有10年经验,但成不了专家?
  2. 如何帮助14岁孩子度过青春期
  3. 微信小程序学习笔记( 自定义组件 )
  4. U盘引导安装Solaris11_x86_64
  5. wifi突然没了!变成电脑感叹号,怎么办?
  6. 图像处理——HSV图像应用(matlab)
  7. [转载] 你真的知道什么是 Python“命名空间” 吗?
  8. 爱护乳腺,AI不宜迟 英特尔携手时尚健康粉红丝带运动,用AI技术呵护女性乳腺健康...
  9. ReiserFS与EXT3的比较
  10. android linker加载