diff options
author | chai <chaifix@163.com> | 2021-04-07 19:10:30 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-04-07 19:10:30 +0800 |
commit | e7dfbec8e8634e767d78959941daf71a96e021cf (patch) | |
tree | 58895a7c60df0bd3f316e6461051eabd1c0a51e1 /Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Selectable.cs | |
parent | ff5a3fbf31db349db11bbc5c60ba199d26780f19 (diff) |
*移动目录
Diffstat (limited to 'Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Selectable.cs')
-rw-r--r-- | Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Selectable.cs | 654 |
1 files changed, 0 insertions, 654 deletions
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Selectable.cs b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Selectable.cs deleted file mode 100644 index fdc4dd6..0000000 --- a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Selectable.cs +++ /dev/null @@ -1,654 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine.Serialization; -using UnityEngine.EventSystems; - -namespace UnityEngine.UI -{ - // Simple selectable object - derived from to create a control. - [AddComponentMenu("UI/Selectable", 70)] - [ExecuteInEditMode] - [SelectionBase] - [DisallowMultipleComponent] - public class Selectable - : - UIBehaviour, - IMoveHandler, - IPointerDownHandler, IPointerUpHandler, - IPointerEnterHandler, IPointerExitHandler, - ISelectHandler, IDeselectHandler - { - // Selection state - - // List of all the selectable objects currently active in the scene - private static List<Selectable> s_List = new List<Selectable>(); - public static List<Selectable> allSelectables { get { return s_List; } } - - // Navigation information. - [FormerlySerializedAs("navigation")] - [SerializeField] - private Navigation m_Navigation = Navigation.defaultNavigation; - - // Highlighting state - public enum Transition - { - None, - ColorTint, - SpriteSwap, - Animation - } - - // Type of the transition that occurs when the button state changes. - [FormerlySerializedAs("transition")] - [SerializeField] - private Transition m_Transition = Transition.ColorTint; - - // Colors used for a color tint-based transition. - [FormerlySerializedAs("colors")] - [SerializeField] - private ColorBlock m_Colors = ColorBlock.defaultColorBlock; - - // Sprites used for a Image swap-based transition. - [FormerlySerializedAs("spriteState")] - [SerializeField] - private SpriteState m_SpriteState; - - [FormerlySerializedAs("animationTriggers")] - [SerializeField] - private AnimationTriggers m_AnimationTriggers = new AnimationTriggers(); - - [Tooltip("Can the Selectable be interacted with?")] - [SerializeField] - private bool m_Interactable = true; - - - //c m_TargetGraphic Ö»ÊÇÓÃÀ´×öչʾ£¬Õâ¸ö±äÁ¿²»»áÓÃÀ´½øÐÐÉäÏß¼ì²â£¬ÔÚAwake()Àï×¢Ê͵ôÒ²»¹»á´¥·¢µã»÷ʼþ - // Graphic that will be colored. - [FormerlySerializedAs("highlightGraphic")] - [FormerlySerializedAs("m_HighlightGraphic")] - [SerializeField] - private Graphic m_TargetGraphic; - - - private bool m_GroupsAllowInteraction = true; - - private SelectionState m_CurrentSelectionState; - - public Navigation navigation { get { return m_Navigation; } set { if (SetPropertyUtility.SetStruct(ref m_Navigation, value)) OnSetProperty(); } } - public Transition transition { get { return m_Transition; } set { if (SetPropertyUtility.SetStruct(ref m_Transition, value)) OnSetProperty(); } } - public ColorBlock colors { get { return m_Colors; } set { if (SetPropertyUtility.SetStruct(ref m_Colors, value)) OnSetProperty(); } } - public SpriteState spriteState { get { return m_SpriteState; } set { if (SetPropertyUtility.SetStruct(ref m_SpriteState, value)) OnSetProperty(); } } - public AnimationTriggers animationTriggers { get { return m_AnimationTriggers; } set { if (SetPropertyUtility.SetClass(ref m_AnimationTriggers, value)) OnSetProperty(); } } - public Graphic targetGraphic { - get { - return m_TargetGraphic; - } - set { - if (SetPropertyUtility.SetClass(ref m_TargetGraphic, value)) - OnSetProperty(); - } - } - public bool interactable - { - get { return m_Interactable; } - set - { - if (SetPropertyUtility.SetStruct(ref m_Interactable, value)) - { - if (!m_Interactable && EventSystem.current != null && EventSystem.current.currentSelectedGameObject == gameObject) - EventSystem.current.SetSelectedGameObject(null); - if (m_Interactable) - UpdateSelectionState(null); - OnSetProperty(); - } - } - } - - private bool isPointerInside { get; set; } - private bool isPointerDown { get; set; } - private bool hasSelection { get; set; } - - protected Selectable() - {} - - // Convenience function that converts the Graphic to a Image, if possible - public Image image - { - get { - return m_TargetGraphic as Image; - } - set { - m_TargetGraphic = value; - } - } - - // Get the animator - public Animator animator - { - get { return GetComponent<Animator>(); } - } - - protected override void Awake() - { - if (m_TargetGraphic == null) - m_TargetGraphic = GetComponent<Graphic>(); - } - - private readonly List<CanvasGroup> m_CanvasGroupCache = new List<CanvasGroup>(); - protected override void OnCanvasGroupChanged() - { - // Figure out if parent groups allow interaction - // If no interaction is alowed... then we need - // to not do that :) - var groupAllowInteraction = true; - Transform t = transform; - while (t != null) - { - t.GetComponents(m_CanvasGroupCache); - bool shouldBreak = false; - for (var i = 0; i < m_CanvasGroupCache.Count; i++) - { - // if the parent group does not allow interaction - // we need to break - if (!m_CanvasGroupCache[i].interactable) - { - groupAllowInteraction = false; - shouldBreak = true; - } - // if this is a 'fresh' group, then break - // as we should not consider parents - if (m_CanvasGroupCache[i].ignoreParentGroups) - shouldBreak = true; - } - if (shouldBreak) - break; - - t = t.parent; - } - - if (groupAllowInteraction != m_GroupsAllowInteraction) - { - m_GroupsAllowInteraction = groupAllowInteraction; - OnSetProperty(); - } - } - - public virtual bool IsInteractable() - { - return m_GroupsAllowInteraction && m_Interactable; - } - - // Call from unity if animation properties have changed - protected override void OnDidApplyAnimationProperties() - { - OnSetProperty(); - } - - // Select on enable and add to the list. - protected override void OnEnable() - { - base.OnEnable(); - - s_List.Add(this); - var state = SelectionState.Normal; - - // The button will be highlighted even in some cases where it shouldn't. - // For example: We only want to set the State as Highlighted if the StandaloneInputModule.m_CurrentInputMode == InputMode.Buttons - // But we dont have access to this, and it might not apply to other InputModules. - // TODO: figure out how to solve this. Case 617348. - if (hasSelection) - state = SelectionState.Highlighted; - - m_CurrentSelectionState = state; - InternalEvaluateAndTransitionToSelectionState(true); - } - - private void OnSetProperty() - { -#if UNITY_EDITOR - if (!Application.isPlaying) - InternalEvaluateAndTransitionToSelectionState(true); - else -#endif - InternalEvaluateAndTransitionToSelectionState(false); - } - - // Remove from the list. - protected override void OnDisable() - { - s_List.Remove(this); - InstantClearState(); - base.OnDisable(); - } - -#if UNITY_EDITOR - protected override void OnValidate() - { - base.OnValidate(); - m_Colors.fadeDuration = Mathf.Max(m_Colors.fadeDuration, 0.0f); - - // OnValidate can be called before OnEnable, this makes it unsafe to access other components - // since they might not have been initialized yet. - // OnSetProperty potentially access Animator or Graphics. (case 618186) - if (isActiveAndEnabled) - { - if (!interactable && EventSystem.current != null && EventSystem.current.currentSelectedGameObject == gameObject) - EventSystem.current.SetSelectedGameObject(null); - // Need to clear out the override image on the target... - DoSpriteSwap(null); - - // If the transition mode got changed, we need to clear all the transitions, since we don't know what the old transition mode was. - StartColorTween(Color.white, true); - TriggerAnimation(m_AnimationTriggers.normalTrigger); - - // And now go to the right state. - InternalEvaluateAndTransitionToSelectionState(true); - } - } - - protected override void Reset() - { - m_TargetGraphic = GetComponent<Graphic>(); - } - -#endif // if UNITY_EDITOR - - protected SelectionState currentSelectionState - { - get { return m_CurrentSelectionState; } - } - - protected virtual void InstantClearState() - { - string triggerName = m_AnimationTriggers.normalTrigger; - - isPointerInside = false; - isPointerDown = false; - hasSelection = false; - - switch (m_Transition) - { - case Transition.ColorTint: - StartColorTween(Color.white, true); - break; - case Transition.SpriteSwap: - DoSpriteSwap(null); - break; - case Transition.Animation: - TriggerAnimation(triggerName); - break; - } - } - - protected virtual void DoStateTransition(SelectionState state, bool instant) - { - Color tintColor; - Sprite transitionSprite; - string triggerName; - - switch (state) - { - case SelectionState.Normal: - tintColor = m_Colors.normalColor; - transitionSprite = null; - triggerName = m_AnimationTriggers.normalTrigger; - break; - case SelectionState.Highlighted: - tintColor = m_Colors.highlightedColor; - transitionSprite = m_SpriteState.highlightedSprite; - triggerName = m_AnimationTriggers.highlightedTrigger; - break; - case SelectionState.Pressed: - tintColor = m_Colors.pressedColor; - transitionSprite = m_SpriteState.pressedSprite; - triggerName = m_AnimationTriggers.pressedTrigger; - break; - case SelectionState.Disabled: - tintColor = m_Colors.disabledColor; - transitionSprite = m_SpriteState.disabledSprite; - triggerName = m_AnimationTriggers.disabledTrigger; - break; - default: - tintColor = Color.black; - transitionSprite = null; - triggerName = string.Empty; - break; - } - - if (gameObject.activeInHierarchy) - { - switch (m_Transition) - { - case Transition.ColorTint: - StartColorTween(tintColor * m_Colors.colorMultiplier, instant); - break; - case Transition.SpriteSwap: - DoSpriteSwap(transitionSprite); - break; - case Transition.Animation: - TriggerAnimation(triggerName); - break; - } - } - } - - protected enum SelectionState - { - Normal, - Highlighted, - Pressed, - Disabled - } - - // Selection logic - - // Find the next selectable object in the specified world-space direction. - public Selectable FindSelectable(Vector3 dir) - { - dir = dir.normalized; - Vector3 localDir = Quaternion.Inverse(transform.rotation) * dir; - Vector3 pos = transform.TransformPoint(GetPointOnRectEdge(transform as RectTransform, localDir)); - float maxScore = Mathf.NegativeInfinity; - Selectable bestPick = null; - for (int i = 0; i < s_List.Count; ++i) - { - Selectable sel = s_List[i]; - - if (sel == this || sel == null) - continue; - - if (!sel.IsInteractable() || sel.navigation.mode == Navigation.Mode.None) - continue; - - var selRect = sel.transform as RectTransform; - Vector3 selCenter = selRect != null ? (Vector3)selRect.rect.center : Vector3.zero; - Vector3 myVector = sel.transform.TransformPoint(selCenter) - pos; - - // Value that is the distance out along the direction. - float dot = Vector3.Dot(dir, myVector); - - // Skip elements that are in the wrong direction or which have zero distance. - // This also ensures that the scoring formula below will not have a division by zero error. - if (dot <= 0) - continue; - - // This scoring function has two priorities: - // - Score higher for positions that are closer. - // - Score higher for positions that are located in the right direction. - // This scoring function combines both of these criteria. - // It can be seen as this: - // Dot (dir, myVector.normalized) / myVector.magnitude - // The first part equals 1 if the direction of myVector is the same as dir, and 0 if it's orthogonal. - // The second part scores lower the greater the distance is by dividing by the distance. - // The formula below is equivalent but more optimized. - // - // If a given score is chosen, the positions that evaluate to that score will form a circle - // that touches pos and whose center is located along dir. A way to visualize the resulting functionality is this: - // From the position pos, blow up a circular balloon so it grows in the direction of dir. - // The first Selectable whose center the circular balloon touches is the one that's chosen. - float score = dot / myVector.sqrMagnitude; - - if (score > maxScore) - { - maxScore = score; - bestPick = sel; - } - } - return bestPick; - } - - private static Vector3 GetPointOnRectEdge(RectTransform rect, Vector2 dir) - { - if (rect == null) - return Vector3.zero; - if (dir != Vector2.zero) - dir /= Mathf.Max(Mathf.Abs(dir.x), Mathf.Abs(dir.y)); - dir = rect.rect.center + Vector2.Scale(rect.rect.size, dir * 0.5f); - return dir; - } - - // Convenience function -- change the selection to the specified object if it's not null and happens to be active. - void Navigate(AxisEventData eventData, Selectable sel) - { - if (sel != null && sel.IsActive()) - eventData.selectedObject = sel.gameObject; - } - - // Find the selectable object to the left of this one. - public virtual Selectable FindSelectableOnLeft() - { - if (m_Navigation.mode == Navigation.Mode.Explicit) - { - return m_Navigation.selectOnLeft; - } - if ((m_Navigation.mode & Navigation.Mode.Horizontal) != 0) - { - return FindSelectable(transform.rotation * Vector3.left); - } - return null; - } - - // Find the selectable object to the right of this one. - public virtual Selectable FindSelectableOnRight() - { - if (m_Navigation.mode == Navigation.Mode.Explicit) - { - return m_Navigation.selectOnRight; - } - if ((m_Navigation.mode & Navigation.Mode.Horizontal) != 0) - { - return FindSelectable(transform.rotation * Vector3.right); - } - return null; - } - - // Find the selectable object above this one - public virtual Selectable FindSelectableOnUp() - { - if (m_Navigation.mode == Navigation.Mode.Explicit) - { - return m_Navigation.selectOnUp; - } - if ((m_Navigation.mode & Navigation.Mode.Vertical) != 0) - { - return FindSelectable(transform.rotation * Vector3.up); - } - return null; - } - - // Find the selectable object below this one. - public virtual Selectable FindSelectableOnDown() - { - if (m_Navigation.mode == Navigation.Mode.Explicit) - { - return m_Navigation.selectOnDown; - } - if ((m_Navigation.mode & Navigation.Mode.Vertical) != 0) - { - return FindSelectable(transform.rotation * Vector3.down); - } - return null; - } - - public virtual void OnMove(AxisEventData eventData) - { - switch (eventData.moveDir) - { - case MoveDirection.Right: - Navigate(eventData, FindSelectableOnRight()); - break; - - case MoveDirection.Up: - Navigate(eventData, FindSelectableOnUp()); - break; - - case MoveDirection.Left: - Navigate(eventData, FindSelectableOnLeft()); - break; - - case MoveDirection.Down: - Navigate(eventData, FindSelectableOnDown()); - break; - } - } - - void StartColorTween(Color targetColor, bool instant) - { - if (m_TargetGraphic == null) - return; - - m_TargetGraphic.CrossFadeColor(targetColor, instant ? 0f : m_Colors.fadeDuration, true, true); - } - - void DoSpriteSwap(Sprite newSprite) - { - if (image == null) - return; - - image.overrideSprite = newSprite; - } - - void TriggerAnimation(string triggername) - { - if (transition != Transition.Animation || animator == null || !animator.isActiveAndEnabled || !animator.hasBoundPlayables || string.IsNullOrEmpty(triggername)) - return; - - animator.ResetTrigger(m_AnimationTriggers.normalTrigger); - animator.ResetTrigger(m_AnimationTriggers.pressedTrigger); - animator.ResetTrigger(m_AnimationTriggers.highlightedTrigger); - animator.ResetTrigger(m_AnimationTriggers.disabledTrigger); - - animator.SetTrigger(triggername); - } - - // Whether the control should be 'selected'. - protected bool IsHighlighted(BaseEventData eventData) - { - if (!IsActive()) - return false; - - if (IsPressed()) - return false; - - bool selected = hasSelection; - if (eventData is PointerEventData) - { - var pointerData = eventData as PointerEventData; - selected |= - (isPointerDown && !isPointerInside && pointerData.pointerPress == gameObject) // This object pressed, but pointer moved off - || (!isPointerDown && isPointerInside && pointerData.pointerPress == gameObject) // This object pressed, but pointer released over (PointerUp event) - || (!isPointerDown && isPointerInside && pointerData.pointerPress == null); // Nothing pressed, but pointer is over - } - else - { - selected |= isPointerInside; - } - return selected; - } - - [Obsolete("Is Pressed no longer requires eventData", false)] - protected bool IsPressed(BaseEventData eventData) - { - return IsPressed(); - } - - // Whether the control should be pressed. - protected bool IsPressed() - { - if (!IsActive()) - return false; - - return isPointerInside && isPointerDown; - } - - // The current visual state of the control. - protected void UpdateSelectionState(BaseEventData eventData) - { - if (IsPressed()) - { - m_CurrentSelectionState = SelectionState.Pressed; - return; - } - - if (IsHighlighted(eventData)) - { - m_CurrentSelectionState = SelectionState.Highlighted; - return; - } - - m_CurrentSelectionState = SelectionState.Normal; - } - - // Change the button to the correct state - private void EvaluateAndTransitionToSelectionState(BaseEventData eventData) - { - if (!IsActive() || !IsInteractable()) - return; - - UpdateSelectionState(eventData); - InternalEvaluateAndTransitionToSelectionState(false); - } - - private void InternalEvaluateAndTransitionToSelectionState(bool instant) - { - var transitionState = m_CurrentSelectionState; - if (IsActive() && !IsInteractable()) - transitionState = SelectionState.Disabled; - DoStateTransition(transitionState, instant); - } - - public virtual void OnPointerDown(PointerEventData eventData) - { - if (eventData.button != PointerEventData.InputButton.Left) - return; - - // Selection tracking - if (IsInteractable() && navigation.mode != Navigation.Mode.None && EventSystem.current != null) - EventSystem.current.SetSelectedGameObject(gameObject, eventData); - - isPointerDown = true; - EvaluateAndTransitionToSelectionState(eventData); - } - - public virtual void OnPointerUp(PointerEventData eventData) - { - if (eventData.button != PointerEventData.InputButton.Left) - return; - - isPointerDown = false; - EvaluateAndTransitionToSelectionState(eventData); - } - - public virtual void OnPointerEnter(PointerEventData eventData) - { - isPointerInside = true; - EvaluateAndTransitionToSelectionState(eventData); - } - - public virtual void OnPointerExit(PointerEventData eventData) - { - isPointerInside = false; - EvaluateAndTransitionToSelectionState(eventData); - } - - public virtual void OnSelect(BaseEventData eventData) - { - hasSelection = true; - EvaluateAndTransitionToSelectionState(eventData); - } - - public virtual void OnDeselect(BaseEventData eventData) - { - hasSelection = false; - EvaluateAndTransitionToSelectionState(eventData); - } - - public virtual void Select() - { - if (EventSystem.current == null || EventSystem.current.alreadySelecting) - return; - - EventSystem.current.SetSelectedGameObject(gameObject); - } - } -} |