Unity中关于ScrollRect组件完整解决方案(ScrollRect中元素自动排版+ScrollRect中元素自动定位到Viewport可见范围内)

这篇具有很好参考价值的文章主要介绍了Unity中关于ScrollRect组件完整解决方案(ScrollRect中元素自动排版+ScrollRect中元素自动定位到Viewport可见范围内)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个教程可以实现点击我这个视频中所示的效果

一、元素自动排版功能

1、首先要往我们的unity项目中导入两个脚本文件,脚本文件名称分别是UIScrollEventListener和CZScrollRect,这两个脚本文件代码如下所示。

1-1、介绍UIScrollEventListener脚本写法。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class UIScrollEventListener : MonoBehaviour, IBeginDragHandler, IEndDragHandler , IPointerUpHandler, IPointerDownHandler , IDragHandler
{
   
    public delegate void VoidDelegate(PointerEventData pdata);
    public VoidDelegate onBeginDrag;
    public VoidDelegate onEndDrag;
    public VoidDelegate onUp;
    public VoidDelegate onDown;
    public VoidDelegate onDrag;
    bool isDrag = false;
    List<Image> registers = new List<Image>();

    public static UIScrollEventListener Get(GameObject go)
    {
   
        UIScrollEventListener listener = go.GetComponent<UIScrollEventListener>();
        if (listener == null) listener = go.AddComponent<UIScrollEventListener>();
        return listener;
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
   
        isDrag = true;
        if (onBeginDrag != null) onBeginDrag(eventData);
    }

    public void OnEndDrag(PointerEventData eventData)
    {
   
        isDrag = false;
        if (onEndDrag != null) onEndDrag(eventData);
    }

    public void OnPointerUp(PointerEventData eventData)
    {
   
        if (!isDrag) {
   

            SetRegisterEvent(true);
            PraseObject(eventData);
            SetRegisterEvent(false);
        }
        if (onUp != null) onUp(eventData);
    }

    public void OnPointerDown(PointerEventData eventData)
    {
   
        if (onDown != null) onDown(eventData);
    }

    public void OnDrag(PointerEventData eventData) {
   

        if (onDrag != null) onDrag(eventData);
    }

    public void RegisterButton(GameObject go)
    {
   
        Image img = go.GetComponent<Image>();
        if (img != null)
        {
   
            img.raycastTarget = false;
            registers.Add(img);
        }
    }

    void SetRegisterEvent(bool b) {
   

        if (registers.Count > 0)
        {
   
            for (int i = 0; i < registers.Count; ++i)
            {
   
                registers[i].raycastTarget = b;
            }
        }
    }

    void PraseObject(PointerEventData eventData) {
   

        if (registers.Count > 0)
        {
   
            for (int i = 0; i < registers.Count; ++i)
            {
   
                if (EventSystem.current != null)
                {
   
                    List<RaycastResult> result = new List<RaycastResult>();
                    EventSystem.current.RaycastAll(eventData, result);
                    foreach (RaycastResult r in result)
                    {
   
                        //Debug.Log(r.gameObject.name);
                        foreach (Image img in registers)
                        {
   

                            if (img.gameObject.Equals(r.gameObject))
                            {
   

                                InputField inputfield = img.gameObject.GetComponent<InputField>();
                                if (inputfield != null) inputfield.ActivateInputField();
                            }

                        }
                    }
                }
            }
        }
    }

}
1-2、介绍CZScrollRect脚本写法。
using System;
using UnityEngine;
using UnityEngine.UI;

public class ScrollObj
{
   
    public GameObject obj;
    public int dex;
}

public class CZScrollRect
{
   

    public enum TipType
    {
   
        UNDO_REFRESH = 0,
        PULL_REFRESH = 1,
        UNDO_APPEND = 2,
        PULL_AAPEND = 3,
        NODATA = 4,
        NONE = 5
    }

    const int OPEAT_HEIGHT = 100;//高度差判断操作类型
    const int INIT_NUM_LIMIT = 8;//列表实例化个数

    public delegate void OperatDelegate();
    public delegate void OperatObjDelegate(GameObject obj , int index);
    public delegate void OperatTextObjDelegate(GameObject obj, TipType t);
    public OperatDelegate onRefresh;//下拉刷新时回调
    public OperatDelegate onAppend;//需要加载更多时回调
    public OperatObjDelegate onScrollObj;//需刷新时回调
    public OperatTextObjDelegate onUpdateTextObj;//需刷新文本状态时回调

    public ScrollRect scrollRect;//ScrollRect
    private RectTransform scrollRectContent;//RectTransform
    public GameObject prefab;//实例化的对象
    public GameObject text_up;//下拉刷新文本
    public GameObject text_down;//上拉加载更多文本

    TipType textup_status;

    int opeartLen = 0;//记录总长度
    public int layoutwidth = 1242;//填写item的长度
    public int limitNum = 8;//列表实例化个数
    public float interval = 200;//每个item的高度
    public float spacing = 5;//每个tiem的间隔

    ScrollObj[] list;//用于管理生成的对象
    int opeartType;
    int pageindex;//页码
    bool bHasMore;//是否能加载更多
    int halfWidth;

    //
    public GameObject batchContent;

    public CZScrollRect()
    {
   
        opeartType = -1;
        hasMore = false;
    }

