unity中通过拖拽,自定义scroll view中子物体顺序

1.在每个content的子物体上挂载DragHandler脚本,并且添加Canvs Group组件,设置见图

2.DragHandler脚本内容:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using System.Collections;public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{private RectTransform rectTransform;private Canvas canvas;private Transform parentTransform;private Vector2 startPosition;private int startSiblingIndex;private bool isDragging = false;private CanvasGroup canvasGroup;private int newIndex;private int top;//content的顶端间距private float spacing;//content的子物体的spacingprivate float height;//子物体的高度void Awake(){rectTransform = GetComponent<RectTransform>();height = rectTransform.sizeDelta.y;canvas = GetComponentInParent<Canvas>();parentTransform = transform.parent;VerticalLayoutGroup layout = parentTransform.GetComponent<VerticalLayoutGroup>();top = layout.padding.top;spacing = layout.spacing;// 获取或添加 CanvasGroup 组件canvasGroup = GetComponent<CanvasGroup>();if (canvasGroup == null){canvasGroup = gameObject.AddComponent<CanvasGroup>();}}public void OnBeginDrag(PointerEventData eventData){if (eventData.button != PointerEventData.InputButton.Left) return;// 记录初始位置和索引startPosition = rectTransform.anchoredPosition;startSiblingIndex = transform.GetSiblingIndex();Debug.Log($"开始拖拽时:startSiblingIndex={startSiblingIndex}");// 禁用射线阻挡canvasGroup.blocksRaycasts = false;isDragging = true;}public void OnDrag(PointerEventData eventData){if (!isDragging) return;// 更新位置(跟随鼠标)Vector2 localPoint;RectTransformUtility.ScreenPointToLocalPointInRectangle(parentTransform as RectTransform,eventData.position,canvas.worldCamera,out localPoint);rectTransform.anchoredPosition = new Vector2(startPosition.x, localPoint.y);// 直接更新顺序(不使用占位符)UpdateSortOrder();}public void OnEndDrag(PointerEventData eventData){if (!isDragging) return;isDragging = false;// 恢复射线阻挡canvasGroup.blocksRaycasts = true;//标准化最终位置if(newIndex == 0){rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x, -(top+ height/2));}else{RectTransform preChildTrec = parentTransform.GetChild(newIndex - 1)?.GetComponent<RectTransform>();rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x, preChildTrec.anchoredPosition.y - (spacing+height));}}// 直接更新排序顺序private void UpdateSortOrder(){newIndex = startSiblingIndex;// 计算当前拖拽物体在父物体局部空间中的位置Vector2 currentPos = rectTransform.anchoredPosition;Debug.Log($"自己的y:{currentPos.y}");// 遍历所有兄弟物体,找到合适的位置for (int i = 0; i < parentTransform.childCount; i++){// 跳过自己if (parentTransform.GetChild(i) == transform) continue;RectTransform sibling = parentTransform.GetChild(i)?.GetComponent<RectTransform>();if (sibling != null){Debug.Log($"子物体的名字:{sibling.name},y:{sibling.anchoredPosition.y}");// 简单的基于Y坐标的位置判断if (currentPos.y > sibling.anchoredPosition.y){newIndex = i;// 如果新索引大于当前索引,需要减1,因为自己不在列表中if (newIndex > transform.GetSiblingIndex()){newIndex--;}Debug.Log($"newIndex = {newIndex}");break;}}}// 确保索引在有效范围内newIndex = Mathf.Clamp(newIndex, 0, parentTransform.childCount - 1);// 更新自己的位置if (newIndex != transform.GetSiblingIndex()){transform.SetSiblingIndex(newIndex);}}
}

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

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

相关文章

用 Matplotlib 绘制饼图:从基础语法到实战美化,全面掌握分类数据可视化技巧

用 Matplotlib 绘制饼图:从基础语法到实战美化,全面掌握分类数据可视化技巧 在数据分析与可视化的世界里,**“图胜千言”**早已成为共识。而在众多图表类型中,饼图(Pie Chart)以其直观的比例展示方式,成为展示分类数据分布的常见选择。无论是业务报表、用户画像,还是市…

