Unity SnapScrollRect 滚动 匹配 列表 整页

这篇具有很好参考价值的文章主要介绍了Unity SnapScrollRect 滚动 匹配 列表 整页。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

展示效果

Unity SnapScrollRect 滚动 匹配 列表 整页,unity,游戏引擎,ScrollRect,回滚


原理:

当停止滑动时

判断Contet的horizontalNormalizedPosition

与子Item的缓存值 相减,并得到最小值,然后将Content  horizontalNormalizedPosition滚动过去

使用方式:

直接将脚本挂到ScrollRect上

注意:在创建Content子物体时 或子物体数量变更,需要调用Refresh文章来源地址https://www.toymoban.com/news/detail-812530.html

代码:

namespace ShangShangQian.Component
{
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    using System.Linq;
    using UnityEngine.Events;

    [RequireComponent(typeof(ScrollRect))]
    public class SnapScrollRect : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
    {
        private RectTransform content;
        private ScrollRect rect;

        /// <summary>
        /// content 的位置应该滚到什么
        /// </summary>
        public float target = 1;

        /// <summary>
        /// 回滚的速度 0-1 越小越快
        /// </summary>
        public float smooting = 0.25f;
        public float currentVelocity;

        public float horizontalNormalizedPosition;

        public List<float> values = new List<float>();
        public List<float> distances = new List<float>();
        public List<RectTransform> items = new List<RectTransform>();

        /// <summary>
        /// 是否拖拽中
        /// </summary>
        public bool isDrag = false;

        /// <summary>
        /// 到最近item的距离
        /// </summary>
        public float distanceMin;

        /// <summary>
        /// 到最近item的索引
        /// </summary>
        public int selectIndex;

        /// <summary>
        /// 是否匹配滑动中
        /// </summary>
        public bool Snaping = false;

        /// <summary>
        /// 回滚完毕后调用
        /// </summary>
        public UnityEvent<int> OnSnap;

        void Start()
        {
            rect = GetComponent<ScrollRect>();
            content = rect.content;
        }

        /// <summary>
        /// 刷新数据,content的子物体数量变更时需要调用此函数
        /// </summary>
        public void Refresh()
        {
            items.Clear();
            values.Clear();
            for (int i = 0; i < content.childCount; i++)
            {
                if (content.GetChild(i).gameObject.activeInHierarchy)
                {
                    items.Add(content.GetChild(i).GetComponent<RectTransform>());
                }
            }

            //累加的变量
            values.Add(0);
            //每一个格子的所占比多少  
            float v = 1f / (items.Count - 1);
            for (int i = 1; i < items.Count; i++)
            {
                values.Add(i * v);
            }

            //不同子元素数量 item 对应 的content  horizontalNormalizedPosition 数值
            //1  0  
            //2  0 1   
            //3  0 0.5 1
            //4  0 0.33 0.66 1
        }

        void Update()
        {
#if UNITY_EDITOR
            if (Input.GetKeyDown(KeyCode.A))
            {
                Refresh();
            }
#endif
        }

        void FixedUpdate()
        {
            horizontalNormalizedPosition = rect.horizontalNormalizedPosition;

            if (isDrag)
            {
                return;
            }

            if (Snaping)
            {
                rect.horizontalNormalizedPosition = Mathf.SmoothDamp(rect.horizontalNormalizedPosition, target, ref currentVelocity, smooting);
                if (Mathf.Abs(rect.horizontalNormalizedPosition - values[selectIndex]) < 0.001f)
                {
                    Snaping = false;
                    Debug.Log("回滚:" + selectIndex);
                    OnSnap.Invoke(selectIndex);
                }
            }

        }

        public void OnBeginDrag(PointerEventData eventData)
        {
            isDrag = true;
        }

        public void OnDrag(PointerEventData eventData)
        {
            isDrag = true;
        }

        public void OnEndDrag(PointerEventData eventData)
        {
            isDrag = false;

            Snaping = true;

            distances.Clear();

            //当松手后判断那个距离最近
            for (int i = 0; i < values.Count; i++)
            {
                distances.Add(Mathf.Abs(rect.horizontalNormalizedPosition - values[i]));
            }

            distanceMin = distances.Min();

            selectIndex = distances.FindIndex(b => b == distanceMin);
            target = values[selectIndex];
            rect.StopMovement();
        }


        /// <summary>
        /// 滚到到指定位置
        /// </summary>
        /// <param name="index"></param>
        public void SnapToIndex(int index)
        {
            Snaping = true;
            selectIndex = index;
            target = values[selectIndex];
        }
    }
}

