Unity UGUI ScrollRect 滑动显示左右箭头

目录

一、前言

二、效果 

三、代码解析

EnhancedScrollRect.cs 解析

Start 方法

HandleArrowVisibility 方法

EnhancedScrollRectEditor.cs 解析

OnEnable 方法

OnInspectorGUI 方法

四、完整代码

EnhancedScrollRect.cs

EnhancedScrollRectEditor.cs

五、总结


Demo链接: 

https://download.csdn.net/download/qq_41973169/89428682icon-default.png?t=N7T8https://download.csdn.net/download/qq_41973169/89428682

一、前言

Unity版本:2022.3.x

在Unity游戏开发中,ScrollRect是一个常用的UI组件,用于实现可滚动的内容区域。然而,默认的ScrollRect组件并不提供对内容边缘的指示功能,例如在内容可以向左或向右继续滚动时显示箭头。为了解决这个问题,我们扩展了ScrollRect组件,增加了两个箭头指示器(leftArrow和rightArrow),用于提示用户当前内容是否可以继续滚动。这两个脚本分别是EnhancedScrollRect.csEnhancedScrollRectEditor.cs

二、效果 

三、代码解析

EnhancedScrollRect.cs 解析

Start 方法

Start方法中,我们首先调用了基类的Start方法,然后添加了一个监听器,当ScrollRect的值改变时触发HandleArrowVisibility方法。接着,我们检查内容是否有ContentSizeFitter组件,如果有的话,我们强制立即重建布局以确保内容的尺寸正确。最后,我们手动调用一次HandleArrowVisibility方法,以初始化箭头的可见性。

protected override void Start()
{base.Start();onValueChanged.AddListener(HandleArrowVisibility);var contentSizeFitter = content.GetComponent<ContentSizeFitter>();if (!contentSizeFitter.IsUnityNull()){LayoutRebuilder.ForceRebuildLayoutImmediate(content);}HandleArrowVisibility(new Vector2());
}

HandleArrowVisibility 方法

HandleArrowVisibility方法主要用于根据内容的位置来更新箭头的可见性。首先,我们检查各种关键组件是否为null,如果有任何一个为null,则直接返回。然后,我们计算内容的起始位置和结束位置,并根据这些位置判断是否应该显示左右箭头。

private void HandleArrowVisibility(Vector2 position)
{if (content.IsUnityNull() || viewport.IsUnityNull() || leftArrow.IsUnityNull() || rightArrow.IsUnityNull()){return;}var contentStart = content.anchoredPosition.x;var contentEnd = contentStart + content.rect.width - viewport.rect.width;leftArrow.gameObject.SetActive(contentStart < -1.0f);rightArrow.gameObject.SetActive(contentEnd > 1.0f);
}

EnhancedScrollRectEditor.cs 解析

OnEnable 方法

OnEnable方法中,我们首先调用基类的OnEnable方法,然后使用serializedObject.FindProperty方法查找leftArrowrightArrow属性,并将结果存储在相应的变量中。

protected override void OnEnable()
{base.OnEnable();_leftArrow = serializedObject.FindProperty("leftArrow");_rightArrow = serializedObject.FindProperty("rightArrow");
}

OnInspectorGUI 方法

OnInspectorGUI方法中,我们首先调用基类的OnInspectorGUI方法,然后更新序列化对象的状态。接着,我们使用EditorGUILayout.PropertyField方法绘制leftArrowrightArrow属性的编辑字段。最后,我们应用修改并在检测到GUI发生变化时,将目标对象标记为脏,以确保更改被保存。

public override void OnInspectorGUI()
{base.OnInspectorGUI();serializedObject.Update();EditorGUILayout.PropertyField(_leftArrow);EditorGUILayout.PropertyField(_rightArrow);serializedObject.ApplyModifiedProperties();if (GUI.changed){EditorUtility.SetDirty(target);}
}

四、完整代码

EnhancedScrollRect.cs

using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;public class EnhancedScrollRect : ScrollRect
{[SerializeField] private RectTransform leftArrow;[SerializeField] private RectTransform rightArrow;protected override void Start(){base.Start();onValueChanged.AddListener(HandleArrowVisibility);var contentSizeFitter = content.GetComponent<ContentSizeFitter>();if (!contentSizeFitter.IsUnityNull()){LayoutRebuilder.ForceRebuildLayoutImmediate(content);}HandleArrowVisibility(new Vector2());}private void HandleArrowVisibility(Vector2 position){if (content.IsUnityNull() || viewport.IsUnityNull() || leftArrow.IsUnityNull() || rightArrow.IsUnityNull()){return;}var contentStart = content.anchoredPosition.x;var contentEnd = contentStart + content.rect.width - viewport.rect.width;leftArrow.gameObject.SetActive(contentStart < -1.0f);rightArrow.gameObject.SetActive(contentEnd > 1.0f);}
}

