using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; using System; public class PressTip : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { [SerializeField] GameObject m_Container; [SerializeField] float m_Delay = 0f; float timer = 0f; PointerState pointerState = PointerState.Up; bool triggered = false; private void OnEnable() { this.pointerState = PointerState.Up; this.m_Container.SetActive(false); } private void OnDisable() { this.pointerState = PointerState.Up; this.m_Container.SetActive(false); } 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) { return; } 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 } }