当前位置: 首页 > 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.lryc.cn/news/624586.html

相关文章:

  • 【机器人-基础知识】ROS2常用命令
  • 第一阶段C#基础-15:面向对象梳理
  • 论往返之迴响:时间之织锦与信息之曼舞
  • 第三十二天(并发)
  • 如何在VS Code中使用Copilot与MCP服务器增强开发体验
  • 【C++】 using声明 与 using指示
  • 云原生Ansible渗透场景(⾃动化的运维⼯具)
  • Netty架构与组成
  • 45 C++ STL模板库14-容器6-容器适配器-优先队列(priority_queue)
  • 贪心算法(Greedy Algorithm)详解
  • 【C语言】gets和getchar的区别
  • 深度优先遍历dfs(模板)
  • 具身智能2硬件架构(人形机器人)摘自Openloong社区
  • 数据结构:查找表
  • 宏观认识 Unitree LiDAR L1 及其在自动驾驶中的应用
  • 【opencv-Python学习日记(7):图像平滑处理】
  • 阿里云odps和dataworks的区别
  • Poisson分布:稀有事件建模的理论基石与演进
  • 前端纯JS实现手绘地图 地图导引
  • YAML 语法结构速查表(完整版)
  • 【tips】unsafe-eval线上页面突然空白
  • Lucene 8.5.0 的 `.pos` 文件**逻辑结构**
  • 永磁同步电机控制算法--转速环电流环超螺旋滑模控制器STASMC
  • 大数据毕业设计选题推荐:基于Hadoop+Spark的城镇居民食品消费分析系统源码
  • 【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
  • 将 iPhone 联系人转移到 Infinix 的完整指南
  • Zephyr下ESP32S3开发环境搭建(Linux篇)
  • 【Python语法基础学习笔记】常量变量运算符函数
  • 分布式系统的“不可能三角”:CAP定理深度解析
  • flask——4:请求与响应