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; //回复图片
    }
}
时间: 2024-08-29 13:21:10

unity中 UGUI的按下、拖动接口事件的实现的相关文章

在Unity中定义统一的对象搜索接口

我们经常要在Unity中以各种方式搜索对象.比如按名字搜索.按tag.layer或者是查找名字为xxx开头的对象. 本文是介绍以一种统一的接口来搜索对象. 1.定义统一的搜索接口 /// <summary> /// 游戏对象搜索接口 /// </summary> public interface IGameObjectFinder { /// <summary> /// 搜索 /// </summary> /// <param name="r

关于Unity中获得自己节点下的组件的简易方法

在一个节点下挂载一个脚本,脚本里面要使用自己节点下的其他组件 用法1 private Light light; void Start () { this.light=this.GetComponent<Light>(); this.light.....//已经可以使用了 } 用法2 public Light light;//然后把自己节点拖进这个公开的属性中,就是节点拖进自己挂的脚本的公开属性中 this.light.....//已经可以使用了

关于Unity中UGUI 图片实现拖拽功能

应用方法:将下面脚本挂载在需要拖拽功能的UI图片上即可 两种拖拽选择:A.中心拖拽(图片中心跟随鼠标位置)m_isPrecision为false: B.精准拖拽(图片被鼠标点击的位置跟随鼠标位置)m_isPrecision为true: 1 /************************************************* 2 * 项目名称:UGUI通用 3 * 脚本创建人:魔卡 4 * 脚本创建时间:2017.12.14 5 * 脚本功能:UI图片拖拽功能(将脚本挂载在需要拖放

Unity中uGUI的控件事件穿透逻辑

1.正常来说Image和Text是会拦截点击事件的,如果添加EventTrigger的话,就可以响应对应的交互事件. 2.如果Image和Text是一个Button的子控件,那么虽然其会显示在Button上面,但是并不会拦截点击事件.除非是Selectable的,否则子控件不会影响到父控件的点击. 3.如果是跨Panel或者是同级的Image和Text,是会拦截点击事件的,即如果Image在某个Button之上,那么点击Image的事件不会穿透给Button. 4.如果在3的情况下想忽略点击事件

Unity中Button按钮的触发监听事件

第一种方式:需要把自己添加的Button按钮属性(Inspector)中的(Button)onclick添加方法. public void BtnCreteClick() { Debug.Log("一切正常!!"); } 第二种方式:把自己添加的Button按钮拖到代码所在的物体下和不拖Button按钮的代码如下. //拖动Button按钮执行的代码如下 public  GameObject btnPrint; Button btn = btnPrint.GetComponent<

【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是吃鸡,唉!真是罪过罪过.希望能从这篇博客开始有些改善吧,尽量少玩耍,还是多学习吧~ 好了扯得有点远了,来说说我们今天博客的主题——“用C#和Lua实现Unity中的事件分发机制”,事件分发机制或者叫事件监听派发系统,在每个游戏框架中都是不可或缺的一个模块.我们可以用它来解耦,监听网络消息,或者做一些

Unity中2D和UGUI图集的理解与使用

图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢?准确的说法图集是一张包含了多个小图的大图和一份记录了每个小图id.位置.尺寸等数据的数据文件,一个图集应该对应两个文件,当然也有人把数据集成到图片中,导致看起来只有一张图片(参考自DragonBones的做法). 为什么要用图集? 在GPU已经成为PC.手机等设备的必备组件的现在,把所有显示的绘制操

关于Unity中的NGUI和UGUI

用Unity开发2D游戏,有三套关系 1.GUI:Unity本身的对象 2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装 3.UGUI:Unity5.X后,Unity找到NGUI的作者,开发了UGUI,变成内置于Unity中的包,官方主推 所有的元素都在Unity的UI工具栏 3D做2D游戏的方法: 1: 使用正交摄像机;2: 使用透视摄像机,将2D元素移动到合适的距离. 例如设计分辨率为 960x640, 得到在3D世界里面一个图片的大小w*h米,将这个图片移动到一定的距

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image 1 using UnityEngine; 2 using System.Collections; 3 using System.Threading; 4 using UnityEngine.UI; 5 6 public class CoroutineDemo : MonoBehaviour { 7 8 //