在游戏设置中我们经常会使用到类似这样的开关组件,但是UGUI并没有直接提供,通常我们都是使用Toggle组件加自己写的脚本完成这个效果,今天我们来制作一个脚本,直接达到switchButton这样的效果。
仔细观察一个switchButton,主要由以下三个部分构成,label,OnImage,OffImage。
我们先使用CreateEmpty创建一个root节点,再分别创建label。OnObj,OffObj。类型为Text,Image,Image。之后我们开始编写我们SwitchButton脚本。
主要思想就是实现IPointerCLickHandler接口,监听点击事件。并将其注册到咱们自定义的UIManger里声明好的事件监听器中,之后咱们就可以在需要使用到switchButton的界面的控制脚本里,往里面添加代理函数。整体的事件分发流程如下:
下面放出主要脚本:
using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
public class MySwitchButton :MonoBehaviour,IPointerClickHandler
{
private Transform OnObj;//onState transform
private Transform OffObj;//offState transform
//get obj by name
private void init()
{
try {
OnObj = this.transform.Find("OnObj");
OffObj = this.transform.Find("OffObj");
changeState(isOn);
} catch (System.Exception e) {
Debug.Log("You must add two obj for this component!");
}
}
private void changeState(bool state)
{
OnObj.gameObject.SetActive(state);
OffObj.gameObject.SetActive(!state);
}
[Serializable]
public class SwitchEvent : UnityEvent<bool,GameObject>{ }
private SwitchEvent onClick = new SwitchEvent();
[SerializeField]
private bool m_isOn;
public bool isOn{
get { return m_isOn; }
set {
if (m_isOn == value)
return;
m_isOn = value;
changeState(m_isOn);
onClick.Invoke(m_isOn, this.gameObject);
}
}
void Start()
{
init();
onClick.AddListener(UIManger.Instance.switchButtonListener);
}
public virtual void OnPointerClick(PointerEventData eventData)
{
Debug.Log("OnPoint");
if (eventData.button != PointerEventData.InputButton.Left)
return;
isOn = !isOn;
}
}
using UnityEngine;
using System.Collections;
using UnityEngine.Events;
using UnityEngine.UI;
public class UIManger : MonoBehaviour
{
public static UIManger Instance;
void Awake(){
Instance = this;
}
//listener
public UnityAction<bool, GameObject> switchButtonListener;
}
using UnityEngine;
using System.Collections;
public class UISetting : MonoBehaviour{
void Awake()
{
UIManger.Instance.switchButtonListener += musicSwitchButtonEvent;
UIManger.Instance.switchButtonListener += soundSwitchButtonEvent;
UIManger.Instance.switchButtonListener += fangYanSwitchButtonEvent;
}
private void musicSwitchButtonEvent(bool isOn, GameObject sender)
{
if (sender.name.Equals("MusicSwitch")) {
Debug.Log("音乐switch");
}
}
private void soundSwitchButtonEvent(bool isOn, GameObject sender)
{
if (sender.name.Equals("SoundSwitch")) {
Debug.Log("音效switch");
}
}
private void fangYanSwitchButtonEvent(bool isOn,GameObject sender){
if (sender.name.Equals("FangYanSwitch")){
Debug.Log("方言switch");
}
}
}