    /// <summary>
    /// 用于控制scrollrect是否能够滑动
    /// (用于等待网络请求等业务)
    /// </summary>
    public bool vertical
    {
   
        get{
   
            return scrollRect.vertical;
        }set{
   
            scrollRect.vertical = value;
        }
    }

    /// <summary>
    /// 是否存在更多
    /// </summary>
    public bool hasMore
    {
   
        get{
   
            return bHasMore;
        }set{
   
            bHasMore = value;
        }
    }

    /// <summary>
    /// 获取对象所在的索引
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public int GetObjIndex(GameObject obj) {
   

        for(int i = 0; i < list.Length; ++i)
        {
   
            if (obj.Equals(list[i].obj))
            

文章来源地址https://www.toymoban.com/news/detail-830793.html

到了这里,关于Unity中关于ScrollRect组件完整解决方案(ScrollRect中元素自动排版+ScrollRect中元素自动定位到Viewport可见范围内)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity 3D ScrollRect和ScrollView回弹问题的解决

    Content高度 全部Cell加在一起的总高 他就认为你的全部Cell加起来就跟Content一样大,所以才出现了这种完全回弹 很简单, 改变Content的长度跟所有Cell的和一样大 更简单一点的组件方式,挂到Layout组件上

    2024年03月25日
    浏览(27)
  • 微信网页授权之使用完整服务解决方案

    目录 微信网页授权能力调整造成的问题 能力调整的内容和理由 原有运行方案 is_snapshotuser字段  改造原有方案 如何复现测试场景 小结 依附于第三方的开发,做为开发者经常会遇到第三方进行规范和开发的调整,如开发腾讯微信的相关应用。我所经历的如小程序隐私政策调整

    2024年02月20日
    浏览(25)
  • 【Python错误:无法找到模块xxx】——完整解决方案

    【Python错误:无法找到模块xxx】——完整解决方案 在使用Python编程过程中,经常会遇到无法找到模块的错误。当你试图导入一个模块时,Python会在搜索路径中查找该模块。如果无法找到该模块,则会出现“no module named xxx”的错误提示。本文将提供一些常见的解决方案,帮助

    2024年02月05日
    浏览(42)
  • “高速数据线缆”自动化测试系统,提供完整解决方案

    一、概述        高速线缆自动化测试系统针对高速线缆测试需求提供完整解决方案,支持多种线缆规格全自动化测试,支持多种测试标准,系统提供一键测试方案,快速帮助用户解决研发、生产阶段各种线缆测试问题。         系统基于多端口矢量网络分析仪,利用多端口

    2023年04月08日
    浏览(32)
  • 微信小程序没法获取用户地理位置完整解决方案

    微信小程序官方文档提示:自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响 为了查找没法定位原因花了半个小时时间认真查看官方文档,最后把wx.getLocation(Object object)接口失败

    2024年02月12日
    浏览(38)
  • Mybatis generator实战:自动生成POJO类完整解决方案

    在用Mybatis generator 生成可以用来访问(多个)表的基础对象,遇到一个问题,就是columnRenamingRule可以替换所有表元素里字段前缀 但是如果想去掉所有表的前缀,比如有多个表: 期望得到的POJO结果是: 参照: https://github.com/mybatis/generator/issues/275 https://github.com/mybatis/generator/

    2024年02月04日
    浏览(29)
  • 从人力外包到测试工具与平台:打造完整的测试解决方案

    随着学社的学员越来越多,影响力越来越大,不停有学员和企业问我们:能否提供人员外包服务?与此同时,企业对于外包人员的业务技能要求也越来越高,寻找一个稳定靠谱的供应商也成了很多学员所在公司的需求。对此,学社推出了专业的外包解决方案,有这方面的需求

    2024年04月22日
    浏览(27)
  • Amazon SageMaker:搭建企业级AI模型的完整解决方案

    人工智能仍处于科技浪潮之巅… 随着智能芯片、大数据和云计算的发展,深度学习技术得到进一步升级。以 ChatGPT 为首的AIGC技术大放异彩:AI绘画、AI作曲、AI编程、AI写作…一系列AI产品赋能生产;边缘计算、联邦学习、多智能体等技术逐渐从学术界走向工业界,提高生产效

    2023年04月15日
    浏览(36)
  • ColossalChat:使用完整的 RLHF Pipeline复现ChatGPT 的开源解决方案

            ChatGPT、GPT-4等大型AI模型和应用在全球范围内风靡一时,成为技术产业革命和AGI(Artificial General Intelligence)发展的基础。 不仅科技巨头竞相发布新品,许多来自学术界和产业界的人工智能专家也加入了相关的创业浪潮。 生成式 AI 每天都在快速迭代,不断完善!  

    2023年04月24日
    浏览(29)
  • 聚焦制造业,不工软件携手微软发力完整供应链解决方案

    微软公司宣布推出 微软供应链平台 (Microsoft Supply Chain Platform),该平台灵活整合了微软卓越的 AI、协作、低代码、安全和 SaaS 应用,以开放的态度,帮助企业从供应链数据资产投资中获取最高的回报。在实现客户供应链的韧性和敏捷性方面,越来越多的微软合作伙伴生态加

    2024年03月12日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包