首页 > 其他分享 >Unity ScrollRect中,拖拽移动Item的顺序

Unity ScrollRect中,拖拽移动Item的顺序

时间:2024-06-03 14:59:14浏览次数:22  
标签:ScrollRectManager Color ScrollRect GridLayoutGroup transform Item Unity public

*Unity ScrollRect中,拖拽移动Item的顺序*

目标需求

Unity在制作下拉菜单时,用户可通过拖拽Item,替换当前Item的位置。本教程使用UGUI

制作方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建脚本 ScrollRectManager,用于管理整个ScrollRect,我是将脚本 ScrollRectManager挂载到了 Canvas
在这里插入图片描述

完整代码

创建脚本 ScrollRectItem,作为Item,通过程序生成Item,动态添加脚本控制器

public class ScrollRectManager : MonoBehaviour
{
[SerializeField] Color[] m_Color = new Color[0];
public ScrollRect m_ScorllRect;
internal GridLayoutGroup m_GridLayoutGroup;
internal RectTransform m_RectTransformGrid;
Queue m_Item = new Queue();

internal float minY = 0;
internal float maxY = 0;

async void Start()
{
    this.m_GridLayoutGroup = this.m_ScorllRect.content.GetComponent<GridLayoutGroup>();
    this.m_RectTransformGrid = this.m_GridLayoutGroup.GetComponent<RectTransform>();
    foreach (var color in m_Color)
    {
        ScrollRectItem item = new GameObject().AddComponent<Image>().AddComponent<ScrollRectItem>();
        m_Item.Enqueue(item);
        item.Show(color, this);
    }
    await Task.Delay(TimeSpan.FromSeconds(0.1f));

    minY = -this.m_RectTransformGrid.rect.height + this.m_GridLayoutGroup.cellSize.y / 2;
    maxY = -this.m_GridLayoutGroup.cellSize.y / 2;
}

private void OnDestroy()
{
    while (m_Item.Count > 0) { Destroy(m_Item.Dequeue()); }
    this.m_Item.Clear();
}

}

public class ScrollRectItem : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
RectTransform m_RectTransform;
ScrollRectManager m_ScrollRectManager;
Canvas m_CanvasThis;
GraphicRaycaster m_GraphicRaycaster;

public void OnDrag(PointerEventData eventData)
{
    Vector2 localCursor;
    //计算鼠标或触摸事件的局部位置
    RectTransformUtility.ScreenPointToLocalPointInRectangle(this.m_ScrollRectManager.m_ScorllRect.content, eventData.position, eventData.pressEventCamera, out localCursor);
    //重置位置
    this.transform.localPosition = new Vector3(0, Mathf.Clamp(localCursor.y, this.m_ScrollRectManager.minY, this.m_ScrollRectManager.maxY), 0);

    //重定义顺序 - 使用当前Item的位置,除以Item的高度+行间距,得到的值就是当前Item的Order
    int order = (int)(this.transform.localPosition.y / -(this.m_ScrollRectManager.m_GridLayoutGroup.cellSize.y + this.m_ScrollRectManager.m_GridLayoutGroup.spacing.y));
    if (order != this.transform.GetSiblingIndex())
    {
        this.transform.SetSiblingIndex(order);
    }
}

public void OnPointerDown(PointerEventData eventData)
{
    this.m_CanvasThis.sortingOrder = 2;
}

public void OnPointerUp(PointerEventData eventData)
{
    this.m_CanvasThis.sortingOrder = 1;
    ///松开后,刷新列表
    LayoutRebuilder.ForceRebuildLayoutImmediate(this.m_ScrollRectManager.m_GridLayoutGroup.transform as RectTransform);
}

public async void Show(Color m_Color, ScrollRectManager m_ScrollRectManager)
{
    this.m_ScrollRectManager = m_ScrollRectManager;
    this.transform.SetParent(this.m_ScrollRectManager.m_ScorllRect.content);
    this.GetComponent<Image>().color = m_Color;
    this.transform.name = UnityEngine.ColorUtility.ToHtmlStringRGB(m_Color);
    this.m_RectTransform = this.GetComponent<RectTransform>();
    this.m_RectTransform.pivot = new Vector2(0.5f, 0.5f);

    this.m_CanvasThis = this.AddComponent<Canvas>();
    this.m_GraphicRaycaster = this.AddComponent<GraphicRaycaster>();
    await Task.Yield();
    this.m_CanvasThis.overrideSorting = true;
    this.m_CanvasThis.sortingOrder = 1;
}

}

最终效果

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="yAUsFf2O-1717397477390" src="https://live.csdn.net/v/embed/395695"></iframe>

