Unity 之 Scorll Rect 无限动态循环列表,,,先看看效果图吧:
步骤简述:

1,搭建环境,

  • 创建Image(命名scorllrect) 自定义大小,添加ScrollRect组件 (我这里只需要上下拖动,所以取消勾选Horizontal),,然后添加MasK组件(用于限制显示范围)。
  • 然后创建一个空物体做为scorllrect的子物体(命名为Grid 是生成预制体的父物体),锚点设置为上对齐,并把它指定为ScrollRect组件的Content属性,基本结构如下图:


    2,制作预制体,将你要生成的数据,做一个预制体,并方法Resources目录下,用于动态生成,注意预制体的锚点设置,如下图(我这里用一个简单的Image作为要生成的数据)

3,编写代码: (使用时重新定义数据列表,设置数据显示内容即可)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class ScrollRectDemo : MonoBehaviour
{//生成物体的父物体public Transform RankGrid;//拖动组件public ScrollRect scorllRect;/// <summary>/// 所有数据的集合/// </summary>public List<int> datas = new List<int> { 1, 3, 5, 7, 9, 10, 11, 12, 13, 14, 15 };Dictionary<GameObject, int> datasAndIndex = new Dictionary<GameObject, int>();private bool isDragIng = false;private bool isLoadingRecord = false;void Start(){//监听拖动scorllRect.onValueChanged.AddListener((value) => { OnRecordDrag(value.y); });//设置生成记录SetRecords(datas);}public void SetRecords(List<int> infos){ClearRecord();StartCoroutine(SetRecord(infos));}public IEnumerator SetRecord(List<int> infos){while (isLoadingRecord){yield return new WaitForFixedUpdate();}isLoadingRecord = true;datas.Clear();datas.AddRange(infos);int h = 0;foreach (var item in datas){h += 90;}//设置要拖动的物体宽高RankGrid.GetComponent<RectTransform>().sizeDelta = new Vector3(1080, h);RankGrid.GetComponent<RectTransform>().localPosition = Vector3.zero;isDragIng = true;//第一次刷新生成物体for (int i = 0; i < (datas.Count > 6 ? 6 : datas.Count); i++){GameObject go = Instantiate(Resources.Load("Info")) as GameObject;go.transform.SetParent(RankGrid);SetRecordItem(i, go);yield return new WaitForSeconds(0.1f);}isDragIng = false;isLoadingRecord = false;}//设置历史比赛记录数据void SetRecordItem(int index, GameObject go){if (index >= datas.Count) return;datasAndIndex[go] = index;//设置位置go.GetComponent<RectTransform>().pivot = new Vector2(0.5f, 1);go.transform.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(540, GetPos_Y(index), 0);//设置信息显示go.transform.GetChild(0).GetComponent<Text>().text = "我是第" + index + "条数据信息";}//拖动监听方法void OnRecordDrag(float y){if (datas.Count <= 8) return;if (isDragIng) return;isDragIng = true;int indexNow = GetIndex(RankGrid.GetComponent<RectTransform>().anchoredPosition3D.y);//Debug.Log("y: " + y + ".. 比赛历史记录  indexNow ... " + LSBSPanel_LSZJGrid.GetComponent<RectTransform>().anchoredPosition3D.y + "  DataCount ..." + datas.Count);List<GameObject> needDispose = new List<GameObject>();foreach (var go in datasAndIndex.Keys){if (datasAndIndex[go] >= indexNow && datasAndIndex[go] < indexNow + 6){//没超出范围 暂且留着continue;}else{//超出范围,收回到对象池内needDispose.Add(go);}}foreach (var go in needDispose){datasAndIndex.Remove(go);Destroy(go); //正常应该回收到对象池}for (int i = indexNow; i < indexNow + 6; i++){if (datasAndIndex.ContainsValue(i)){//此位置已经有item了 不做处理continue;}else//此位置没有item 需要加载一个{if (i < datas.Count){GameObject item = Instantiate(Resources.Load("Info")) as GameObject;item.transform.SetParent(RankGrid);SetRecordItem(i, item);}}}isDragIng = false;}float GetPos_Y(int index){float sizeY = 0;for (int i = 0; i < index; i++){sizeY += 90;}return -sizeY;}int GetIndex(float y){int index = 0;float sizeY = 0;for (int i = 0; i < datas.Count; i++){sizeY += 90;if (sizeY > y){index = i;break;}}return index;}//清理记录public void ClearRecord(){datas = new List<int>();foreach (var go in datasAndIndex.Keys){//回收到对象池go.SetActive(false);}datasAndIndex.Clear();}
}

