• 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; //回复图片
        }
    }
  • 相关阅读:
    vue typescript 父子组件间值的传递
    flex 布局列表自动换行
    css文字两端对齐
    webstorm windows 常用快捷键
    vue elmentUi el-scrollbar 美化滚动条样式
    简述在Vue脚手架中,组件以及父子组件(非父子组件)之间的传值
    简述Vue的实例属性、实例方法
    Js基本类型中常用的方法总结
    简述Vue中的过滤器
    简述Vue中的计算属性
  • 原文地址:https://www.cnblogs.com/Study088/p/7953780.html
Copyright © 2020-2023  润新知