Hi
Using the following class to successfully swap sprites on a Toggle object. It works but what I need is to have the Sprite swap happen OnPointerDown instead of OnValueChanged(when the mouse or finger is released).
Can anyone help?
I came across one possible solution but am having a problem implementing
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Toggle))]
public class ToggleSpriteSwap : MonoBehaviour
{
[SerializeField]
private Image targetImage;e]
[SerializeField]
private Sprite onSprite;
[SerializeField]
private Sprite offSprite;
[SerializeField]
private bool isOn;
public bool IsOn { get { return isOn; } set { isOn = value; UpdateValue(); } }
//public event Action<bool> onValueChanged;
private Toggle toggle;
// to set initial value and skip onValueChanged notification
public void Initialize(bool value)
{
isOn = value;
UpdateValue(false);
}
// Use this for initialization
void Start()
{
toggle = GetComponent<PointerDownToggle>();
toggle.transition = Selectable.Transition.None;
toggle.onValueChanged.AddListener((t) => { OnClick(); });
}
void OnClick()
{
//isOn = !isOn;
isOn=toggle.isOn;
UpdateValue();
}
private void UpdateValue(bool notifySubscribers = true)
{
// if (notifySubscribers && onValueChanged != null)
// onValueChanged(isOn);
if (targetImage == null)
return;
targetImage.sprite = isOn ? onSprite : offSprite;
}
}
Ok so almost there. Everything works except my Toggle group isn’t updated. ie members of the group NOT pressed don’t switch to their ‘OFF’ state. I added the 'group.NotifyToggleOn(this) on line 12 and also tried 'base.group.NotifyToggleOn(this); No difference!
Extending Toggle using the following
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class PointerDownToggle : Toggle {
public override void OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData)
{
}
public override void OnPointerDown (UnityEngine.EventSystems.PointerEventData eventData)
{
base.OnPointerClick (eventData);
group.NotifyToggleOn(this);
}
}
and then my revised sprite swap class is
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
[RequireComponent(typeof(Toggle))]
public class ToggleSpriteSwap : MonoBehaviour, IPointerDownHandler
{
[SerializeField]
private Image targetImage;
[SerializeField]
private Sprite onSprite;
[SerializeField]
private Sprite offSprite;
[SerializeField]
private bool isOn;
public bool IsOn { get { return isOn; } set { isOn = value; UpdateValue(); } }
private PointerDownToggle toggle;
public void OnPointerDown(PointerEventData data)
{
isOn=toggle.isOn;
UpdateValue();
Debug.LogWarning ("1 ASSERT OnPointerDown toggle ==" + toggle);
Debug.LogWarning ("2 ASSERT OnPointerDown toggle.isOn ==" + toggle.isOn);
}
// to set initial value and skip onValueChanged notification
public void Initialize(bool value)
{
isOn = value;
UpdateValue(false);
}
// Use this for initialization
void Start()
{
toggle = GetComponent<PointerDownToggle>();
toggle.transition = Selectable.Transition.None;
Debug.LogWarning ("0 ASSERT Start toggle ==" + toggle);
}
private void UpdateValue(bool notifySubscribers = true)
{
if (targetImage == null)
return;
targetImage.sprite = isOn ? onSprite : offSprite;
}
}