Unity 列表滚动到指定位置

news/2025/2/28 22:31:58/

使用场景

策划提出需求:当玩家打开领奖界面时,奖励列表需要自动滑动到可以领奖的奖励栏处或者正在进行的任务栏处。

思路

1、将Content设置好对齐方式和锚点

子物体的预制体和Content:pivot轴心点设置为(0,1),并且设置为左上角对齐。

2、主要根据索引计算Content需要设置的高度即(RectTransform的PosY)

 var sumHeight = targetIndex * (itemHeight + spacing);scrollRect.content.anchoredPosition = new Vector2(0, sumHeight);

特殊情况

第一种  子物体较少的情况(Content高度小于可视区域高度)

不用移动,不必处理

第二种 滑动到末尾几个索引的时候

1、需要提前计算viewport可以最多完整囊括多少个子物体(visualCount)

2、如果需要定位的目标索引大于或等于(总数量 - visualCount+1)时,使用

scrollRect.normalizedPosition = new Vector2(0, 0);

 直接滑到底端就行。

代码

using UnityEngine;
using UnityEngine.UI;public class Test : MonoBehaviour
{public int sumCount;public Transform root;public GameObject item;public ScrollRect scrollRect;public float itemHeight;public float spacing;//子物体之间的间隔public float contentHeight;public float viewportHeight;public int visualCount;public int compareCount;public InputField inputField;void Start(){sumCount = 100;spacing = 10;var itemRect = item.GetComponent<RectTransform>();itemHeight = itemRect.rect.height;for (var i = 1; i <= sumCount; i++){var obj = Instantiate(item, root.transform);var txtObj = obj.transform.Find("txt");var txt = txtObj.GetComponent<Text>();txt.text = i.ToString();}LayoutRebuilder.ForceRebuildLayoutImmediate(scrollRect.content);contentHeight = scrollRect.content.rect.height;viewportHeight = scrollRect.viewport.rect.height;visualCount = (int)(viewportHeight / itemHeight);compareCount = sumCount - visualCount + 1;}private void Update(){if (Input.GetKeyDown(KeyCode.Space)){var index = int.Parse(inputField.text);ScrollToTarget(index);}}public void ScrollToTarget(int index){if (index <= 0 || index > sumCount){return;}//第一种 子物体较少的情况(Content高度小于可视区域高度)if (contentHeight < viewportHeight){return;}   //先停止列表滑动,以防造成误差scrollRect.StopMovement();//第二种 滑动到末尾几个索引的时候if (index >= compareCount){scrollRect.normalizedPosition = new Vector2(0, 0);return;}var targetIndex = index - 1;targetIndex = targetIndex < 0 ? 0 : targetIndex;var sumHeight = targetIndex * (itemHeight + spacing);scrollRect.content.anchoredPosition = new Vector2(0, sumHeight);}
}

补充

1、如果需要添加滚动动画,可以使用Dotween来实现

 var sumHeight = targetIndex * (itemHeight + spacing);scrollRect.content.DOAnchorPosY(sumHeight,0.5f);

http://www.ppmy.cn/news/1575609.html

相关文章

Idea编译项目很久之后,提示 Error:java:OutOfMemoryError:insufficient memory

项目挺老的的了&#xff0c;平常项目启动&#xff0c;也要挺久的&#xff0c;但是最起码能启动成功&#xff0c;今天下午的时候&#xff0c;项目启动了十几分&#xff0c;一直在转圈&#xff0c;后面控制台输出了这一行异常 Error:java:OutOfMemoryError:insufficient memory …

Unity XR-XR Interaction Toolkit开发使用方法(十一)组件介绍(XR Interactable)

目录 一、插件介绍 二、主要组件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor XR Interaction Group 三、XR Interactable 1、组件介绍 2、核心功能与特点 交互类型支…

DeepSeek-R1-Zero:基于基础模型的强化学习

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…

机器学习数学基础:38.复相关系数

一、概念深度解读 复相关系数反映的是几个要素与某一个要素之间的复相关程度&#xff0c;其值介于0到1之间。可以将其类比为一把“尺子”&#xff0c;用来衡量多个因素作为一个整体&#xff0c;对某一特定结果的影响紧密程度。 完全相关情况&#xff1a;当复相关系数为1时&am…

阿里云的 ECS(Elastic Compute Service)实例

阿里云的 ECS&#xff08;Elastic Compute Service&#xff09;实例 是一种高可扩展、灵活的计算服务&#xff0c;允许用户在云上运行虚拟机。通过ECS&#xff0c;用户可以在阿里云的云基础设施上启动、配置和管理虚拟服务器&#xff08;实例&#xff09;&#xff0c;这些实例具…

开发 picgo-plugin-huawei 插件,解决华为云社区外链限制问题

开发 picgo-plugin-huawei 插件&#xff0c;解决华为云社区外链限制问题 在技术博客平台中&#xff0c;外链的使用常常受到限制&#xff0c;这给我们的写作和内容展示带来了一定的不便。为了应对这一问题&#xff0c;我开发了 picgo-plugin-huawei 插件&#xff0c;它能够有效…

【一文入门】shell语法进阶篇

Shell 脚本的进阶语法涉及更复杂的编程结构、数据处理和系统交互。以下是一些进阶的 Shell 编程概念和技巧&#xff0c;帮助你提升编写复杂脚本的能力。 前置知识 【一文入门】shell基础语法 【一文入门】shell语法进阶篇 1. 高级变量操作 间接引用&#xff1a;通过变量名的…

【深度学习】基于MXNet的多层感知机的实现

多层感知机 结构组成 大致由三层组成&#xff1a;输入层-隐藏层-输出层&#xff0c;其中隐藏层大于等于一层 其中&#xff0c;隐藏层和输出层都是全连接 隐藏层的层数和神经元个数也是超参数 多层隐藏层&#xff0c;在本质上仍等价于单层神经网络&#xff08;可从输出方程…