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;//ScrollRectprivate RectTransform scrollRectContent;//RectTransformpublic 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))

这篇关于Unity中关于ScrollRect组件完整解决方案(ScrollRect中元素自动排版+ScrollRect中元素自动定位到Viewport可见范围内)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726159

相关文章

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/