Unity 您所在的位置:网站首页 1129374656_16767042048501njpg Unity

Unity

2023-03-27 23:46| 来源: 网络整理| 查看: 265

今天学习:Unity - UGUI - 无限滚动

目录

今天学习:Unity - UGUI - 无限滚动

版本:

一:思路分享(Share idea)

二:脚本编写(Scripts)

三:场景面板布置(Hierarchy)

四:运行结果(Running Result)

希望大家:点赞,留言,关注咯~

唠家常

今日无推荐

版本:

1、Unity 2020.3.10f1

时隔多周,在这里分享出来一点最近的功能吧。

借助UGUI - ScrollView,进行更改,并且实现无限滑动!!!!!!!!

一:思路分享(Share idea)

大概就是下边这个巨作的思路,希望对大家有个思想考量方向,不过不能因为我而放弃了自己的想法,适合自己的才是最好的。说不定你自己的思路比我的还好,不过功能要的快,所以我就百度了,发现早就有大佬们实现了,所以找了一篇下来,刚好满足需求。不过我还是要把自己思路分享出来!!!

画画技术水平有限,见谅。。。。。。。

1、上来获取最上一排的位置信息和宽高度;

2、设置一个触发高度/宽度位置;

3、当再移动的过程中每排最指定节点的高度大于/小于,指定触发点时,重新设置位置到第一排/最后一排的位置,反复如此。

4、在更改位置时,对要被更改的子节点进行设置相关索引或者其他一系列操作。

二:脚本编写(Scripts)

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个子节点。

四:运行结果(Running Result)

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应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ...

无限滚动 --demo

xxx.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 实验室设备网 版权所有