Unity自定义Button组件Transition

摘要:
Unity自带的Button组件有三种不同的Transition(过渡)选项,分别是None,ColorTint,SpriteSwap,Animation。现在想自定义其他功能,比如在不同的状态下,按钮上的文字不同。

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<Button>();
        }
        if(text == null)
        {
            text = GetComponentInChildren<Text>();
        }
    }

    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<Text>();
        }
    }

    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<Text>();
        }
    }

    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;
        }
    }
}

按照这个思路还可以实现更多的效果。

免责声明:文章转载自《Unity自定义Button组件Transition》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇composer安装及使用说明和相关原理文档bootstrap基础(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity 切割导出精灵

Unity中经常使用到精灵,尤其是2D游戏中制作动画等!今天我们就学习下精灵的切割和导出吧! 废话不多说,先建议空的工程。 1,打开Unity建工程。 2 导入素材进行资源分类,工程不在于大小,这是我们对待它的态度! 3.开始分割精灵,三步走! 编辑精灵. 开始分割精灵 Apply一下,看下分割的精灵,0-9共9个。 贴精灵导出代码: using...

CU3ER非常Cool的3D效果的Flash Slider

用户界面 3D效果 Quick Start 使用CU3ER的简单十步: 1、下载CU3ER,解压缩文件到独立的文件夹。 2、(可选)创建你的图片并将它们放到cu3er的images目录下,如果你不使用提供的图片的话。 3、备份config.xml(可以重命名它为config_bkp.xml类似的名字)并在同样的位置创建新的config.xml。 4、...

转载 Android之网络与通信

2.三种网络接口简述2.1标准Java接口java.net.*提供与联网有关的类,包括流和数据包套接字、Internet协议、常见HTTP处理。使用java.net.*包连接网络代码:Java代码 收藏代码try{ //定义地址 URL url=newURL("http://www.google.com"); //打开连接 HttpURLConn...

Unity里面的自动寻路(一)

来自:http://www.narkii.com/club/forum.php?mod=viewthread&tid=269146&highlight=Unity%E9%87%8C%E9%9D%A2%E7%9A%84%E8%87%AA%E5%8A%A8%E5%AF%BB%E8%B7%AF             众所周知,自动寻路是所有游戏...

Unity3D客户端和Java服务端使用Protobuf

原文:http://blog.csdn.net/kakashi8841/article/details/17334493 前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈。 本文测试环境: 系统:WINDOWS 7(第3、6步)、OS X 10.9(第4步) 软件:VS 2012(第3、6步)、E...

Unity2019使用Gradle命令行(编译)出安卓包

在我所经历的项目组中有这几种方法来生成APK 直接在Unity生成APK,可以接入SDK 使用Unity导出Android Studio工程手动生成APK 使用Unity导出Android Studio工程命令行离线生成APK 这里记录一下我在项目组使用Android Studio出包的笔记。 使用Unity导出Android Studio工程前建议查...