正常情况下,toggle和Button只有两种状态,选中和为选中,但是在PC端,我们有这样一种需求,选中情况下有普通状态和鼠标移上状态,未选中情况下有普通状态和鼠标移上状态,总共就有4种状态,如下图,默认的UGUI的Toggle没有这样的功能,所以我们来拓展Toggle
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
[RequireComponent(typeof(Toggle))]
public class ToggleExt : MonoBehaviour {
public Sprite normalSprite;
public Sprite hightlitedSprite;
public Sprite selectnormalSprite;
public Sprite selectHightlitedSprite;
public Toggle.ToggleEvent onValueChanged;
private Image img;
//private Image selectImg;
private Toggle toggle;
private SpriteState spriteState;
public bool isOn {
get
{
return toggle.isOn;
}
set
{
toggle.isOn = value;
}
}
#if UNITY_EDITOR
private void OnValidate()
{
toggle = GetComponent<Toggle>();
if (toggle == null)
{
toggle = gameObject.AddComponent<Toggle>();
}
if (toggle.targetGraphic != null)
{
GameObject targetGraphic = toggle.targetGraphic.gameObject;
img = targetGraphic.GetComponent<Image>();
if (img == null)
{
Graphic graphic = targetGraphic.GetComponent<Graphic>();
if (graphic != null)
{
DestroyImmediate(graphic);
}
img = targetGraphic.AddComponent<Image>();
}
img.sprite = normalSprite;
}
toggle.transition = Selectable.Transition.SpriteSwap;
spriteState.pressedSprite = hightlitedSprite;
spriteState.highlightedSprite = hightlitedSprite;
spriteState.disabledSprite = normalSprite;
}
#endif
// Use this for initialization
void Awake () {
toggle = GetComponent<Toggle>();
if (toggle == null)
{
toggle = gameObject.AddComponent<Toggle>();
}
GameObject targetGraphic;
if (toggle.targetGraphic != null)
{
targetGraphic = toggle.targetGraphic.gameObject;
}
else
{
targetGraphic = gameObject;
}
targetGraphic = toggle.targetGraphic.gameObject;
img = targetGraphic.GetComponent<Image>();
if (img == null)
{
Graphic graphic = targetGraphic.GetComponent<Graphic>();
if (graphic != null)
{
Destroy(graphic);
}
img = targetGraphic.AddComponent<Image>();
}
img.sprite = normalSprite;
toggle.transition = Selectable.Transition.SpriteSwap;
img.sprite = normalSprite;
spriteState.pressedSprite = hightlitedSprite;
spriteState.highlightedSprite = hightlitedSprite;
spriteState.disabledSprite = normalSprite;
toggle.spriteState = spriteState;
toggle.targetGraphic = img;
toggle.onValueChanged.AddListener(onValueChange);
}
private void onValueChange(bool isOn)
{
if (!isOn)
{
img.sprite = normalSprite;
spriteState.pressedSprite = hightlitedSprite;
spriteState.highlightedSprite = hightlitedSprite;
spriteState.disabledSprite = normalSprite;
toggle.spriteState = spriteState;
}
else
{
img.sprite = selectnormalSprite;
spriteState.pressedSprite = selectHightlitedSprite;
spriteState.highlightedSprite = selectHightlitedSprite;
spriteState.disabledSprite = selectnormalSprite;
toggle.spriteState = spriteState;
}
onValueChanged.Invoke(isOn);
}
}