Ugui之Toggle扩展

 

正常情况下,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);
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用UnityToggle组件和事件来实现在点击Toggle时切换子物体的颜色。首先,在子物体上添加一个Image组件,并将其颜色设置为默认颜色。然后在Toggle组件上勾选“Is On”属性,这样Toggle默认就是选中状态。接下来,在Toggle上添加一个Toggle组件,并在该组件的“On Value Changed”事件中添加一个事件处理程序。在事件处理程序中,你可以检查Toggle的选中状态,然后根据需要设置子物体的颜色。例如,以下代码将在Toggle选中时将子物体的颜色设置为红色,取消选中时将颜色设置回默认颜色: ```csharp public class ToggleColorController : MonoBehaviour { public Toggle toggle; public Image childImage; public Color defaultColor = Color.white; public Color selectedColor = Color.red; void Start() { // 设置子物体默认颜色 childImage.color = defaultColor; // 添加Toggle事件处理程序 toggle.onValueChanged.AddListener(OnToggleValueChanged); } void OnToggleValueChanged(bool isOn) { // 根据Toggle的选中状态切换子物体颜色 if (isOn) { childImage.color = selectedColor; } else { childImage.color = defaultColor; } } } ``` 在这个示例中,我们为Toggle组件添加了一个事件处理程序,并在Start方法中设置了子物体的默认颜色。在事件处理程序中,我们检查Toggle的选中状态,并根据状态切换子物体的颜色。最后,将Toggle组件和子物体的Image组件分别分配给变量toggle和childImage。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值