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相关推荐

  1. Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画

    文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...

  2. WDA ALV组件复用自定义button,单元格修改

    WDA ALV组件中的TOOLBAR是ON_FUNCTION事件 在ALV中添加自定义按钮 * table toolbarDATA:LO_FUN_CALL TYPE REF TO CL_SALV_WD ...

  3. 【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )

    文章目录 一.Flutter 组件简介 二.Flutter 自定义 StatelessWidget 组件流程 1.导入父类包 2.选择继承的父类 3.设置成员变量及构造函数 4.重写 build 方法 ...

  4. Android自定义控件学习(三)----- 自定义视图组件

    自定义视图组件 说明 Android提供了用于构建UI的基础上,基本布局类一个复杂和强大的组件化模式:View和 ViewGroup.首先,该平台包含各种预构建的View和ViewGroup子类 - ...

  5. 父子组建传值_浅谈Vue父子组件和非父子组件传值问题

    本文介绍了浅谈Vue父子组件和非父子组件传值问题,分享给大家,具体如下: 1.如何创建组件 1.新建一个组件,如:在goods文件夹下新建goodsList.vue goodsList组件 expor ...

  6. Android开发8:UI组件TextView,EditText,Button

    版本:Android4.3 API18 学习整理:liuxinming TextView 概述 TextView直接继承了View(EditText.Button两个UI组件类的父类) TextVie ...

  7. java swt button_JAVA.SWT/JFace: SWT基本组件之按钮(Button)

    <Eclipse SWT/JFACE 核心应用> 清华大学出版社 5.2 按钮(Button) 按钮有普通按钮(SWT.PUSH).单选按钮(SWT.RADIO).多选按钮(SWT.CHE ...

  8. Vue | 使用Vue脚手架 【脚手架的基本使用+ref属性+props属性+mixin混入+插件scoped样式+TodoList+浏览器本地存储+组件的自定义事件+全局事件总线+过度与动画】

    文章目录 脚手架的基本使用 初始化脚手架 分析脚手架结构 render函数 修改默认配置 ref属性 props属性 mixin混入 插件 scoped样式 Todo-list案例 组件化编码流程(通 ...

  9. 基于Bootstrap里面的Button dropdown打造自定义select

    最近工作非常的忙,在对一个系统进行改版.项目后台是MVC1.0开发的,但是前端部分已经改过几个版本,而已之前的设计师很强大,又做设计又做前端开发.而已很时尚和前沿,使用了一直都很热门的Bootstra ...

最新文章

  1. 烂泥:虚拟化KVM安装与配置
  2. ue4蓝图节点手册中文_UE4蓝图解析(一)
  3. 空except的慎用
  4. Windows远程桌面(mstsc)不能复制粘贴的解决办法
  5. SpringBoot项目启动时提示程序包不存在和找不到符号
  6. csh远程登录服务器,ubuntu远程连接服务器某一个用户(非root用户)出现sh: 1: source: not found...
  7. AngularJS日期格式化
  8. python多线程与多进程
  9. 【图像去噪】基于matlab小波变换+Contourlet变换+PCA图像去噪【含Matlab源码 610期】
  10. 全国计算机OFFICE二级考试大纲,全国计算机等级考试二级MSOffice高级应用考试大纲...
  11. 阿里云短信发送SDK
  12. 【Linux入门指北】第六篇 Linux常用的开发工具
  13. Java 操作 Office:POI之word图片处理
  14. python高阶知识之——列表推导式(63)
  15. python 拓扑排序 dfs bfs_图遍历算法之DFS/BFS
  16. 基于ZYNQ的数据存储和实时成像系统
  17. 使用机器学习来预测股票价格
  18. StringBuffer 拼接字符串时,删除最后一个逗号
  19. App Store上架流程/苹果app发布流程
  20. IT人常用网站推荐!

热门文章

  1. 三招帮你解决物联网卡上不了网问题
  2. go 获取内核数_Go的GPM多线程调度
  3. dosbox edit.exe 如何使用_微软软件如何激活?这个神器分享给你!
  4. 通俗易懂的Monte Carlo积分方法(四)
  5. A study on ILC for linear discrete systems with single delay
  6. netsuite和java_Netsuite - 如何根据项目和位置搜索填充子列表
  7. oracle数据库查询下级_Oracle 图技术
  8. mac解压错误22无效的参数_看看PHP 7.3新版本中的JSON错误处理
  9. 控制led闪烁次数_单片机驱动LED灯的进阶之路
  10. [spring]spring boot项目实例