unity中 UGUI的按下、拖動接口事件的實現


using UnityEngine;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class testUI : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IDragHandler, IEndDragHandler,
    IPointerEnterHandler, IPointerExitHandler
{

    //private GraphicRaycaster graphicRaycaster;
    //private EventSystem eventSystem;
    //private RectTransform Image;

    public RectTransform canvas; //得到canvas的ugui坐標
    private RectTransform imgRect; //得到圖片的ugui坐標
    Vector2 offset = new Vector3(); //用來得到鼠標和圖片的差值
    Vector3 imgReduceScale = new Vector3(0.7f, 0.7f, 1); //設置圖片縮放
    Vector3 imgNormalScale = new Vector3(1, 1, 1); //正常大小
    void Start()
    {
        //graphicRaycaster = GameObject.Find("Canvas").GetComponent<GraphicRaycaster>();
        //eventSystem = GameObject.Find("EventSystem").GetComponent<EventSystem>();
        //Image = GameObject.Find("Canvas/Image").GetComponent<RectTransform>();
        //SetRectTransformSize(Image, new Vector2(2, 2));

        imgRect = GetComponent<RectTransform>();
    }

    // Update is called once per frame
    void Update()
    {
        //if (CheckGuiRaycastObjects()) return;
        //Debug.Log(EventSystem.current.gameObject.name);
        //if (Input.GetMouseButtonDown(0))
        //{
        //    if (EventSystem.current.IsPointerOverGameObject())
        //    {
        //        Debug.Log("當前觸摸在UI上");
        //        Debug.LogError(EventSystem.current.IsPointerOverGameObject());
        //    }

        //   else
        //       Debug.Log("當前沒有觸摸在UI上");  
        //}
    }

    bool CheckGuiRaycastObjects()
    {
        PointerEventData eventData = new PointerEventData(eventSystem);
        eventData.pressPosition = Input.mousePosition;
        eventData.position = Input.mousePosition;

        List<RaycastResult> list = new List<RaycastResult>();
        graphicRaycaster.GetComponent<GraphicRaycaster>().Raycast(eventData, list);
        Debug.Log(list.Count);
        return list.Count > 0;
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        //if (eventData.clickCount == 2)
        //{
        //    this.transform.DOScale(new Vector3(1.5f, 1.5f, 1.5f), 0.5f);
        //}
        //if (eventData.clickCount == 1)
        //{
        //    this.transform.DOScale(Vector3.one, 0.5f);
        //}
    }

    private void SetInsetAndSizeFromParentEdge(GameObject obj)
    {
        var rt = obj.gameObject.GetComponent<RectTransform>();
        rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 100);
        rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 30);
    }

    public static void SetRectTransformSize(RectTransform trans, Vector2 newSize)
    {
        Vector2 oldSize = trans.rect.size;
        Vector2 deltaSize = newSize - oldSize;
        trans.offsetMin = trans.offsetMin - new Vector2(deltaSize.x * trans.pivot.x, deltaSize.y * trans.pivot.y);
        trans.offsetMax = trans.offsetMax + new Vector2(deltaSize.x * (1f - trans.pivot.x), deltaSize.y * (1f - trans.pivot.y));
    }



    //當鼠標按下時調用 接口對應 IPointerDownHandler
    public void OnPointerDown(PointerEventData eventData)
    {
        Vector2 mouseDown = eventData.position; //記錄鼠標按下時的屏幕坐標
        Vector2 mouseUguiPos = new Vector2(); //定義一個接收返回的ugui坐標
        //RectTransformUtility.ScreenPointToLocalPointInRectangle():把屏幕坐標轉化成ugui坐標
        //canvas:坐標要轉換到哪一個物體上,這里img父類是Canvas,我們就用Canvas
        //eventData.enterEventCamera:這個事件是由哪個攝像機執行的
        //out mouseUguiPos:返回轉換后的ugui坐標
        //isRect:方法返回一個bool值,判斷鼠標按下的點是否在要轉換的物體上
        bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDown, eventData.enterEventCamera, out mouseUguiPos);
        if (isRect) //如果在
        {
            //計算圖片中心和鼠標點的差值
            offset = imgRect.anchoredPosition - mouseUguiPos;
        }
    }



    //當鼠標抬起時調用 對應接口 IPointerUpHandler
    public void OnPointerUp(PointerEventData eventData)
    {
        //offset = Vector2.zero;
    }
    //當鼠標拖動時調用 對應接口 IDragHandler
    public void OnDrag(PointerEventData eventData)
    {
        Vector2 mouseDrag = eventData.position; //當鼠標拖動時的屏幕坐標
        Vector2 uguiPos = new Vector2(); //用來接收轉換后的拖動坐標
        //和上面類似
        bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDrag, eventData.enterEventCamera, out uguiPos);

        if (isRect)
        {
            //設置圖片的ugui坐標與鼠標的ugui坐標保持不變
            imgRect.anchoredPosition = offset + uguiPos;
        }
    }
    //當鼠標結束拖動時調用 對應接口 IEndDragHandler
    public void OnEndDrag(PointerEventData eventData)
    {
        //offset = Vector2.zero;
    }
    //當鼠標進入圖片時調用 對應接口 IPointerEnterHandler
    public void OnPointerEnter(PointerEventData eventData)
    {
        //imgRect.localScale = imgReduceScale; //縮小圖片
    }
    //當鼠標退出圖片時調用 對應接口 IPointerExitHandler
    public void OnPointerExit(PointerEventData eventData)
    {
        //imgRect.localScale = imgNormalScale; //回復圖片
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM