Unity | 您所在的位置:网站首页 › 1129374656_16767042048501njpg › Unity |
![]()
目录 今天学习:Unity - UGUI - 无限滚动 版本: 一:思路分享(Share idea) 二:脚本编写(Scripts) 三:场景面板布置(Hierarchy) 四:运行结果(Running Result) 希望大家:点赞,留言,关注咯~ 唠家常 今日无推荐 版本:1、Unity 2020.3.10f1 时隔多周,在这里分享出来一点最近的功能吧。 借助UGUI - ScrollView,进行更改,并且实现无限滑动!!!!!!!! 一:思路分享(Share idea)大概就是下边这个巨作的思路,希望对大家有个思想考量方向,不过不能因为我而放弃了自己的想法,适合自己的才是最好的。说不定你自己的思路比我的还好,不过功能要的快,所以我就百度了,发现早就有大佬们实现了,所以找了一篇下来,刚好满足需求。不过我还是要把自己思路分享出来!!! 画画技术水平有限,见谅。。。。。。。 1、上来获取最上一排的位置信息和宽高度; 2、设置一个触发高度/宽度位置; 3、当再移动的过程中每排最指定节点的高度大于/小于,指定触发点时,重新设置位置到第一排/最后一排的位置,反复如此。 4、在更改位置时,对要被更改的子节点进行设置相关索引或者其他一系列操作。 1、既然是要实现无限滑动,那我们就先来编写第一个相关脚本:InfinityGridLayoutGroup using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace ThisXHGame { /// /// 无限滑动 /// [RequireComponent(typeof(GridLayoutGroup))] [RequireComponent(typeof(ContentSizeFitter))] public class InfinityGridLayoutGroup : MonoBehaviour { /* 要确定当前所属canvas的rect下方scale缩放比例,要与之保持一样。 */ float _scale = 0.061f; /* 实现无限滚动,需要的最少的child数量。 * 屏幕上能看到的+一行看不到的,比如我在屏幕上能看到 4 行,每一行 3 个。 * 则这个值为 4行 * 3个 + 1行 * 3个 = 15个。*/ int childrenAmount = 0; #region Private Attribute ScrollRect scrollRect; RectTransform rectTransform; GridLayoutGroup gridLayoutGroup; ContentSizeFitter contentSizeFitter; List children = new List(); int amount = 0; int constraintCount; int realIndex = -1; float childHeight; bool hasInit = false; Vector2 startPosition; Vector2 gridLayoutSize; Vector2 gridLayoutPos; Dictionary childsAnchoredPosition = new Dictionary(); Dictionary childsSiblingIndex = new Dictionary(); #endregion public delegate void UpdateChildrenCallbackDelegate(int index, Transform trans); public UpdateChildrenCallbackDelegate updateChildrenCallback = null; void Start() => childrenAmount = transform.childCount; IEnumerator InitChildren() { yield return 0; if (!hasInit) { //获取Grid的宽度; rectTransform = GetComponent(); gridLayoutGroup = GetComponent(); gridLayoutGroup.enabled = false; constraintCount = gridLayoutGroup.constraintCount; childHeight = gridLayoutGroup.cellSize.y; contentSizeFitter = GetComponent(); contentSizeFitter.enabled = false; gridLayoutPos = rectTransform.anchoredPosition; gridLayoutSize = rectTransform.sizeDelta; //注册ScrollRect滚动回调; scrollRect = transform.parent.GetComponent(); scrollRect.onValueChanged.AddListener((data) => { ScrollCallback(data); }); //获取所有child anchoredPosition 以及 SiblingIndex; for (int index = 0; index 0) { rectTransform.sizeDelta -= new Vector2(0, (gridLayoutGroup.cellSize.y + gridLayoutGroup.spacing.y) * row); } } else { //如果小了一列,则需要把GridLayout的宽度减去一列的宽度; int column = (childrenAmount - amount) / constraintCount; if (column > 0) { rectTransform.sizeDelta -= new Vector2((gridLayoutGroup.cellSize.x + gridLayoutGroup.spacing.x) * column, 0); } } } /// /// 设置总的个数; /// /// 总个数 public void InitSetAmount(int count) { amount = count; StartCoroutine(InitChildren()); } /// /// 滑动回调 /// void ScrollCallback(Vector2 data) { if (data.y >= 1.0f) return; UpdateChildrenInfo(); } /// /// 子物体的更改 /// void UpdateChildrenInfo() { if (childrenAmount 0.0f)); if (offsetY > 0) { //向上拉,向下扩展; { if (realIndex >= amount - 1) { startPosition = currentPos; return; } float scrollRectUp = scrollRect.transform.TransformPoint(Vector3.zero).y; Vector3 childBottomLeft = new Vector3(children[0].anchoredPosition.x, children[0].anchoredPosition.y - gridLayoutGroup.cellSize.y, 0f); float childBottom = transform.TransformPoint(childBottomLeft).y; if (childBottom >= scrollRectUp + childHeight * _scale) { //移动到底部; for (int index = 0; index amount - 1) { children[index].gameObject.SetActive(false); } else { UpdateChildrenInfoCallback(realIndex, children[index]); } } //GridLayoutGroup 底部加长; rectTransform.sizeDelta += new Vector2(0, gridLayoutGroup.cellSize.y + gridLayoutGroup.spacing.y); //更新child; for (int index = 0; index 2、那我们有了相关脚本,我们就需要去编写相关控制脚本咯:TheInfinityScrollController using UnityEngine; using UnityEngine.UI; namespace ThisXHGame { /// /// 无限滑动控制器 /// public class TheInfinityScrollController : MonoBehaviour { InfinityGridLayoutGroup infinityGridLayoutGroup; void Start() { 初始化数据列表; infinityGridLayoutGroup = GameObject.FindObjectOfType(); infinityGridLayoutGroup.updateChildrenCallback = UpdateChildrenCallback; for (int i = 0; i { OnClickButtonWithIndex(child.GetComponentInChildren()); }); } infinityGridLayoutGroup.InitSetAmount(100); } /// /// 通过当前缩略图索引从ios相册获取原图 /// void OnClickButtonWithIndex(Text tex) { Debug.Log($" Unity log: index is {tex.text} in your click button..."); } /// /// 上下翻滚更新函数 /// void UpdateChildrenCallback(int indx, Transform trans) { Text tex = trans.Find("Text").GetComponent(); tex.text = indx.ToString(); } } }至此,我们全部代码已经编写完了。 三:场景面板布置(Hierarchy)1、那既然是借助了ScrollView,那我们就先看相关设置。这里我们把ScrollView下的Viewport、Scrollbar Horizontal、Scrollbar Vertical全部删除,因为我们不需要他们。 2、既然Viewport已经删除,那我们接着是整Content,首先增加脚本InfinityGridLayoutGroup,接着要注意:在GridLayoutGroup下的Constraint要设置为FixedColumnCount。★★★★★ 3、好,我们接下来就是设置他的子节点了,具体要设置多少个,之前代码里有说明,不过这里还是再说一下。 /* * 实现无限滚动,需要的最少的child数量。 * 屏幕上能看到的+一行看不到的,比如我在屏幕上能看到 4 行,每一行 3 个。 * 则这个值为 4行 * 3个 + 1行 * 3个 = 15个。 */ 那么根据这个结果,我们就创建15个子节点。 1、刚运行 2、运行中 至此,圆满结束。 希望大家:点赞,留言,关注咯~ 唠家常 小黑的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加小黑的QQ:841298494,大家一起进步。 今日有推荐参考:https://blog.csdn.net/huutu/article/details/51549762 客官,看完get之后记得点赞哟! 小伙伴你还想要别的知识?好的呀,分享给你们 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么? Unity - 无限滚动的更多相关文章 [Unity3D插件]2dtoolkit系列二 动画精灵的创建以及背景图的无限滚动经过昨天2dtoolkit系列教程一的推出,感觉对新手还有有一定的启发作用,引导学习使用unity 2dToolKit插件的使用过程,今天继续系列二——动画精灵的创建,以及背景图的无限循环滚动,在群里 ... iOScollectionView广告无限滚动(Swift实现)今天公司里的实习生跑过来问我一般App上广告的无限滚动是怎么实现的,刚好很久没写博客了,就决定写下了,尽量帮助那些处于刚学iOS的程序猿. 做一个小demo,大概实现效果如下图所示: 基本实现思路: ... Infinite Scroll - jQuery & WP 无限滚动插件无限滚动(Infinite Scroll)也称为自动分页.滚动分页和无限分页.常用在图片.文章或其它列表形式的网页中,用来在滚动网页的时候自动加载下一页的内容.Infinite Scroll 这款 ... 基于HTML5+CSS3的图片旋转、无限滚动、文字跳动特效本文分享几种基于HTML5+CSS3实现的一些动画特效:图片旋转.无限滚动.文字跳动;实现起来均比较容易,动手来试试! 一.图片旋转 效果图如下: 这个效果实现起来其实并不困难.代码清单如下: ... LoopBar – Tap酒吧与无限滚动相约 LoopBar – 标签栏与无限滚动为Android由Cleveroad 在Cleveroad我们最近认识到通过使用任何一个应用程序类别的导航,导航面板是很无聊和琐碎.这就是为什么我们的设计师的 ... Android 高级UI设计笔记09:Android如何实现无限滚动列表ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ... 无限滚动 --demoxxx.sql 2022春每日一题:Day 20题目:Secret Message 老师说的trie树入门题 对于每个密码,存入trie树,每个字符对应编号i,则sum[i]++,最后结尾的编号为j,cnt[j]++ 查询,每个字符对应编号为i,不 ... 使用CRD扩展Kubernetes API本文是如何创建 CRD 来扩展 Kubernetes API 的教程.CRD 是用来扩展 Kubernetes 最常用的方式,在 Service Mesh 和 Operator 中也被大量使用.因此读 ... Go语言核心36讲07在前文中,我解释过代码块的含义.Go语言的代码块是一层套一层的,就像大圆套小圆. 一个代码块可以有若干个子代码块:但对于每个代码块,最多只会有一个直接包含它的代码块(后者可以简称为前者的外层代码块). ... 【经验分享】配置用户通过Console口登录设备示例组网需求 当用户无法进行远程登录设备时,可通过Console口进行本地登录.缺省情况下,使用Console用户界面登录设备时只需要密码认证.为了防止非法用户登录设备,修改Console用户界面的认证方 ... 基于python的数学建模---logicstic回归樱花数据集的Logistic回归 绘制散点图 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets impo ... 第三方模块的下载与使用、requests模块、爬取链家二手房数据、openpyxl模块、hashlib加密模块目录 第三方模块的下载与使用 下载第三方模块可能会出现的问题 网络爬虫模块之requests模块 网络爬虫实战之爬取链家二手房数据 自动化办公领域之openpyxl模块 第三方模块的下载与使用 第三方 ... Web Api出现500 Internal Server Error 错误在测试环境一切正常,但是部署到了生产环境发现一直报错.查询网上的方法设置了权限等等.都没有解决 原来发现是数据库连接字符串的问题.只需要把数据库连接字符串修改正确即可! |
CopyRight 2018-2019 实验室设备网 版权所有 |