基础算法之二分算法 --- 2

大家好&#xff0c;不同的时间&#xff0c;相同的地点&#xff0c;时隔多日我们又见面了。继上次的二分算法后&#xff0c;我们这次要来学习的是二分答案了。这个部分相较于前面的二分算法难度有相当的提升&#xff0c;希望大家有所准备。虽然难度增加了&#xff0c;但是博主还…

发挥nano banana的最大能力

1. 概述Nano Banana 简介&#xff1a;Nano Banana 是 Google DeepMind 开发的 AI 图像生成与编辑模型&#xff0c;集成在 Google Gemini 平台中&#xff08;具体为 Gemini 2.5 Flash 版本&#xff09;。它以高效的图像编辑能力闻名&#xff0c;尤其在角色一致性、光影理解和快速…

leetcode 面试题01.02判定是否互为字符重排

一、问题描述二、解题思路解法一&#xff1a;对s1和s2进行sort排序&#xff0c;返回s1是否等于s2&#xff1b;解法二&#xff1a;用哈希表分别来记录s1和s2中字符出现的次数&#xff0c;统计完后&#xff0c;判断两个哈希表是否相等;三、代码实现解法一&#xff1a;时间复杂度&…

Python Yolo8 物体识别

支持单张图片/图片目录批量预标注 默认使用cuda GPU .env HTTP_PROXYhttp://192.168.2.109:10808 HTTPS_PROXYhttp://192.168.2.109:10808pyproject.toml [project] name "yolo-test" version "0.1.0" description "Add your description here&quo…

LeetCode100-234回文链表

本文基于各个大佬的文章上点关注下点赞&#xff0c;明天一定更灿烂&#xff01;前言Python基础好像会了又好像没会&#xff0c;所有我直接开始刷leetcode一边抄样例代码一边学习吧。本系列文章用来记录学习中的思考&#xff0c;写给自己看的&#xff0c;也欢迎大家在评论区指导…

BUG排查流程

引言简述Bug排查的重要性分享个人或团队在Bug排查中的常见挑战引出日记形式记录的价值日记格式设计时间戳&#xff1a;记录问题发现和解决的时间节点问题描述&#xff1a;清晰定义Bug的现象和影响范围环境信息&#xff1a;操作系统、版本号、依赖库等关键配置复现步骤&#xff…

汽车功能安全 Functional Safety ISO 26262 测试之一

汽车电子电气系统的日益复杂使得功能安全成为保障车辆可靠性和驾乘安全的关键。 本文将围绕ISO 26262标准的核心内容展开&#xff0c;帮助大家理解如何通过系统化的方法控制风险&#xff0c;进行测试&#xff0c;确保产品安全。 01 什么是功能安全&#xff1f; 首先&#xff0c…

人形机器人赛道的隐形胜负手:低延迟视频链路如何决定机器人未来

一、引言&#xff1a;爆发前夜的人形机器人赛道 2025 年&#xff0c;被业内称为“人形机器人量产元年”。政策与资本的合力&#xff0c;让这条原本还带着科幻色彩的产业赛道&#xff0c;骤然进入现实加速期。国家层面&#xff0c;《“机器人”行动计划》明确提出要推动人形机器…

从iPhone 17取消SIM卡槽,看企业如何告别“数据孤岛”

9月10日&#xff0c;苹果公司如期召开秋季新品发布会&#xff0c;正式推出iPhone 17系列。除了性能和拍照的常规升级&#xff0c;一个看似不起眼但意义深远的改变引起了广泛关注——iPhone 17 Pro系列全面取消了实体SIM卡槽&#xff0c;只保留了eSIM功能。这一举动不仅仅是技术…

【JavaWeb01】Web介绍