到了这里,关于Unity SnapScrollRect 滚动 匹配 列表 整页的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity游戏,插入聚合广告TopOn,优量汇,穿山甲,groMore,快手等,隐私协议解决方案!(包括传感器的使用目的和方式,还有Sdk使用Mac地址和软件列表的目的)

    很久以前参考别的大佬的代码,忘了来源,因为新游戏增加了一些东西,上架TapTap不合格,原因是少了传感器的使用目的和方式,还有Sdk使用Mac地址和软件列表的目的。 所以补充了传感器和软件列表。 只需要把这个代码放到UNITY项目的Editor目录,打包就有弹窗。

    2024年02月13日
    浏览(100)
  • Unity 中创建滚动文本

    首先创建Image(note)   在note下面再创建一个Image(作为背景) 为了实现滚动效果,在Image上面添加Scroll Rect这个组件 同时选定对象(Content) 如果需要制作横向的滚动条,则勾选Horizontal,反之,纵向勾选Vertical 然后添加text文本,根据自身需求调整文字大小 将text放在Image下作

    2024年02月12日
    浏览(36)
  • unity实现数字滚动动画效果

    要在 Unity 中实现数字滚动动画效果,你可以使用以下步骤: 创建一个新的 Unity 项目。 在场景中添加一个 UI 文本控件。 在 C# 脚本中,使用 coroutine 实现动画效果。 在每一帧中更新 UI 文本的数字,并通过计算得出下一个数字的位置。 在动画结束后,使用 StopCoroutine 停止动画

    2024年02月10日
    浏览(46)
  • Unity UGUI制作字幕滚动效果,长字幕左右来回滚动

    效果: 描述: 当文字长度小于边框时保持在边框的中间,长度大于边框时来回滚动 使用时调用此方法: 创建: 创建一个Image并调整大小 在Image下创建Text并调整Text的大小,颜色等参数 将TextScroll 挂载到Image上并调整TextScroll参数 代码使用了动态添加组件,确保组件能正常使用

    2024年02月07日
    浏览(46)
  • unity | 动画模块之滚动选项框

    一、效果动画 如果不是你们想要的,就省的你们继续往下看了  二、作者的话 对于我来说,计算一大堆数据很繁琐,就写了点简单的 三、基本功的要求 需要会使用Scroll View 四、进入正题  1.先做一个scrollView把自己想做的东西放进去 2.接下来的难度就是,当方块块移动到指定

    2024年02月03日
    浏览(29)
  • Unity 如何实现卡片循环滚动效果

    功能需求如图所示,点击下一个按钮,所有卡片向右滚动,其中最后一张需要变更为最前面的一张,点击上一个按钮,所有卡片向左滚动,最前面的一张需要变更为最后一张,实现循环滚动效果。 最中间的一张表示当前选中项,变更为选中项的滚动过程中,需要逐渐放大到指

    2024年02月03日
    浏览(51)
  • UGUI-Unity滚动文本设计

    目录 前言 一、设计步骤 1.在Hierarchy窗口右键UI,创建Image  2.在NoteBG下创建Text文本框,并添加文字内容  3.在NoteBG下创建新的Image  4.在TextBG上添加Unity自带的脚本Scroll Rect和Mask 5.在NoteBG下添加滚轮Scrollbar 6.将Scrollbar组件挂载到TextBG组件中Scroll Rect脚本的Vertiacl Scrollbar属性 滑动

    2024年02月08日
    浏览(44)
  • unity scrollview滚动到指定的位置

    方法一:通过下标 方法二:原文1 原文2 方法一没测试 这里给方法二增加注释理解 图1 图2 图3 图4

    2024年01月20日
    浏览(41)
  • Unity Scroll Rect滚动到底部

    在使用ScrollView的时候,有这么一个需求,就是ScrollView的内容中填充的是一个动态的列表,在新添加元素的时候,需要将滚动列表自动定位到最后一个。 1、修改Scrollbar Vertical的value 值为0时,位于底部,值为1时,位于顶部。 2、修改ScrollRect的verticalNormalizedPosition 值为0时,位于

    2023年04月08日
    浏览(43)
  • Unity ScrollView循环滚动播放(有详细注释)

    首先创建一个ScrollView在UI上 在Content上挂载脚本,将ScrollView赋值给Parent。 当Content的高度大于ScrollView的容量高度时便开始滚动。 以下是脚本代码: 效果如下(结尾和开头会停留1秒):

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包