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 
 | 
    } 
 | 
  
 | 
} 
 |