16
NGUI 3 Support / UICheckboxPlus (UITexture instead of UISprite)
« on: September 09, 2013, 03:53:09 PM »
I modified the code of the UICheckbox to handle a UITexture instead of a UISprite. This came in handy for me, so I figure perhaps there is someone else out there who could benefit from it. So here you are.
- //----------------------------------------------
- // NGUI: Next-Gen UI kit
- // Copyright © 2011-2013 Tasharen Entertainment
- //----------------------------------------------
- using UnityEngine;
- using AnimationOrTween;
- /// <summary>
- /// Simple checkbox functionality. If 'option' is enabled, checking this checkbox will uncheck all other checkboxes with the same parent.
- /// </summary>
- [AddComponentMenu("NGUI/Interaction/Checkbox")]
- public class UICheckboxPlus : MonoBehaviour
- {
- static public UICheckboxPlus current;
- public delegate void OnStateChange (bool state);
- /// <summary>
- /// Sprite that's visible when the 'isChecked' status is 'true'.
- /// </summary>
- public UITexture checkSprite;
- /// <summary>
- /// Animation to play on the checkmark sprite, if any.
- /// </summary>
- public Animation checkAnimation;
- /// <summary>
- /// If checked, tween-based transition will be instant instead.
- /// </summary>
- public bool instantTween = false;
- /// <summary>
- /// Whether the checkbox starts checked.
- /// </summary>
- public bool startsChecked = true;
- /// <summary>
- /// If the checkbox is part of a radio button group, specify the root object to use that all checkboxes are parented to.
- /// </summary>
- public Transform radioButtonRoot;
- /// <summary>
- /// Can the radio button option be 'none'?
- /// </summary>
- public bool optionCanBeNone = false;
- /// <summary>
- /// Generic event receiver that will be notified when the state changes.
- /// </summary>
- public GameObject eventReceiver;
- /// <summary>
- /// Function that will be called on the event receiver when the state changes.
- /// </summary>
- public string functionName = "OnActivate";
- /// <summary>
- /// Delegate that will be called when the checkbox's state changes. Faster than using 'eventReceiver'.
- /// </summary>
- public OnStateChange onStateChange;
- // Prior to 1.90 'option' was used to toggle the radio button group functionality
- [HideInInspector][SerializeField] bool option = false;
- bool mChecked = true;
- bool mStarted = false;
- Transform mTrans;
- /// <summary>
- /// Whether the checkbox is checked.
- /// </summary>
- public bool isChecked
- {
- get { return mChecked; }
- set { if (radioButtonRoot == null || value || optionCanBeNone || !mStarted) Set(value); }
- }
- /// <summary>
- /// Legacy functionality support -- set the radio button root if the 'option' value was 'true'.
- /// </summary>
- void Awake ()
- {
- mTrans = transform;
- if (checkSprite != null) checkSprite.alpha = startsChecked ? 1f : 0f;
- if (option)
- {
- option = false;
- if (radioButtonRoot == null) radioButtonRoot = mTrans.parent;
- }
- }
- /// <summary>
- /// Activate the initial state.
- /// </summary>
- void Start ()
- {
- if (eventReceiver == null) eventReceiver = gameObject;
- mChecked = !startsChecked;
- mStarted = true;
- Set(startsChecked);
- }
- /// <summary>
- /// Check or uncheck on click.
- /// </summary>
- void OnClick () { if (enabled) isChecked = !isChecked; }
- /// <summary>
- /// Fade out or fade in the checkmark and notify the target of OnChecked event.
- /// </summary>
- void Set (bool state)
- {
- if (!mStarted)
- {
- mChecked = state;
- startsChecked = state;
- if (checkSprite != null) checkSprite.alpha = state ? 1f : 0f;
- }
- else if (mChecked != state)
- {
- // Uncheck all other checkboxes
- if (radioButtonRoot != null && state)
- {
- UICheckboxPlus[] cbs = radioButtonRoot.GetComponentsInChildren<UICheckboxPlus>(true);
- for (int i = 0, imax = cbs.Length; i < imax; ++i)
- {
- UICheckboxPlus cb = cbs[i];
- if (cb != this && cb.radioButtonRoot == radioButtonRoot) cb.Set(false);
- }
- }
- // Remember the state
- mChecked = state;
- // Tween the color of the checkmark
- if (checkSprite != null)
- {
- if (instantTween)
- {
- checkSprite.alpha = mChecked ? 1f : 0f;
- }
- else
- {
- TweenAlpha.Begin(checkSprite.gameObject, 0.15f, mChecked ? 1f : 0f);
- }
- }
- current = this;
- // Notify the delegate
- if (onStateChange != null) onStateChange(mChecked);
- // Send out the event notification
- if (eventReceiver != null && !string.IsNullOrEmpty(functionName))
- {
- eventReceiver.SendMessage(functionName, mChecked, SendMessageOptions.DontRequireReceiver);
- }
- current = null;
- // Play the checkmark animation
- if (checkAnimation != null)
- {
- ActiveAnimation.Play(checkAnimation, state ? Direction.Forward : Direction.Reverse);
- }
- }
- }
- }