Unity按钮视觉上跳过选中Selected状态

问题描述

Unity为Button提供了五种状态,并可以让我们在Inspector中设置五种状态的表现形式

  • Normal:普通状态
  • Highlighted:高亮状态,即鼠标悬停在按钮之上但没有其他操作
  • Pressed:按钮被按下时的状态
  • Selected:按钮被按下后选中的状态
  • Disabled:禁用状态

按钮在Selected状态中时,即使鼠标重新进入按钮,也不会切换到Highlighted状态,要通过点击按扭外的区域才可以退出Selected状态。有时我们在按下按钮后不希望其显示Selected状态的表现形式而是希望其正常Highlighted

解决方法

按钮状态的切换交由Selectable.cs这个脚本完成。按钮类在实现时继承了Selectable类

1
public class Button : Selectable, IPointerClickHandler, ISubmitHandler

而Selectable类又提供了DoStateTransition接口函数供我们改变状态,同时其实现IPointerEnterHandler等接口,我们可以重写OnPointerEnter等相关函数来实现跳过Selected状态。

  1. 点击按钮后,如果鼠标仍然在按钮内,转换到Highlighted状态
  2. 鼠标离开按钮时,转换到Normal状态
  3. 鼠标进入按钮时,转换到Highlighted状态

创建NonSelectedButton类,继承Button,实现上述功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class NonSelectedButton : Button
{
//点击按钮后转到Highlighted状态
public override void OnPointerClick(PointerEventData eventData)
{
base.OnPointerClick(eventData);
if (interactable)
{
DoStateTransition(SelectionState.Highlighted, true);
}
}

//进入按钮后转到Highlighted状态
public override void OnPointerEnter(PointerEventData eventData)
{
base.OnPointerEnter(eventData);
if (interactable)
{
DoStateTransition(SelectionState.Highlighted, true);
}
}

//离开按钮后转到Normal状态
public override void OnPointerExit(PointerEventData eventData)
{
base.OnPointerExit(eventData);
if (interactable)
{
DoStateTransition(SelectionState.Normal, true);
}
}
}