EnhancedScrollRectEditor.cs

using UnityEditor;
using UnityEditor.UI;
using UnityEngine;[CustomEditor(typeof(EnhancedScrollRect), true)]
[CanEditMultipleObjects]
public class EnhancedScrollRectEditor : ScrollRectEditor
{private SerializedProperty _leftArrow;private SerializedProperty _rightArrow;protected override void OnEnable(){base.OnEnable();_leftArrow = serializedObject.FindProperty("leftArrow");_rightArrow = serializedObject.FindProperty("rightArrow");}public override void OnInspectorGUI(){base.OnInspectorGUI();serializedObject.Update();EditorGUILayout.PropertyField(_leftArrow);EditorGUILayout.PropertyField(_rightArrow);serializedObject.ApplyModifiedProperties();if (GUI.changed){EditorUtility.SetDirty(target);}}
}

五、总结

通过这两个脚本,我们扩展了Unity的ScrollRect组件,使其能够根据内容的滚动状态显示左右箭头,提示用户内容可以继续滚动。此外,我们还自定义了编辑器,可以在Inspector窗口中方便地设置左右箭头的引用。这种扩展方法既保留了原有组件的所有功能,又增强了用户体验,是一种推荐的组件扩展方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql开启binlog

# server-id表示单个结点的id&#xff0c;这里由于只有一个结点&#xff0c;所以可以把id随机指定为一个数&#xff0c;这里将id设置成1。若集群中有多个结点&#xff0c;则id不能相同 server-id1 # log-bin日志文件的名字为mysql-bin&#xff0c;以及其存储路径 log-bin/usr/l…

pointnet

train_classification.py 把第91行修改为自己的路径&#xff0c;就可以运行了 test_cla.py&#xff0c;需要训练完才能运行测试&#xff0c;我没训练完&#xff0c;所以报错显示我没有best.pth文件 网盘里面是我运行的训练和测试的视频&#xff0c;以及源代码&#xff0c;数…

STM32CUBEIDE使用技巧

一、创建文件 二、菜单栏和工具栏说明 三、编译/下载/仿真调试 1、编译的两种模式 Debug模式和Release模式&#xff0c;Debug模式在调试阶段时使用&#xff0c;Release模式在项目完结发给客户时使用&#xff0c;Release模式不能使用单步调试功能。 2、下载方式 下载可以在ST…

构建数字孪生微电网,实现能源系统一体化管控

图扑利用自主研发引擎 HT for Web 将 Web 智慧“双碳”微电网场景进行数字孪生&#xff0c;有效实现源网荷储一体化管控。整体场景采用了轻量化建模的方式&#xff0c;重点围绕智慧园区电网联通中的源、网、荷、储四方面的设备和建筑进行建模还原&#xff0c;为用户带来“赛博朋…

Causal Effect Identification in Uncertain Causal Networks

我们采用以下六个分类标准为: 数据模态: 观察数据: 这类数据是在没有研究人员任何干预的情况下收集的。它通常很容易获得,但由于潜在的混杂变量而带来挑战。例如,在流行病学中,由于实验的伦理限制,观察性研究很常见。参考文献[6]讨论了观察性研究中因果效应的识别和估计…

17种JMeter 逻辑控制器

前言 JMeter提供了17种逻辑控制器&#xff0c;它们各个功能都不尽相同&#xff0c;其作用域只对其子节点的sampler有效&#xff0c;作用是控制采样器的执行顺序。 控制测试计划执行过程中节点的逻辑执行顺序&#xff0c;如&#xff1a;Loop Controller、If Controller等&…

LVS+Keepalived高可用负载均衡群集

目录 一.高可用群集相关概述 1.高可用&#xff08;HA&#xff09;群集与普通群集的比较 普通群集 高可用群集&#xff08;HA&#xff09; 两者比较 2.Keepalived高可用方案 3.Keepalived的体系模块及其作用 4.Keepalived实现原理 二.LVSKeepAlived高可用负载均衡集群的…

github 本地仓库上传及报错处理

一.本地文件上传 这里为上传部分&#xff0c;关于gitbash安装配置&#xff0c;读者可自行搜索&#xff0c;由于已经安装完成&#xff0c;未进行截图保存&#xff0c;这里便不做赘述。 1.登录git账号并创建一个仓库 点击仓库打开后会看到这个仓库的网址链接&#xff08;这个链…

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[1]-最新版快速实践并部署(检索增强生成RAG大模型)

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[1]-最新版快速实践并部署(检索增强生成RAG大模型) 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现,开源、可离线部署的检索增强生成(RAG)大模型知识库项目。 1.介绍 一种利用 langchain思想实现的基于本地知…

