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

Unity 背包系统中拖拽物体到指定位置或互换位置效果的实现

在Unity中,背包系统是一种常见的游戏系统,可以用于管理和展示玩家所持有的物品、道具或装备。

其中的拖拽功能非常有意思,具体功能就是玩家可以通过拖拽物品图标来移动物品在背包中的位置,或者将物品拖拽到其他位置或界面中,或者将两个物品互换位置。

具体是如何实现的呢?下面我们就来简单说说。

1、搭建个简单背包格子和物品:

请添加图片描述

2、核心部分,控制脚本:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;public class DragDropItem : MonoBehaviour, IBeginDragHandler, IPointerDownHandler, IDragHandler, IEndDragHandler
{private RectTransform rectTransform; // 图标的RectTransform组件private Canvas canvas; // Canvas组件,用于确定拖拽的缩放因子private Transform nowParent; //物体的目前父物体//private Vector2 originalPosition; // 图标的初始位置private bool isRaycastPass = true;//默认射线不能穿透物品void Start(){rectTransform = GetComponent<RectTransform>(); // 获取图标的RectTransform组件canvas = GetComponentInParent<Canvas>(); // 获取父级Canvas组件//originalPosition = rectTransform.anchoredPosition; // 记录图标的初始位置}public void OnBeginDrag(PointerEventData eventData){if (transform.GetComponent<Image>().raycastTarget) transform.GetComponent<Image>().raycastTarget = false;nowParent = transform.parent;  //nowparent为被拖拽物体的当前父物体        transform.SetParent(canvas.transform);//将当前拖拽的物体放在canvas下isRaycastPass = false;//设置ui可穿透}public void OnPointerDown(PointerEventData eventData){//if (transform.GetComponent<Image>().raycastTarget) transform.GetComponent<Image>().raycastTarget = false;//originalPosition = rectTransform.anchoredPosition; // 记录拖拽前的位置}public void OnDrag(PointerEventData eventData){rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor; // 根据鼠标移动更新图标位置}public void OnEndDrag(PointerEventData eventData){GameObject obj = eventData.pointerCurrentRaycast.gameObject;//获取到鼠标终点位置下的物体          if (obj != null){if (obj.tag == "selected"){// 检测到物体是指定的空格子,则把物体放到该格子下。transform.SetParent(obj.transform);transform.position = obj.transform.position; // 将图标移到放置位置                }else if(obj.tag == "weapon"){// 检测到格子已有物体,则物体替换位置。transform.SetParent(obj.transform.parent);transform.position = obj.transform.parent.position; obj.transform.SetParent(nowParent);obj.transform.position = nowParent.position;}else{transform.SetParent(nowParent);transform.position = nowParent.position; // 如果没有合法放置位置,将图标返回到初始位置}}else{transform.SetParent(nowParent);transform.position = nowParent.position; // 如果没有合法放置位置,将图标返回到初始位置}transform.GetComponent<Image>().raycastTarget = true;isRaycastPass = true;//设置ui不可穿透}}

3、把脚本赋予每一个物品

4、至此背包系统中拖拽物体到指定位置或互换位置的效果就实现了。

Unity 背包系统中拖拽物体到指定位置或互换位置效果的实现

http://www.lryc.cn/news/327305.html

相关文章:

  • iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图
  • 每周编辑精选|在线运行 Deepmoney 金融大模型、AI 偏好等多个优质数据集上线
  • C++多重继承与虚继承
  • 请简单介绍一下Shiro框架是什么?Shiro在Java安全领域的主要作用是什么?Shiro主要提供了哪些安全功能?
  • TouchGFX之Button
  • 计算机组成原理 — 指令系统
  • 使用easyYapi生成文档
  • 蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)
  • Elasticsearch(15) multi_match的使用
  • nodejs的线程模型和libuv库的基本使用
  • Uni-app/Vue/Js本地模糊查询,匹配所有字段includes和some方法结合使用e
  • 深度学习pytorch——激活函数损失函数(持续更新)
  • 《苹果 iOS 应用开发与分发的关键问题解析》
  • 爱上数据结构:顺序表和链表
  • python知识点总结(十)
  • 【Python】探索 Python 编程世界:常量、变量及数据类型解析
  • vue页面实现左右div宽度,上下div高度分割线手动拖动高度或者宽度自动变化,两个div宽度或者高度拉伸调节,实现左右可拖动改变宽度的div内容显示区
  • 知攻善防应急靶场-Linux(1)
  • ffmpeg命令行
  • VMware虚拟机更换引导顺序
  • RAFT:让大型语言模型更擅长特定领域的 RAG 任务
  • Stable Diffusion 本地训练端口与云端训练端口冲突解决办法
  • C++学习day1
  • openGauss CM
  • 北斗短报文+4G应急广播系统:实时监控 自动预警 保护校园安全的新力量
  • 2024河北石家庄矿业矿山展览会|河北智慧矿山展会|河北矿博会
  • ruoyi使用笔记
  • 论文《Exploring to Prompt for Vision-Language Models》阅读
  • 科普 | Runes 预挖矿概念
  • 蓝桥杯真题Day40 倒计时19天 纯练题!