当前位置: 首页 > news >正文

【UGUI】Unity教程:实现物品的拖拽功能

大家好,今天,我们将一起学习如何在Unity中实现物品的拖拽功能。这是一个非常实用的技能,无论你是在制作RPG游戏的背包系统,还是在制作策略游戏的建筑放置功能,都会用到这个技能。那么,让我们开始吧!

一、需求描述

在这个任务中,我们将使用Unity的UGUI系统和事件系统来实现一个物品的拖拽功能。我们将为物品创建一个脚本,该脚本需要实现IDragHandlerIBeginDragHandlerIEndDragHandler接口。这些接口分别对应于开始拖拽、拖拽进行中和结束拖拽这三个阶段。

二、详细步骤

1. 创建脚本

首先,我们需要为物品创建一个新的脚本,命名为DraggableItem

2. 实现接口

DraggableItem脚本中,我们需要实现IDragHandlerIBeginDragHandlerIEndDragHandler接口。你可以参考以下的代码示例:

using UnityEngine;
using UnityEngine.EventSystems;public class DraggableItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{private Vector3 originalPosition;public void OnBeginDrag(PointerEventData eventData){// 记录开始拖拽时的原始位置originalPosition = transform.position;}public void OnDrag(PointerEventData eventData){// 更新物品的位置,使其跟随鼠标移动transform.position = Input.mousePosition;}public void OnEndDrag(PointerEventData eventData){// 结束拖拽时,可以选择让物品回到原始位置,或者放置在新的位置transform.position = originalPosition;}
}

3. 挂脚本

接下来,我们需要将DraggableItem脚本附加到物品上,并确保物品有一个RectTransform组件和一个CanvasGroup组件。RectTransform组件用于在UI中定位物品CanvasGroup组件则用于在拖拽过程中控制物品的显示。

三、测试

完成以上步骤后,你应该能够在游戏中拖拽你的物品。你可以尝试拖拽你的物品,看看它是否能够跟随你的鼠标移动。

四、扩展任务

如果你已经完成了基本任务,你可以尝试进行以下的扩展任务:

  • OnEndDrag方法中添加代码,实现将物品放置到新的位置的功能。
  • 实现一个功能,可以检测物品是否被拖拽到了一个有效的放置位置。

通过完成这个实训任务,你将能够掌握Unity的UGUI系统和事件系统的基本使用,以及如何使用这些系统来实现物品的拖拽功能。希望这个实训任务能够帮助你在Unity游戏开发的道路上更进一步!

附件实例代码:

把下面代码拖到对应的物体身上即可!还创建了一个文本用来显示交互状态!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using TMPro;public class EventsystemPoint : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler, IBeginDragHandler, IDragHandler, IEndDragHandler
{GameObject ONETextobj;TextMeshProUGUI TmptextComp;Quaternion Oringlerotation;Vector3 OrianglePos;private void Start(){ONETextobj = GameObject.Find("EventName");TmptextComp = ONETextobj.GetComponent<TextMeshProUGUI>();Debug.Log(TmptextComp.name);OrianglePos = this.transform.position;//记录被拖拽物体原本坐标,拖拽结束后返回这个位置Oringlerotation = this.transform.rotation;//记录被拖拽物体原本旋转}public void OnPointerEnter(PointerEventData eventData){TmptextComp.text = "指针滑入了";Debug.Log("指针滑入了");this.transform.rotation = Quaternion.Euler(0, 30, 0);}public void OnPointerExit(PointerEventData eventData){TmptextComp.text = "指针滑出了";Debug.Log("指针滑出了");this.transform.rotation = Oringlerotation;}public void OnPointerClick(PointerEventData eventData){TmptextComp.text = "指针点击了";Debug.Log("指针点击了");}public void OnBeginDrag(PointerEventData eventData){TmptextComp.text = "拖拽开始";Debug.Log("拖拽开始");this.transform.position = Input.mousePosition;}public void OnDrag(PointerEventData eventData){TmptextComp.text = "拖拽...";Debug.Log("拖拽...ing");this.transform.position = Input.mousePosition;//让物体当前坐标跟随鼠标坐标一起移动实现拖拽}public void OnEndDrag(PointerEventData eventData){this.transform.position = OrianglePos;//拖拽结束,让物体回到起始位置的坐标}
}

相关文章:

  • SpringBoot+mysql+vue实现大学生健康档案管理系统前后端分离
  • MySQL数据库的备份与恢复
  • 腾讯云手动下发指令到设备-用于设备调试
  • 全栈冲刺 之 一天速成MySQL
  • 知乎禁止转载的回答怎么复制做笔记?
  • 恒驰服务 | 华为云云上运维服务offering
  • 近期知识点随笔
  • 【Java】使用IntelliJ IDEA搭建SSM(MyBatis-Plus)框架并连接MySQL数据库
  • 【Git】修改提交信息(单次、批量)
  • ChatGPT等模型:到2026年,将消耗尽高质量训练数据
  • SQL数据迁移实战:从产品层级信息到AB测试表
  • 时序预测 | Python实现TCN时间卷积神经网络价格预测
  • 数据爬取+数据可视化实战_哪里只得我共你(Dear Jane)_词云展示----网易云
  • 关于电脑提示vcruntime140_1.dll无法继续执行代码的解决办法
  • MySQL在Docker容器中的性能损失分析与优化策略
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 08.Android之View事件问题
  • Bytom交易说明(账户管理模式)
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • IDEA 插件开发入门教程
  • js作用域和this的理解
  • VuePress 静态网站生成
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 工程优化暨babel升级小记
  • 类orAPI - 收藏集 - 掘金
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端
  • 网页视频流m3u8/ts视频下载
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 译自由幺半群
  • AI算硅基生命吗,为什么?
  • ​​​​​​​​​​​​​​Γ函数
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #单片机(TB6600驱动42步进电机)
  • $().each和$.each的区别
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)MFC+openGL单文档框架glFrame
  • (31)对象的克隆
  • (附源码)springboot教学评价 毕业设计 641310
  • (四)Linux Shell编程——输入输出重定向
  • (算法二)滑动窗口
  • .form文件_SSM框架文件上传篇
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Micro Framework初体验(二)
  • .Net MVC + EF搭建学生管理系统
  • .NET 回调、接口回调、 委托
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET基础篇——反射的奥妙
  • .stream().map与.stream().flatMap的使用
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /etc/fstab 只读无法修改的解决办法
  • /etc/motd and /etc/issue
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • :中兴通讯为何成功
  • @Autowired 与@Resource的区别