Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)

news2024/9/24 11:21:44


目录

内置方法OnMouseDrag【对象含有Collider组件】

配对小游戏

Event Trigger组件

接口

窗口小案例


内置方法OnMouseDrag【对象含有Collider组件】

OnMOuseOver()检测鼠标是否进入到这个2D贴图

当鼠标进入或离开2D贴图,会相应的放大、缩小

private void OnMouseEnter()

    {

        transform.localScale += Vector3.one * 0.1f;

    }

    private void OnMouseExit()

    {

        transform.localScale -= Vector3.one * 0.1f;

}

经验:只会在2D场景贴图和3D场景中使用OnMouseDrag等内置方法

配对小游戏

 

​
private bool isFinished;//是否拖到了正确位置

    [SerializeField] private Transform correctTrans;

    private Vector2 startPos;

    // Start is called before the first frame update

    void Start()

    {

        startPos = transform.position;

}

//如果没有拖拽到正确位置,图片在松开鼠标的时候,回到一开始位置

    private void OnMouseDrag()

    {

        if(isFinished==false)

        {//图片跟着鼠标一起移动

            Vector2 cursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);



 

            transform.position = new Vector2(cursorPos.x, cursorPos.y);

        }

    }

    private void OnMouseUp()

    {

  //如果当前拖得图片和对应正确位置足够小,就让当前图片固定到正确位置,否则回到原来位置       if(Mathf.Abs(transform.position.x-correctTrans.position.x)<=0.5f&&Mathf.Abs(transform.position.y-correctTrans.position.y)<=0.5f)

        {

            transform.position = correctTrans.position;

            isFinished = true;

        }

        else

        {

            transform.position = new Vector2(startPos.x, startPos.y);

        }

}

​

调整Sorting Layer渲染层顺序

Event Trigger组件

Event Trigger—>Add New Event Type根据不同的事件类型实现不同的交互效果

 

private Vector3 startPos;

    void Start()

    {

        startPos = transform.position;

    }

    public void DragMethod()

    {

        transform.position = Input.mousePosition;

        //如果UI模式是ScreenSpace Overlay,可以直接将鼠标位置信息赋值给transform.position

    }

    public void EndDragMethod()

    {

        GameObject slotGo = GameObject.Find("Slot");

        //在所有游戏对象中通过名字查找

        float dist = Vector3.Distance(transform.position, slotGo.transform.position);

        if (dist <= 100)

            transform.position = slotGo.transform.position;

        else

            transform.position = startPos;

    }

接口

引用 using UnityEngine.EventSystems命名空间

接口中方法没有方法体的,接口的成员,也都是(隐式的)public公共类

使用这个接口必须将接口中未实现的方法加以实现

有关Drag的接口,BeginDrag,EndDrag,IDrag

BeginDrag和EndDrag要在有IDrag的基础上

public class Move : MonoBehaviour,IBeginDragHandler,IEndDragHandler,IDragHandler

{

    private RectTransform rectTrans;

    private CanvasGroup canvasGroup;

    void Start()

    {

        rectTrans = GetComponent<RectTransform>();

        canvasGroup = GetComponent<CanvasGroup>();

    }

    public void OnDrag(PointerEventData eventData)

    {

        rectTrans.anchoredPosition += eventData.delta;

        //获取这个UI图片相对于Anchor锚点的位置坐标信息

        //eventData.delta自从上一次Update,用户拖着这个对象所移动的2D位置坐标信息      

    }

    public void OnBeginDrag(PointerEventData eventData)

    {

        canvasGroup.blocksRaycasts = false;

        canvasGroup.alpha = 0.5f;

    }

    public void OnEndDrag(PointerEventData eventData)

    {

        canvasGroup.blocksRaycasts = true;

        canvasGroup.alpha = 1f;

    }

表示在刚开始拖拽的整个过程中,鼠标不会在去把这个UI物体当作阻挡物,

保证拖拽物品到槽的上方时,鼠标能顺利的去忽略这个UI物体

}

Canvas Group组件  管理这一物体包括它的子物体的所有UI对象(透明度,可交互,是否遮挡等属性)