ScrollRect Drag Item示例效果

备注

本案列仅仅是垂直单列的案列,其他列表可结合当前案列进行调整。

unitypackage

https://pan.baidu.com/s/11RzOJy6tHOEkftiHTJHyjw?pwd=wbzq
提取码:wbzq
unity版本:2022.3

标签:ScrollRectManager,Color,ScrollRect,GridLayoutGroup,transform,Item,Unity,public
From: https://blog.csdn.net/qq_41605368/article/details/139413723

相关文章

  • Unity2D游戏制作入门 | 02
    上期链接:Unity2D游戏制作入门|01我们先整理我们的场景素材并调整一些参数,选中我们的Forest1,就是如下图所示了:选择:multiple(多个),16像素,不过滤,不压缩(compression),记得保存设置。开始编辑我们的场景:接下使用Size的模式进行切割:注意锚点我们设置在中心,不然等下放入图片......
  • Unity2D游戏制作入门 | 03
    ​上期链接:Unity2D游戏制作入门|02这节的规则瓦片其实是上一节用Tile去绘制地图的补充吧,假设你有大量而且面积还挺大的地图工程量,我想画的时间还是很久的,规则瓦片就是为了解决这种问题。所以所谓规则瓦片就是有一部分地方是固定绘制的,然后有一些地方是随机出现的素材(比......
  • Unity2D游戏制作入门 | 04
    上期连接:Unity2D游戏制作入门|03(主要介绍了快速绘图的瓦片调色盘功能)本节主要介绍物体的组件功能。如果我们点击我们的物体,然后你可以在最右侧的下部分看到英文:AddComponent,中其实是添加组件的意思。AI是这么回答组件的:组件(Components)是构建游戏对象(GameObjects)的核......
  • Unity 实现让物体渲染在最前面
    演示实现方案1.创建一个shader脚本2.删掉原来的内容:我们自己写附上完整的shader代码:Shader"Custom/ZTestAlways"{Properties{_Color("ColorTint",Color)=(1,1,1,1)_MainTex("MainTex",2D)="white"{}}Sub......
  • unity通过Transform:管理游戏对象的层级关系
    unity中可以通过Transform类来管理游戏对象的层级关系,查询相关组件。1.获取游戏对象的父类,打印出来Debug.Log(transform.parent);设置父对象,以照相机为例子,查询主摄像机(main代表主摄像机transform.SetParent(Camera.main.transform);2. 当前对象,获取根对象(最上方的那个......
  • 如何从unity Scene场景里,通过Prefab导出FBX
       有时候使用购买的工程,或者其他原因导致素材比较零碎。我们希望可以导出已经在unity场景里拼接好的预制体给到模型同学修改,这样可以减少重复工作量。   这里分享一个工作中使用到的unity插件,作为自己的工作记录和梳理。本人unity目前还在初级学习摸索阶段,希望可......
  • 使用 Unity Sentis 和 Compute Shader,det_10g.onnx 进行高效人脸五官定位
    前言在计算机视觉领域,人脸五官定位是一个重要的任务。本文将介绍如何使用UnitySentis和ComputeShader,结合det_10g.onnx模型,实现高效的人脸五官定位。我们将详细讲解每一步骤,并提供完整的代码示例。模型分析输入值:模型的输入是我这边选择的是1x3x640x640;输出值:步......
  • 使用 Unity Sentis 和 Compute Shader,2d106det.onnx 进行高效人脸网格标记
    前言前篇:使用UnitySentis和ComputeShader,det_10g.onnx进行高效人脸五官定位-CSDN博客在计算机视觉领域,人脸网格标记是一项重要的任务,用于识别人脸关键点和特征。本文将介绍如何使用UnitySentis和ComputeShader,结合2d106det.onnx模型,实现高效的人脸网格标记。我......
  • 【Unity2D 2022:Particle System】添加粒子特效
    一、创建粒子系统游戏物体1. 创建粒子系统游戏物体SmogEffect 2.给粒子特效添加精灵贴图    (1)启用TextureSheetAnimation(纹理表动画)    (2)点击加号添加一个纹理,并将两张厌恶图片导入到纹理中3.设置两张图片随机播放(防止烟雾粒子变化)   ......
  • Large Language Models as Data Augmenters for Cold-Start Item Recommendation论文
    LargeLanguageModelsasDataAugmentersforCold-StartItemRecommendation论文阅读笔记Abstract​ LLM的推理和泛化能力可以帮助我们更好地理解用户的偏好和项目特征。我们建议利用LLM作为数据增强器,来弥补在训练过程中对冷启动项目的知识差距。我们使用LLM根据用户历史行......