Unity 之 Scorll Rect 动态循环列表

举报
陈言必行 发表于 2021/08/13 22:58:41 2021/08/13
【摘要】 Unity 之 Scorll Rect 无限动态循环列表,,,先看看效果图吧: 步骤简述: 1,搭建环境, 创建Image(命名scorllrect) 自定义大小,添加ScrollRect组件 (我这里只需要上下拖动,所以取消勾选Horizontal),,然后添加MasK组件(用于限制显示范围)。然后创建一个空物体做为scorllrect的子物体(命名为Grid 是...

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

1,搭建环境,

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

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(); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171

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

文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。

原文链接:czhenya.blog.csdn.net/article/details/88224706

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。