UGUI中Toggle组件的使用也是非常频繁的,相对于Button来说Toggle配合ToggleGroup可以在某些方面避免很多工作量.工作中因为有些需求单纯的靠原生的UGUI不好实现,所以自己DIY了一下,效果还是能可以的,复用性也很强,关键代码短改起来非常方便.
先把代码贴出来:
using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
public class ToggleChange : MonoBehaviour
{
[Serializable]
public class ToggleEvent : UnityEvent
{
}
[SerializeField] private ToggleEvent toggleEventTrue = new ToggleEvent();
public ToggleEvent ToggleEventTrue
{
get => toggleEventTrue;
set => toggleEventTrue = value;
}
[SerializeField] private ToggleEvent toggleEventFalse = new ToggleEvent();
public ToggleEvent ToggleEventFalse
{
get => toggleEventFalse;
set => toggleEventFalse = value;
}
public Sprite check, unCheck;
private Image _image;
private Toggle _toggle;
private void Start()
{
_toggle = GetComponent<Toggle>();
_image = GetComponent<Image>();
_toggle.onValueChanged.AddListener(Change);
}
private void Change(bool toggleValue)
{
switch (toggleValue)
{
case true:
_image.sprite = check;
_toggle.interactable = false;
toggleEventTrue?.Invoke();
break;
case false:
_image.sprite = unCheck;
_toggle.interactable = true;
toggleEventFalse?.Invoke();
break;
}
}
}
原始的诉求呢就是要展示出哪个Toggle是被选中的,其实在Toggle原生组件的Transition中选择Sprite Swap模式然后在Selected Sprite中放入想要的图片就能实现了,但是这个有个弊端,就是你和其他UI有任何的交互,这个状态都会被取消掉,无法保持.针对这个我的思路是先定义定义两个Sprite,一个是未被选中的一个是被选中的,然后在isOn改变时,去修改Image的Sprite,这样就能做到状态保持.然后解决的就是ture和false调用不同的方法了,这个很简单,为了和Toggle组件保持操作性一致,所以也保留了拖拽添加方法的操作.但是其中有个问题就是,如果Toggle的isOn是True,我再次点击当前Toggle时我不想Toggle的isOn变成false,只有选择了其他的Toggle的时候我才能再次点击这个Toggle来让他的isOn变成True,最简单的方法就是把他的interactable设置成false,这样不影响ToggleGroup的同时你也无法操作Toggle,当然如果有需要的话注释掉那两行就好了