|  |  |  | 
|---|
|  |  |  | using UnityEngine.EventSystems; | 
|---|
|  |  |  | using System; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | namespace vnxbqy.UI | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public class PressTip : MonoBehaviour, IPointerDownHandler, IPointerUpHandler | 
|---|
|  |  |  | { | 
|---|
|  |  |  | [SerializeField] GameObject m_Container; | 
|---|
|  |  |  | [SerializeField] float m_Delay = 0f; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public class PressTip : MonoBehaviour, IPointerDownHandler, IPointerUpHandler | 
|---|
|  |  |  | float timer = 0f; | 
|---|
|  |  |  | PointerState pointerState = PointerState.Up; | 
|---|
|  |  |  | bool triggered = false; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void OnEnable() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | [SerializeField] GameObject m_Container; | 
|---|
|  |  |  | [SerializeField] float m_Delay = 0f; | 
|---|
|  |  |  | this.pointerState = PointerState.Up; | 
|---|
|  |  |  | this.m_Container.SetActive(false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | float timer = 0f; | 
|---|
|  |  |  | PointerState pointerState = PointerState.Up; | 
|---|
|  |  |  | bool triggered = false; | 
|---|
|  |  |  | private void OnDisable() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.pointerState = PointerState.Up; | 
|---|
|  |  |  | this.m_Container.SetActive(false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void OnEnable() | 
|---|
|  |  |  | public virtual void OnPointerDown(PointerEventData eventData) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.pointerState = PointerState.Down; | 
|---|
|  |  |  | this.timer = 0f; | 
|---|
|  |  |  | triggered = false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public virtual void OnPointerUp(PointerEventData eventData) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.pointerState = PointerState.Up; | 
|---|
|  |  |  | this.m_Container.SetActive(false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void LateUpdate() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (this.pointerState != PointerState.Down) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.pointerState = PointerState.Up; | 
|---|
|  |  |  | this.m_Container.SetActive(false); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void OnDisable() | 
|---|
|  |  |  | this.timer += Time.deltaTime; | 
|---|
|  |  |  | if (this.timer > this.m_Delay && !triggered) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.pointerState = PointerState.Up; | 
|---|
|  |  |  | this.m_Container.SetActive(false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | triggered = true; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public virtual void OnPointerDown(PointerEventData eventData) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.pointerState = PointerState.Down; | 
|---|
|  |  |  | this.timer = 0f; | 
|---|
|  |  |  | triggered = false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public virtual void OnPointerUp(PointerEventData eventData) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.pointerState = PointerState.Up; | 
|---|
|  |  |  | this.m_Container.SetActive(false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void LateUpdate() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (this.pointerState != PointerState.Down) | 
|---|
|  |  |  | if (this.m_Container != null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | this.m_Container.SetActive(true); | 
|---|
|  |  |  | AdjustmentContainerPosition(this.m_Container.transform as RectTransform); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | this.timer += Time.deltaTime; | 
|---|
|  |  |  | if (this.timer > this.m_Delay && !triggered) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | triggered = true; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (this.m_Container != null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.m_Container.SetActive(true); | 
|---|
|  |  |  | AdjustmentContainerPosition(this.m_Container.transform as RectTransform); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | void AdjustmentContainerPosition(RectTransform _container) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (_container == null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | var viewPortPoint = CameraManager.uiCamera.ScreenToViewportPoint(Input.mousePosition); | 
|---|
|  |  |  | var normalizedOffset = CalculateNormalizedOffset(_container); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | var containerSize = new Vector2(_container.rect.width, _container.rect.height); | 
|---|
|  |  |  | var xOffset = viewPortPoint.x < normalizedOffset.x ? 1 : viewPortPoint.x > (1 - normalizedOffset.x) ? -1 : 0; | 
|---|
|  |  |  | var yOffset = viewPortPoint.y > (1 - normalizedOffset.y * 2) ? -1 : xOffset != 0 ? 0 : 1; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | var uiposition = CameraManager.uiCamera.ViewportToWorldPoint(viewPortPoint); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | _container.position = uiposition.SetZ(0); | 
|---|
|  |  |  | _container.localPosition += new Vector3(xOffset * containerSize.x * 0.5f, yOffset * containerSize.y * 0.5f, -_container.localPosition.z); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Vector2 CalculateNormalizedOffset(RectTransform _rectTransform) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | var offsetX = _rectTransform.rect.width / Constants.DESIGN_RESOLUTION.x * 0.5f; | 
|---|
|  |  |  | var offsetY = _rectTransform.rect.height / Constants.DESIGN_RESOLUTION.y * 0.5f; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return new Vector2(offsetX, offsetY); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | enum PointerState | 
|---|
|  |  |  | { | 
|---|
|  |  |  | Down, | 
|---|
|  |  |  | Up | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | void AdjustmentContainerPosition(RectTransform _container) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (_container == null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | var viewPortPoint = CameraManager.uiCamera.ScreenToViewportPoint(Input.mousePosition); | 
|---|
|  |  |  | var normalizedOffset = CalculateNormalizedOffset(_container); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | var containerSize = new Vector2(_container.rect.width, _container.rect.height); | 
|---|
|  |  |  | var xOffset = viewPortPoint.x < normalizedOffset.x ? 1 : viewPortPoint.x > (1 - normalizedOffset.x) ? -1 : 0; | 
|---|
|  |  |  | var yOffset = viewPortPoint.y > (1 - normalizedOffset.y * 2) ? -1 : xOffset != 0 ? 0 : 1; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | var uiposition = CameraManager.uiCamera.ViewportToWorldPoint(viewPortPoint); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | _container.position = uiposition.SetZ(0); | 
|---|
|  |  |  | _container.localPosition += new Vector3(xOffset * containerSize.x * 0.5f, yOffset * containerSize.y * 0.5f, -_container.localPosition.z); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Vector2 CalculateNormalizedOffset(RectTransform _rectTransform) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | var offsetX = _rectTransform.rect.width / Constants.DESIGN_RESOLUTION.x * 0.5f; | 
|---|
|  |  |  | var offsetY = _rectTransform.rect.height / Constants.DESIGN_RESOLUTION.y * 0.5f; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return new Vector2(offsetX, offsetY); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | enum PointerState | 
|---|
|  |  |  | { | 
|---|
|  |  |  | Down, | 
|---|
|  |  |  | Up | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|