button组件 untiy_Unity自定义Button组件Transition
Unity自带的Button组件有三种不同的Transition(过渡)选项,分别是None, ColorTint, SpriteSwap, Animation。现在想自定义其他功能,比如在不同的状态下,按钮上的文字不同。
首先想到的是直接写一个脚本挂在Button上,实现UnityEngine.EventSystems中定义的IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler这三个接口,代码如下:
public class MyButton1 : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
[SerializeField]
private Button button;
[SerializeField]
private Text text;
private void Start()
{
if(button == null)
{
button = GetComponent();
}
if(text == null)
{
text = GetComponentInChildren();
}
}
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("Pointer enter");
text.text = "Pointer enter";
}
public void OnPointerExit(PointerEventData eventData)
{
Debug.Log("Pointer Exit");
text.text = "Pointer Exit";
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("Pointer click");
text.text = "Pointer click";
}
}
实际上Button自身已经实现了这几个接口,所以可以直接继承Button并重写这三个方法,将原来的Button组件换成MyButton2:
public class MyButton2 : Button
{
[SerializeField]
private Text text;
protected override void Awake()
{
base.Awake();
if(text == null)
{
text = GetComponentInChildren();
}
}
public override void OnPointerEnter(PointerEventData eventData)
{
base.OnPointerEnter(eventData);
Debug.Log("Pointer enter");
text.text = "Pointer enter";
}
public override void OnPointerExit(PointerEventData eventData)
{
base.OnPointerExit(eventData);
Debug.Log("Pointer Exit");
text.text = "Pointer Exit";
}
public override void OnPointerClick(PointerEventData eventData)
{
base.OnPointerClick(eventData);
Debug.Log("Pointer click");
text.text = "Pointer click";
}
}
这时候会发现继承自Button的MyButton2在Inspector里并不能看到text字段,这时需要对Button的编辑器显示进行扩展:
using UnityEditor;
using UnityEditor.UI;
[CustomEditor(typeof(MyButton2), true)]
[CanEditMultipleObjects]
public class MyButton2Editor : ButtonEditor
{
private SerializedProperty text;
protected override void OnEnable()
{
base.OnEnable();
text = serializedObject.FindProperty("text");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();
serializedObject.Update();
EditorGUILayout.PropertyField(text);
serializedObject.ApplyModifiedProperties();
}
}
(将上面这个脚本放到Assets>Editor文件夹下,这样只是在编辑器里使用,不会被打包发布)
其实也可以直接重写Button的DoStateTransition这个方法,对应的就是Button组件显示在Inspector里的Transition:
public class MyButton3 : Button
{
[SerializeField]
private Text text;
protected override void Awake()
{
base.Awake();
if(text == null)
{
text = GetComponentInChildren();
}
}
protected override void DoStateTransition(SelectionState state, bool instant)
{
switch(state)
{
case SelectionState.Normal:
Debug.Log("Normal");
text.text = "Normal";
break;
case SelectionState.Pressed:
Debug.Log("Pressed");
text.text = "Pressed";
break;
case SelectionState.Highlighted:
Debug.Log("Highlited");
text.text = "Highlited";
break;
case SelectionState.Disabled:
Debug.Log("Disabled");
text.text = "Disabled";
break;
}
}
}
按照这个思路还可以实现更多的效果。
button组件 untiy_Unity自定义Button组件Transition相关推荐
- Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画
文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...
- WDA ALV组件复用自定义button,单元格修改
WDA ALV组件中的TOOLBAR是ON_FUNCTION事件 在ALV中添加自定义按钮 * table toolbarDATA:LO_FUN_CALL TYPE REF TO CL_SALV_WD ...
- 【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )
文章目录 一.Flutter 组件简介 二.Flutter 自定义 StatelessWidget 组件流程 1.导入父类包 2.选择继承的父类 3.设置成员变量及构造函数 4.重写 build 方法 ...
- Android自定义控件学习(三)----- 自定义视图组件
自定义视图组件 说明 Android提供了用于构建UI的基础上,基本布局类一个复杂和强大的组件化模式:View和 ViewGroup.首先,该平台包含各种预构建的View和ViewGroup子类 - ...
- 父子组建传值_浅谈Vue父子组件和非父子组件传值问题
本文介绍了浅谈Vue父子组件和非父子组件传值问题,分享给大家,具体如下: 1.如何创建组件 1.新建一个组件,如:在goods文件夹下新建goodsList.vue goodsList组件 expor ...
- Android开发8:UI组件TextView,EditText,Button
版本:Android4.3 API18 学习整理:liuxinming TextView 概述 TextView直接继承了View(EditText.Button两个UI组件类的父类) TextVie ...
- java swt button_JAVA.SWT/JFace: SWT基本组件之按钮(Button)
<Eclipse SWT/JFACE 核心应用> 清华大学出版社 5.2 按钮(Button) 按钮有普通按钮(SWT.PUSH).单选按钮(SWT.RADIO).多选按钮(SWT.CHE ...
- Vue | 使用Vue脚手架 【脚手架的基本使用+ref属性+props属性+mixin混入+插件scoped样式+TodoList+浏览器本地存储+组件的自定义事件+全局事件总线+过度与动画】
文章目录 脚手架的基本使用 初始化脚手架 分析脚手架结构 render函数 修改默认配置 ref属性 props属性 mixin混入 插件 scoped样式 Todo-list案例 组件化编码流程(通 ...
- 基于Bootstrap里面的Button dropdown打造自定义select
最近工作非常的忙,在对一个系统进行改版.项目后台是MVC1.0开发的,但是前端部分已经改过几个版本,而已之前的设计师很强大,又做设计又做前端开发.而已很时尚和前沿,使用了一直都很热门的Bootstra ...
最新文章
- 烂泥:虚拟化KVM安装与配置
- ue4蓝图节点手册中文_UE4蓝图解析(一)
- 空except的慎用
- Windows远程桌面(mstsc)不能复制粘贴的解决办法
- SpringBoot项目启动时提示程序包不存在和找不到符号
- csh远程登录服务器,ubuntu远程连接服务器某一个用户(非root用户)出现sh: 1: source: not found...
- AngularJS日期格式化
- python多线程与多进程
- 【图像去噪】基于matlab小波变换+Contourlet变换+PCA图像去噪【含Matlab源码 610期】
- 全国计算机OFFICE二级考试大纲,全国计算机等级考试二级MSOffice高级应用考试大纲...
- 阿里云短信发送SDK
- 【Linux入门指北】第六篇 Linux常用的开发工具
- Java 操作 Office:POI之word图片处理
- python高阶知识之——列表推导式(63)
- python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS
- 基于ZYNQ的数据存储和实时成像系统
- 使用机器学习来预测股票价格
- StringBuffer 拼接字符串时,删除最后一个逗号
- App Store上架流程/苹果app发布流程
- IT人常用网站推荐!
热门文章
- 三招帮你解决物联网卡上不了网问题
- go 获取内核数_Go的GPM多线程调度
- dosbox edit.exe 如何使用_微软软件如何激活?这个神器分享给你!
- 通俗易懂的Monte Carlo积分方法(四)
- A study on ILC for linear discrete systems with single delay
- netsuite和java_Netsuite - 如何根据项目和位置搜索填充子列表
- oracle数据库查询下级_Oracle 图技术
- mac解压错误22无效的参数_看看PHP 7.3新版本中的JSON错误处理
- 控制led闪烁次数_单片机驱动LED灯的进阶之路
- [spring]spring boot项目实例