zoukankan      html  css  js  c++  java
  • 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; //回复图片
        }
    }
  • 相关阅读:
    新浪推出开放云计算平台Sina App Engine
    摄像机标定
    Qt开发环境大全
    [转]卡尔曼滤波器
    Qt Creator:跨平台 IDE
    建立交叉编译的Qt/Embeded开发环境
    Linux mmap
    QtCreator在不同平台开发的程序的运行
    粒子滤波概述
    13、几点小结,unsigned long long
  • 原文地址:https://www.cnblogs.com/Study088/p/7953780.html
Copyright © 2011-2022 走看看