//---------------------------------------------- // NGUI: Next-Gen UI kit // Copyright © 2011-2015 Tasharen Entertainment //---------------------------------------------- using UnityEngine; using AnimationOrTween; using System.Collections.Generic; /// /// Play the specified tween on click. /// [ExecuteInEditMode] [AddComponentMenu("NGUI/Interaction/Play Tween")] public class UIPlayTween : MonoBehaviour { static public UIPlayTween current; /// /// Target on which there is one or more tween. /// public GameObject tweenTarget; /// /// If there are multiple tweens, you can choose which ones get activated by changing their group. /// public int tweenGroup = 0; /// /// Which event will trigger the tween. /// public Trigger trigger = Trigger.OnClick; /// /// Direction to tween in. /// public Direction playDirection = Direction.Forward; /// /// Whether the tween will be reset to the start or end when activated. If not, it will continue from where it currently is. /// public bool resetOnPlay = false; /// /// Whether the tween will be reset to the start if it's disabled when activated. /// public bool resetIfDisabled = false; /// /// What to do if the tweenTarget game object is currently disabled. /// public EnableCondition ifDisabledOnPlay = EnableCondition.DoNothing; /// /// What to do with the tweenTarget after the tween finishes. /// public DisableCondition disableWhenFinished = DisableCondition.DoNotDisable; /// /// Whether the tweens on the child game objects will be considered. /// public bool includeChildren = false; /// /// Event delegates called when the animation finishes. /// public List onFinished = new List(); // Deprecated functionality, kept for backwards compatibility [HideInInspector][SerializeField] GameObject eventReceiver; [HideInInspector][SerializeField] string callWhenFinished; UITweener[] mTweens; bool mStarted = false; int mActive = 0; bool mActivated = false; void Awake () { // Remove deprecated functionality if new one is used if (eventReceiver != null && EventDelegate.IsValid(onFinished)) { eventReceiver = null; callWhenFinished = null; #if UNITY_EDITOR NGUITools.SetDirty(this); #endif } } void Start() { mStarted = true; if (tweenTarget == null) { tweenTarget = gameObject; #if UNITY_EDITOR NGUITools.SetDirty(this); #endif } } void OnEnable () { #if UNITY_EDITOR if (!Application.isPlaying) return; #endif if (mStarted) OnHover(UICamera.IsHighlighted(gameObject)); if (UICamera.currentTouch != null) { if (trigger == Trigger.OnPress || trigger == Trigger.OnPressTrue) mActivated = (UICamera.currentTouch.pressed == gameObject); if (trigger == Trigger.OnHover || trigger == Trigger.OnHoverTrue) mActivated = (UICamera.currentTouch.current == gameObject); } UIToggle toggle = GetComponent(); if (toggle != null) EventDelegate.Add(toggle.onChange, OnToggle); } void OnDisable () { #if UNITY_EDITOR if (!Application.isPlaying) return; #endif UIToggle toggle = GetComponent(); if (toggle != null) EventDelegate.Remove(toggle.onChange, OnToggle); } void OnDragOver () { if (trigger == Trigger.OnHover) OnHover(true); } void OnHover (bool isOver) { if (enabled) { if (trigger == Trigger.OnHover || (trigger == Trigger.OnHoverTrue && isOver) || (trigger == Trigger.OnHoverFalse && !isOver)) { mActivated = isOver && (trigger == Trigger.OnHover); Play(isOver); } } } void OnDragOut () { if (enabled && mActivated) { mActivated = false; Play(false); } } void OnPress (bool isPressed) { if (enabled) { if (trigger == Trigger.OnPress || (trigger == Trigger.OnPressTrue && isPressed) || (trigger == Trigger.OnPressFalse && !isPressed)) { mActivated = isPressed && (trigger == Trigger.OnPress); Play(isPressed); } } } void OnClick () { if (enabled && trigger == Trigger.OnClick) { Play(true); } } void OnDoubleClick () { if (enabled && trigger == Trigger.OnDoubleClick) { Play(true); } } void OnSelect (bool isSelected) { if (enabled) { if (trigger == Trigger.OnSelect || (trigger == Trigger.OnSelectTrue && isSelected) || (trigger == Trigger.OnSelectFalse && !isSelected)) { mActivated = isSelected && (trigger == Trigger.OnSelect); Play(isSelected); } } } void OnToggle () { if (!enabled || UIToggle.current == null) return; if (trigger == Trigger.OnActivate || (trigger == Trigger.OnActivateTrue && UIToggle.current.value) || (trigger == Trigger.OnActivateFalse && !UIToggle.current.value)) Play(UIToggle.current.value); } void Update () { #if UNITY_EDITOR if (!Application.isPlaying) return; #endif if (disableWhenFinished != DisableCondition.DoNotDisable && mTweens != null) { bool isFinished = true; bool properDirection = true; for (int i = 0, imax = mTweens.Length; i < imax; ++i) { UITweener tw = mTweens[i]; if (tw.tweenGroup != tweenGroup) continue; if (tw.enabled) { isFinished = false; break; } else if ((int)tw.direction != (int)disableWhenFinished) { properDirection = false; } } if (isFinished) { if (properDirection) NGUITools.SetActive(tweenTarget, false); mTweens = null; } } } /// /// Activate the tweeners. /// public void Play (bool forward) { mActive = 0; GameObject go = (tweenTarget == null) ? gameObject : tweenTarget; if (!NGUITools.GetActive(go)) { // If the object is disabled, don't do anything if (ifDisabledOnPlay != EnableCondition.EnableThenPlay) return; // Enable the game object before tweening it NGUITools.SetActive(go, true); } // Gather the tweening components mTweens = includeChildren ? go.GetComponentsInChildren() : go.GetComponents(); if (mTweens.Length == 0) { // No tweeners found -- should we disable the object? if (disableWhenFinished != DisableCondition.DoNotDisable) NGUITools.SetActive(tweenTarget, false); } else { bool activated = false; if (playDirection == Direction.Reverse) forward = !forward; // Run through all located tween components for (int i = 0, imax = mTweens.Length; i < imax; ++i) { UITweener tw = mTweens[i]; // If the tweener's group matches, we can work with it if (tw.tweenGroup == tweenGroup) { // Ensure that the game objects are enabled if (!activated && !NGUITools.GetActive(go)) { activated = true; NGUITools.SetActive(go, true); } ++mActive; // Toggle or activate the tween component if (playDirection == Direction.Toggle) { // Listen for tween finished messages EventDelegate.Add(tw.onFinished, OnFinished, true); tw.Toggle(); } else { if (resetOnPlay || (resetIfDisabled && !tw.enabled)) { tw.Play(forward); tw.ResetToBeginning(); } // Listen for tween finished messages EventDelegate.Add(tw.onFinished, OnFinished, true); tw.Play(forward); } } } } } /// /// Callback triggered when each tween executed by this script finishes. /// void OnFinished () { if (--mActive == 0 && current == null) { current = this; EventDelegate.Execute(onFinished); // Legacy functionality if (eventReceiver != null && !string.IsNullOrEmpty(callWhenFinished)) eventReceiver.SendMessage(callWhenFinished, SendMessageOptions.DontRequireReceiver); eventReceiver = null; current = null; } } }