鼠标只有放在槽上方的时候松开,才能判断拖拽的物体在槽内还是槽外

,IDrapHander 在松开物品后被调用,若没有调用,槽被上一层所拖拽的UI对象所遮罩了,无法获取到鼠标何时松开Drop的操作

public class Slot : MonoBehaviour,IDropHandler

{

    public void OnDrop(PointerEventData eventData)

    {

        eventData.pointerDrag.GetComponent<RectTransform>().anchoredPosition = GetComponent<RectTransform>().anchoredPosition;

    }    

}

eventData.pointerDrag直接获取鼠标当前拖拽的这个游戏对象

若鼠标和拖拽的点的位置偏离过大

,去检查Canvas画布中Scale数值是否为1

窗口小案例

通过接口实现针对不同的UI面板窗口,进行拖拽的功能,并且点击的窗口会显示在UI的最高层

 

public class Anli : MonoBehaviour,IBeginDragHandler,IDragHandler

{

    public RectTransform panelRectTrans;

    public void OnBeginDrag(PointerEventData eventData)

    {

        panelRectTrans.SetAsLastSibling();

        //设置为同级最下方的位置

    }

    public void OnDrag(PointerEventData eventData)

    {

        panelRectTrans.anchoredPosition += eventData.delta;

    }

}

【盘点】Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)_哔哩哔哩_bilibili

【仅当学习笔记,若有冒犯,必删】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计springboot校园快递柜存取件系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

山外山通过注册:拟募资12亿 大健康与华盖信诚是股东

雷递网 雷建平 12月2日重庆山外山血液净化技术股份有限公司&#xff08;简称&#xff1a;“山外山”&#xff09;日前通过注册&#xff0c;准备在科创板上市。山外山计划募资12.47亿元&#xff0c;其中&#xff0c;8.63亿用于血液净化设备及高值耗材产业化项目&#xff0c;1.64…

【Python基础系列】Part2. 列表

二、列表 1.列表介绍 定义&#xff1a;列表是由一系列按照一定顺序排列的元素组成。 Python中用[]表示列表&#xff0c;用,分割元素。 number ["one", "two", "three"] print(number)# [one, two, three]列表中的元素可以是不同类型 numbe…

netsh interface portproxy端口转发,从本地端口到本地端口不起作用的解决办法

开启IP V6 你虽然可能用不到IPV6,但是有些系统是需要用到IPV6的dll来做端口转发的. 如图,确保你联网的连接已经开启 IPV6 检查IP Helper服务 打开任务管理器 点击 服务 查看iphlpsvc是否启动状态,点击右键如果显示的是停止,就是已经启动了. 如果显示"启动服务"则…

drools规则引擎并发结果不准确问题记录

思路 首先&#xff0c;drools的整体思路比较简单&#xff0c;一个是加载&#xff0c;一个是执行&#xff01; 加载&#xff1a;把一个比较复杂的关系运算想办法放到drools里面&#xff01; 执行&#xff1a;让drools去计算这个复杂的运算&#xff0c;最终我们只需要取结果就好&…

广域网技术——SR-MPLS技术基础理论讲解

目录 SR-MPLS基础概念 使用Segment Routeing MPLS技术的优点 Segment Routeing MPLS的基本原理 SRGB Segment ID Bind SID 粘连标签 OSPF对于SR-MPLS的扩展 OSPF对邻接SID做了细分 10类LSA定义的TLV类型 10类LSA定义的TLV的报文格式 ISIS对SR-MPLS的扩展…

详解设计模式:模版方法模式

模板方法模式&#xff08;Template Method Pattern&#xff09;也被称为模板模式&#xff08;Template Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 模板方法模式 定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使…

若依框架RuoYi项目运行启动教程【傻瓜式教程】

启动若依项目 1.官网下载代码 若依官网 若依在线文档 首先去官网下载代码 链接到码云下载&#xff0c;要么用git下载要么压缩包下载。 然后再IDEA打开项目 想要运行就要搭建好环境 2.搭建若依环境 按照文档要求配置环境 JDK > 1.8 (推荐1.8版本) Mysql > 5.7.0 (推…

Stable Diffusion 2.0 来了

