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

unity实现背包拖拽排序

在原本的滑动列表上层创建一个相同的dragParentRect层,用来在拖拽时将GameObject置顶,创建一个空白的空物体用来占位,_parentRect就是滑动列表的Content。

using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class EntryNodeGo : MonoBehaviour,IBeginDragHandler, IDragHandler, IEndDragHandler
{public TMP_Text msg;public Button editBtn;public Button deleteBtn;public GameObject blank;private int _id;private int _index;private Vector2 _dragOffset;private RectTransform _rectTransform;private RectTransform _parentRect;private RectTransform _dragParentRect;private GameObject _blank;private Vector2 _cellSize;private Vector2 _spacing;private RectOffset _padding;private const int HorizontalCount = 4;private void Start(){_rectTransform = transform as RectTransform;_parentRect = transform.parent as RectTransform;GridLayoutGroup gridLayoutGroup = _parentRect.GetComponent<GridLayoutGroup>();_padding = gridLayoutGroup.padding;_cellSize = gridLayoutGroup.cellSize;_spacing = gridLayoutGroup.spacing;}public void Init(int id, int index,RectTransform dragParentRect){_id = id;_index = index;_dragParentRect = dragParentRect;msg.text = $"Entry {_id} \nindex {_index}";}public void OnBeginDrag(PointerEventData eventData){if (eventData.button == PointerEventData.InputButton.Left){ExecuteEvents.ExecuteHierarchy(transform.parent.gameObject, eventData, ExecuteEvents.beginDragHandler);}else if (eventData.button == PointerEventData.InputButton.Right){_index = transform.GetSiblingIndex();RectTransformUtility.ScreenPointToLocalPointInRectangle(_dragParentRect, eventData.position, eventData.pressEventCamera, out var localPoint);_dragOffset = (Vector2)_rectTransform.localPosition - localPoint;_dragOffset.y += _parentRect.localPosition.y;transform.SetParent(_dragParentRect, true);_blank = Instantiate(blank,_parentRect);_blank.transform.SetSiblingIndex(_index);}}public void OnDrag(PointerEventData eventData){if (eventData.button == PointerEventData.InputButton.Left){ExecuteEvents.ExecuteHierarchy(transform.parent.gameObject, eventData, ExecuteEvents.dragHandler);}else if (eventData.button == PointerEventData.InputButton.Right){// 算出新的局部位置RectTransformUtility.ScreenPointToLocalPointInRectangle(_dragParentRect, eventData.position, eventData.pressEventCamera, out var localPoint);Vector2 newPos = localPoint + _dragOffset;// 限制在父物体矩形范围内Rect rect = _dragParentRect.rect;Vector3 min = rect.min;Vector3 max = rect.max;// 考虑子物体自身尺寸Vector2 halfSize = _rectTransform.rect.size * 0.5f;newPos.x = Mathf.Clamp(newPos.x, min.x + halfSize.x, max.x - halfSize.x);newPos.y = Mathf.Clamp(newPos.y, min.y + halfSize.y, max.y - halfSize.y);_rectTransform.localPosition = newPos;int horizontalIndex = (int)((newPos.x - _padding.left)/(_cellSize.x + _spacing.x));float y = Mathf.Abs(newPos.y) + _cellSize.y/2;int verticalIndex = Mathf.RoundToInt((y - _padding.top + _parentRect.localPosition.y)/(_cellSize.y + _spacing.y));verticalIndex = Mathf.Max(1, verticalIndex);_index = (verticalIndex - 1) * HorizontalCount + horizontalIndex;_blank.transform.SetSiblingIndex(_index);}}public void OnEndDrag(PointerEventData eventData){if (eventData.button == PointerEventData.InputButton.Left){ExecuteEvents.ExecuteHierarchy(transform.parent.gameObject, eventData, ExecuteEvents.endDragHandler);}else if (eventData.button == PointerEventData.InputButton.Right){Destroy(_blank);transform.SetParent(_parentRect, true);transform.SetSiblingIndex(_index);}}
}

滑动列表结构如下:

http://www.dtcms.com/a/337688.html

相关文章:

  • 1个月征服Java:零基础直达企业级开发——Java面向对象补充知识
  • 汽车近光灯难达标?OAS 软件精准解困
  • 【牛客刷题】正六边形阴影面积计算
  • 深入理解列式存储与向量化引擎
  • 无人机行业“黑话”
  • 10CL016YF484C8G Altera FPGA Cyclone
  • Qt第十讲-使用快捷键
  • Mybatis执行sql流程(一)
  • TP6用word文档导入数学公式
  • AI心理助手开发文档
  • [系统架构设计师]未来信息综合技术(十一)
  • Linux unistd.h 包含功能
  • 基于 Ansible 与 Jinja2 模板的 LNMP 环境及 WordPress 自动化部署实践
  • 【C语言】gets和getchar的区别
  • JVM 面试精选 20 题
  • 达梦数据库DCA通关宝典,数据库管理运维学习
  • Java面试题及答案整理(2025年互联网大厂最新版,持续更新)
  • 从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
  • 亲测可用 [安卓]《神秘来电》V1.1无需登入无广告离线打开即用手机模拟发起虚假来电免费版
  • HTTPS面试题(更新中...)
  • 【速通】深度学习模型调试系统化方法论:从问题定位到性能优化
  • Vivado Design Flow
  • 深度学习在订单簿分析与短期价格预测中的应用探索
  • Windows 安装使用 MySQL
  • 44 C++ STL模板库13-容器5-容器适配器-队列(queue)
  • 生鲜冷冻商城系统冷链配送系统功能模块实现
  • Stability AI技术浅析(三):Stable LM模型
  • 【集合框架Map进阶】
  • 【VUE】Vue3 绘制 3D 蓝图利器 Grid Plan
  • 【Java】浅谈ThreadLocal