Java实际工作里用到的几种加密方式

1、Base64加密 最简单的加密方式&#xff0c;甚至可以说不是加密&#xff0c;只是一种用64个字符表示任意二进制数据的方法。Base64编码原理是将输入字符串按字节切分&#xff0c;取得每个字节对应的二进制值&#xff08;若不足8比特则高位补0&#xff09;&#xff0c;然后将这…

U盘文件删除如何恢复?4个实用技巧(含图文)

“我的u盘里保存了很多重要的文件&#xff0c;但是不知道为什么部分文件丢失&#xff0c;有什么方法可以帮我快速恢复u盘文件的吗&#xff1f;希望大家帮帮我&#xff01;” U盘作为我们日常存储和传输数据的重要工具&#xff0c;其数据的安全性和可恢复性尤为重要。当U盘中的文…

shell查询文件中的内容

背景&#xff1a;给定10G大文件&#xff0c;直接打开文件然后再搜索关键字可能会造成电脑卡死&#xff0c;因而采用shell查询。 实现方法方案&#xff1a; 在Unix/Linux shell环境中&#xff0c;您可以使用grep命令来查找文件中包含特定内容的行。如果您想找到文件中“做好自…

redis 一些笔记1

redis 一、redis事务二、管道2.1 事务与管道的区别 三、主从复制3.13.2 权限细节3.3 基本操作命令3.4 常用3.4.1 一主几从3.4.2 薪火相传3.4.3 反客为主 3.5 步骤3.6 缺点 一、redis事务 放在一个队列里&#xff0c;依次执行&#xff0c;并不保证一致性。与mysql事务不同。 命…

光储充一体化充电站:能源革新的绿色引擎

在这个科技日新月异的时代&#xff0c;一场绿色能源的革命正悄然兴起。 光储充一体化充电站&#xff0c;作为这场革命中的璀璨明星&#xff0c;正以其独特的魅力&#xff0c;引领我们走向更加环保、高效的未来。 光储充一体化充电站&#xff0c;顾名思义&#xff0c;将光伏发电…

kotlin之foreach跳出循环

1.创建函数跳出循环。 fun breakTest() {(0..10).forEachIndexed { index, i ->Log.d("test start index$index,i$i")if (index > 7) {return}Log.d("test end index$index,i$i")}}2.通过run语句&#xff0c;将会在if判断语句为true的时候跳出run代…

淘宝/天猫商品详情优惠券获取API 接口

天猫商品优惠券数据API接口是一种用于获取天猫商品优惠券信息的接口。通过该接口&#xff0c;商家或开发者可以获取到商品的优惠券信息&#xff0c;包括优惠券的名称、金额、使用条件等。 该接口的主要参数包括商品ID、优惠券ID等&#xff0c;通过传入这些参数&#xff0c;可以…

争取比ChatGPT多知道一点,如何创建和使用embedding?

如何生成embedding&#xff1f; 这个问题很简单&#xff0c;可以直接问ChatGPT。即使是3.5的版本&#xff0c;也可以得到不错的回复&#xff1a; 我这里贴一下它给出的代码&#xff0c;首先是TensorFlow2版本&#xff1a; 接着是pytorch版本&#xff1a; 这两个版本的embeddin…

node配置热更新nodemon

nodemon 安装 全局或者开发依赖都可以 npm install nodemon -g npm install nodemon -D配置 文件配置nodemon.json {"watch": [ // 改动后需要编译成es5的源文件目录和配置等目录以及文件"./src","./conf",".env"],"ext&quo…

使用ftp上传文件

一. 服务器部分 // 安装 yum install vsftpd -y systemctl start vsftpd// 查看ftp是否安装成功&#xff0c;21号端口是ftp就是安装成功 netstat -nltp | grep 21// 创建用户名和设置用户密码 useradd ftpfile echo "ftpfile" | passwd ftpfile --stdin// 开启ftp的…

【Unity】RPG2D龙城纷争(一)搭建项目、导入框架、前期开发准备

更新日期&#xff1a;2024年6月12日。 项目源码&#xff1a;后续章节发布 免责声明&#xff1a;【RPG2D龙城纷争】使用的图片、音频等所有素材均有可能来自互联网&#xff0c;本专栏所有文章仅做学习和教程目的&#xff0c;不会将任何素材用于任何商业用途。 索引 【系列简介】…