Stable Diffusion 一经发布&#xff0c;就立刻在业界掀起巨大的波浪。我个人后知后觉&#xff0c;直到 Stable Diffusion V1.4 版本发布&#xff0c;才接触 Stable Diffusion (之前使用的是 Disco Diffusion)。这段时间&#xff0c;SD 团队也没闲着&#xff0c;很快就发布了 V2…

【华为上机真题 2022】停车场车辆统计

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

【Python】推荐三个好玩的图像处理库

1. 引言 Python是一门高级语言&#xff0c;它可以实现很多功能。Python强大的原因是什么&#xff1f;某种程度上&#xff0c;在于它所拥有的现成的库&#xff0c;使其在编程的各个方向上都易于使用。在本文中&#xff0c;我将向大家展示一些Python库&#xff0c;这些库非常有用…

node.js的模块化

目录 一、模块化的概念 1.什么是模块化 2.编程领域中的模块化 二、node.js中模块的分类 三、require() 加载模块 四. 模块作用域 五、module对象 六、module.exports对象 七、exports对象 八、CommonJS规定: 九、关于包&#xff08;第三方模块&#xff09; 十、解决…

阿里P8高级专家,耗时多年整理SpringBoot指南文档

前言 相信程序员们已经看过甚至动手操作过很多的springboot项目&#xff0c;在项目操作中需要各种插件的支持&#xff0c;其实&#xff0c;可能还有很多大家不知道的但是很方便的操作&#xff0c;小编今天就给大家把这份PDF分享出来&#xff0c;绝对是你以前没有见到过的。 1、…

springboot读取yml文件中的list列表、数组、map集合和对象

前言 springboot配置文件yml类型简单的风格&#xff0c;十分受大家的欢迎&#xff0c;支持字符string类型&#xff0c;支持列表list类型&#xff0c;支持集合map类型&#xff0c;支持数组array类型&#xff0c;支持类对象类型&#xff0c;下面我们来实战下这些形式的配置如何取…

聚观早报 | 国美电器被申请破产清算;首款太阳能汽车投入生产

今日要闻&#xff1a;网传国美电器被申请破产清算&#xff1b;全球首款太阳能汽车投入生产&#xff1b;苹果头显配套系统已改名为xrOS&#xff1b;马斯克计划植入脑机接口设备&#xff1b;特斯拉即将推出自动驾驶出租车网传国美电器被申请破产清算 12 月 2 日消息&#xff0c;据…

网站都变成灰色,有哪些方法可以快速实现?

有些时候我们需要把网站页面变成黑白色或灰色&#xff0c;特别是对于一些需要悼念的日子&#xff0c;以及一些影响力很大的伟人逝世或纪念日的时候&#xff0c;都会让网站的全部网页变成灰色&#xff08;黑白色&#xff09;&#xff0c;以表示我们对逝者或者英雄的缅怀和悼念。…

在校大学生如何申请软著,手把手教会你(内有免费模板)

目录 一.前言 二.以学校为单位全流程申请&#xff08;以我的学校为例&#xff09; 1.问问导员谁负责管软著申请这块的&#xff0c;联系他&#xff0c;问需要什么。 2.为了防止学生买软著转头申请 3.按以下要求准备材料 4.没问题就发给老师&#xff0c;一般要破费一下 5.…

View基础知识-位置大小和滑动

前言 这篇文章可以作为基础看看&#xff0c;但是有时候基础就是细节&#xff0c;不一定所有人都记得&#xff0c;所以基础也要记录一下。都熟悉的话也可以看看其他系列文章&#xff1a; View事件分发机制&#xff08;源码分析篇&#xff09; Android一步一步追踪View的工作原…

【车辆动力】基于Matlab模拟停车动力学

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Python 音频处理以及可视化 Amplitude,MFCC,Mel Spectrogram, librosa 库

利用python库 librosa库对于音频文件进行预处理&#xff0c;以及可视化操作。 1. Load Audio Data 导入音频 将音频文件&#xff08;这里使用苹果录音文件 .m4a 格式&#xff09;导入librosa&#xff0c;音频格式可以为其它&#xff08;甚至视频文件mp4也是可以的&#xff09…