Unity排行榜优化滚动效果
作者:接啊是哦ida 发布时间:2021-09-08 13:02:07
标签:Unity,排行榜,滚动
本文实例为大家分享了Unity排行榜优化滚动效果的具体代码,供大家参考,具体内容如下
自己做的一个优化排行榜的功能,当有大量的数据需要在scroolRect中可以通过只夹在几个item循环利用便可以展示所需的内容;
下面是效果实现图
下面是我的一个中心思想
通过对处在视野第一个Item左上和左下左边点的位置来判断是将最后一个移动到第一个前面,还是将第一个移动到最后一个后面。
用到的我目前来说不太常用的数据结构 LinkedList 方便用于移除第一个和最后一个;
以下是代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class WuXianGunDong : MonoBehaviour
{
List<string> strs = new List<string>();//需要修改
public int DataTips;
public Transform content;
public GameObject loopItemPrefab;
Vector3[] viewCorners = new Vector3[4];
float hight; //生成的loopItem所占的区域
int current = -1;
int itemCount;//生成的Item的数量
public LinkedList<GameObject> loopItems = new LinkedList<GameObject>();
#region 回调
private void Awake()
{
for (int i = 0; i < DataTips; i++)
{
strs.Add(i.ToString());
}
hight = loopItemPrefab.GetComponent<RectTransform>().sizeDelta.y + content.GetComponent<VerticalLayoutGroup>().spacing;
itemCount = (int)(transform.GetComponent<RectTransform>().sizeDelta.y / hight) + 2;
if (itemCount > DataTips)
itemCount = DataTips;
for (int i = 0; i < itemCount; i++)
{
GameObject obj = Instantiate(loopItemPrefab, content);
obj.GetComponentInChildren<Text>().text = strs[i];
loopItems.AddLast(obj);
current++;
}
transform.GetComponent<RectTransform>().GetWorldCorners(viewCorners);
content.GetComponent<VerticalLayoutGroup>().enabled = true;
}
private void Start()
{
Invoke("DisGrid", 0.1f);
}
#endregion
#region 拖拽的时候
public void OnChange()
{
if (DataTips < itemCount)
{
return;
}
Vector3[] rectCorners = new Vector3[4];
//当第一个离开视野的时候
loopItems.First.Value.GetComponent<RectTransform>().GetWorldCorners(rectCorners);
if (rectCorners[0].y > viewCorners[1].y)
{
if (current + 1 < strs.Count)
{
current++;
loopItems.First.Value.transform.GetComponentInChildren<Text>().text = strs[current];
loopItems.First.Value.GetComponent<RectTransform>().localPosition = loopItems.Last.Value.GetComponent<RectTransform>().localPosition - new Vector3(0, hight, 0);
loopItems.AddLast(loopItems.First.Value);
loopItems.RemoveFirst();
}
}
//当最后一个进入视野的时候
loopItems.First.Value.GetComponent<RectTransform>().GetWorldCorners(rectCorners);
if (rectCorners[1].y < viewCorners[1].y)
{
if (current - itemCount >= 0)
{
loopItems.Last.Value.transform.GetChild(0).GetComponent<Text>().text = strs[current - itemCount];
loopItems.Last.Value.GetComponent<RectTransform>().localPosition = loopItems.First.Value.GetComponent<RectTransform>().localPosition + new Vector3(0, hight, 0);
loopItems.AddFirst(loopItems.Last.Value);
loopItems.RemoveLast();
current--;
}
}
}
#endregion
public void DisGrid()
{
//关闭LayoutGroup
content.GetComponent<VerticalLayoutGroup>().enabled = false;
//设置宽度
content.GetComponent<RectTransform>().sizeDelta = new Vector2(content.GetComponent<RectTransform>().sizeDelta.x, strs.Count * hight);
}
}
来源:https://blog.csdn.net/weixin_47634555/article/details/106857090


猜你喜欢
- 本文实例为大家分享了C#实现飞行棋的具体代码,供大家参考,具体内容如下基于Winform框架写的不足之处请大佬指教using System;
- 前言在《C# wpf Canvas中实现控件动态调整大小》中我们实现了Canvas中的控件动态调整大小,由于Grid也是可层叠布局,在Gri
- 前言IOC和AOP是Spring 中最重要的两个模块。这里练习一下如何使用Spring Boot AOP处理方法的入参和返回值。Spring
- 一、简介当要将配置中心部署到生产环境中时,与服务注册中心一样,我们也希望它是一个高可用的应用。Spring Cloud Config实现服务
- 一:简述我们很多时候为了实现数据在线程级别下的隔离,会使用到ThreadLocal,那么TheadLocal是如何实现数据隔离的呢?今天就和
- 本文实例讲述了Android编程实现网络图片查看器和网页源码查看器。分享给大家供大家参考,具体如下:网络图片查看器清单文加入网络访问权限:&
- 一、摘要总结基于C#的UDP协议的同步通信。 二、实验平台Visual Studio 2010 三、实验原理UDP传输协
- 本案例通过使用JFileChooser实现对选定文件夹内图片实现自动播放和暂停播放代码如下,如有不合适的地方 还请指教package com
- 本小节内容不多,但是个人感觉比较独立,还是拿出来单讲吧。在开发 IntelliJ Plugin 时,如果需要用到 Gson、OKHttp 等
- 一般文本文件我们以日志文件.log文件为例:import java.io.BufferedReader; import java.io.Fi
- 经测试,是环绕通知改变了返回值,切面方法需要有返回值,来代替被代理方法返回结果改成如下即可:@Around("point_upda
- 目录前言1、饿汉式(线程安全)⭐2、懒汉式(线程不安全)⭐3、懒汉式(加锁)4、懒汉式(双重校验锁)⭐5、单例模式(静态内部类)6、单例模式
- IComparable<T>.NET 里,IComparable<T>是用来作比较的最常用接口。如果某个类型的实例需
- 前言我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢。如果懂得了JVM的运行原理和内
- 首先要安装SpeechSDK5.1 开发包和SpeechSDK5.1 Langague Pack(中英文) 语言包,不过VS2010里是自带
- namespace PadWebServices.Model{ public static class DataTa
- 前言现在大部分App底部都有一个菜单,实现这个功能也有好多办法:- TabHost+Fragment - RadioGroup+Fragme
- 结构体有时候我们仅需要一个小的数据结构,类提供的功能多于我们需要的功能;考虑到性能原因,最好使用结构体。结构体是值类型,存储在栈中或存储为内
- 从这章开始,会介绍几个常用的函数式接口工具,首先先来看下这个大家族:首先从Function接口开始介绍一. 概述该接口顾名思义,函数的意思,
- Android使用GridView实现日历功能示例,代码有点多,发个图先:如果懒得往下看的,可以直接下载源码吧,最近一直有人要,由于时间太久