Unitypackage :Demo链接:https://github.com/Czhenya/ScrollDemo

Unity 之 Scorll Rect 动态循环列表相关推荐

  1. vue循环如何传参数 php,vue循环列表动态数据的处理方法(代码)

    本篇文章给大家带来的内容是关于vue循环列表动态数据的处理方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 调用方法:Vue.set( target, key, value ...

  2. Unity 动态循环设置材质球的图片

    动态循环设置材质球的图片: public Texture[] textures;private Renderer renderer;// Use this for initializationvoid ...

  3. FairyGUI循环列表

    FairyGUI循环列表 实现效果:在Unity中,通过鼠标可以循环浏览列表,并且浏览当前页时,有一个近大远小的效果. 一.导入资源 二.新建按钮 三.设计列表 四.装载器动态加载图片按钮 如果有上万 ...

  4. animate方法 jQuery中元素的创建 创建十个p标签 创建列表 动态创建列表

    animate方法 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  5. 【100个 Unity踩坑小知识点】| Unity调用API ,动态获取Android权限,附带所有Android权限表格

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  6. 微信小程序:block制作动态商品列表

    微信小程序:block制作动态商品列表 在制作微信小程序时,我们往往会碰到需要动态生成列表的情况,本文便是以常见的商品列表为例来学习如何利用block制作动态商品列表. 运行截图 实现代码 js: P ...

  7. Unity Shader学习:动态模糊(shutter angle方式)

    Unity Shader学习:动态模糊 动态模糊一般有帧混合和motion vector两种,这里主要介绍motion vector的方法. Keijiro源码:https://github.com/ ...

  8. 【Unity教程】如何动态更换精灵图片在图集中更换精灵图片

    参考文章:1.unity3d 更换sprite renderer中sprite的图片 2.制作精灵(UI Sprite) 3.Unity2D动态设置SpriteRender的Sprite(Multip ...

  9. el-table-column动态循环渲染列项名称/label值

    1.业务需求: 用户根据不同学院>专业>班级查询学生列表,但是el-table的label的名称和数量需要根据搜索条件进行动态渲染,显示效果如下图所示 2.数据格式: 2.1:自定义需要动 ...

  10. 【霍洛维兹数据结构】栈和队列 | 动态循环队列 | 迷宫问题 | 表达式 | 多重栈多重队列

    前言: 最近在读霍罗维兹的<数据结构基础>(Fundamentals of Data Structures in C),本篇博客为阅读笔记和知识总结. 目录 Ⅰ. 栈(STACKS) 0x ...

最新文章

  1. Unity Editor已停止工作
  2. bzoj 4195: [Noi2015]程序自动分析
  3. Spartacus image alt属性的绑定实现
  4. Angular单元测试如何只执行指定的测试用例,提高测试速度
  5. 制作自己的特色PE----Mr.Zhang
  6. mysql使用between..and 查询日期范围注意事项
  7. Struts2不扫描jar包中的action
  8. 在VB中使用Linq To SQLite注意事项
  9. php后台框架整理集锦
  10. matlab的grid on,Matlab基本函数-grid、box函数 | 学步园
  11. JAVA项目答辩题之参考_Java项目答辩
  12. 使用Apache-ANT进行jar包合并
  13. 企鹅号快速赚钱方法?企鹅号收益情况?
  14. 小程序引入的echarts过大如何解决_在微信小程序中使用 ECharts
  15. JS实现点击按钮切换图片
  16. nc命令卡住不返回的分析
  17. pytorch中torch.cholesky()函数的使用
  18. 18种抗癌果蔬排行榜
  19. PTA 公路村村通
  20. 超一亿人不按时吃饭!

热门文章

  1. 欢乐鼠标自动点击器_抓住夏天的尾巴|与自动点击评论器邂逅一次
  2. hashcat在windows上的安装与简单使用
  3. zoomit的使用 - 一个可以直接在演示的时候写字的软件
  4. 白平衡算法---色温曲线
  5. 零基础入门进化算法(基本概念)
  6. python实训总结万能版3000字_实训总结万能版2000字
  7. TypeError: The ‘compilation‘ argument must be an instance of Compilation
  8. 通过Matlab实现离散序列卷积和
  9. 跟我一起水疗的哥俩儿,其实挺猛的!
  10. 初步探索C++深浅拷贝