文章目录1.导学2.Web开发介绍2.1 Web网站的工作流程2.2 前后端分离开发1.导学 2.Web开发介绍 2.1 Web网站的工作流程 浏览器根据请求的域名请求对应的前端服务器&#xff0c;前端服务器接收到请求之后&#xff0c;把对应的前端代码返回给服务器。浏览器中有解析前端代码的解析引…

链路预测算法MATLAB实现

链路预测算法MATLAB实现 链路预测是复杂网络分析中的重要任务&#xff0c;旨在预测网络中尚未连接的两个节点之间未来产生连接的可能性。 程序概述 MATLAB程序实现了以下链路预测算法&#xff1a; 基于局部信息的相似性指标&#xff08;Common Neighbors, Jaccard, Adamic-Adar…

淘宝商品详情 API 的安全强化与生态协同创新路径

一、安全强化&#xff1a;从 “被动防御” 到 “主动免疫” 的体系升级动态身份认证与权限颗粒化构建 “生物特征 设备指纹 行为基线” 的三重认证机制&#xff1a;结合用户操作习惯&#xff08;如点击间隔、滑动轨迹&#xff09;生成动态令牌&#xff0c;对高权限接口&#…

快消26届联合利华校招AI测评及第二轮线上认知能力测评SHL笔试真题及评分要求

在求职的道路上&#xff0c;联合利华作为一家全球知名企业&#xff0c;其招聘流程一直备受关注。尤其是其AI面试环节&#xff0c;更是让许多求职者既期待又紧张。本文将详细总结联合利华AI面试的规律与应对策略&#xff0c;希望能为正在准备面试的你提供一些帮助。一、联合利华…

使用Langchain生成本地rag知识库并搭载大模型

准备设备&#xff1a; 手机aidlux2.0个人版 一、下载依赖pip install langchain langchain-community faiss-cpu pypdf二、安装ollama并下载模型 curl -fsSL https://ollama.com/install.sh | sh #需要科学上网 ollama serve & #让ollama服务在后台运行安装完毕可以查看oll…

L2-【英音】地道语音语调--语调

文章目录语调英式语调四步法语调含义降调升调降升调升降语调如何正确表情达意1. 用降调的句型语调 英语里没有任何一句话具有固定节奏模式 英式语调四步法 意群划分重音核心语调&#xff08;重中之重&#xff09;语调的选择 A French burglar broke-into-a flat while the o…

计算机视觉进阶教学之图像投影(透视)变换

目录 简介 一、了解图像投影(透视)变换 一、定义与原理 二、应用场景 三、实现方法 二、案例分析 1. 辅助函数定义 1.1.cv_show 函数 1.2.order_points 函数 1.3.four_point_transform 函数 1.4.resize 函数 2. 主程序执行流程 2.1.图像缩放处理 2.2.轮廓检测 2.…

Java面试问题记录(二)

三、系统设计与问题排查1、假设你要设计一个 “秒杀系统”&#xff0c;需要考虑高并发、高可用、防超卖等问题&#xff0c;你的整体技术方案是什么&#xff1f;从前端、接口层、服务层、存储层分别说说核心设计点。秒杀系统设计设计核心&#xff1a;瞬时高并发&#xff0c;库存…

k8s部署kafka三节点集群

本来认为部署kafka很简单&#xff0c;没想到也折腾了2-3天&#xff0c;这水平没治了&#xff5e; kafka从3.4.0版本之后&#xff0c;可以不依赖zookeeper直接使用KRaft模式部署&#xff0c;也就是说部署kafka可以不安装zookeeper直接部署。 在官网上没有找到如何使用yaml文件…

在公用同一公网IP和端口的K8S环境中,不同域名实现不同访问需求的解决方案

目录 1. 访问需求 2. 解决方案 3. 具体配置 3.1 允许互联网访问的域名&#xff08;a.lmzf.com&#xff09; 3.2 需IP白名单访问的域名&#xff08;b.lmzf.com&#xff09; 3.3 关键参数说明 3.4 测试验证 1. 访问需求 在腾讯云TKE环境中&#xff0c;多个域名解析到同一…