unity中scrollrect组件的使用,viewport必须选择(制作内容滑动模块)

scrollrect组件:
制作内容页面滑动效果,例如任务界面,关卡选择界面,所有超出可视范围的内容,都可以使用。

完整示例如图:
在这里插入图片描述
上图任务界面,可以上下滑动查看其他任务。

scrollrect组件需求:(此处没有选择添加滑动条,需要的话,创建一个scrollbar,拖入组件响应位置即可
1,一个带有mask遮罩的物体,限定内容展示范围
2,一个内容集合的父物体,动态生成的内容可以选择添加网格或者水平布局组件
3,一个添加scrollrect组件的物体,用于设置组件的各种属性
此时选择,物体3作为1的子物体,物体2作为3的子物体:
在这里插入图片描述
分别添加组件:注意此时选择的mask组件为Rect Mask 2D,选择Mask是无效的
在这里插入图片描述

关于遮罩和Group的设置,此处略过不写,开始设置scrollRect组件:
首先把parent物体拖入content,设置展示的内容;
其次把TaskAggregateMask拖入viewport,设置可视范围。

然后基本的滑动设置完成,可根据你的内容范围,勾选水平或者垂直滑动。

另外unity提供了三个不同的滑动效果可供选择,在momentType一栏中,可以选择:
1,不限制的(unrestricked)
任意滑动,不建议选择,内容框会滑出可视区域,导致无法返回。
2,弹性的(Elastic)
根据设置的弹性数值,滑动的内容有一定的回弹效果,在开始或者结束的时候,向内容外滑动,会自动回弹。建议弹性值设为0.1-0.5之间,效果比较Q弹。
3,已钳制(clamped)
根据内容的长短进行滑动,没有弹性效果,滑多少就动多少,看起来比较死板~~

最后一个是content Size Fitter的使用小技巧:
自适应大小是围绕着物体的轴心进行匹配的,所以修改轴心的位置,可以使自动扩展向着想要的方向去扩展。例如:
选择轴心(1,1),则扩展会向下进行扩展。

此处哀声一下,刚开始自己没有指定viewport,不论选哪个momentType,都无法达到预期。
弹性和钳制直接不能滑动,强烈建议unity能加个必选的提示,关键是它这个viewport在编辑器里也没有文字说明~!

### 获取 UnityScrollRect 滚动后可见文本内容的方法 在 Unity 的 UI 系统中,`ScrollRect` 是一种用于滚动视图的核心组件。为了实现获取 `ScrollRect` 滑动后可见区域内的文本内容的功能,可以采用以下方法: #### 方法概述 通过计算 `ScrollRect` 可见区域内子对象的位置以及它们相对于父容器的坐标关系来判断哪些文本项处于当前可视范围内[^1]。 以下是具体实现方式的一个例子: ```csharp using UnityEngine; using UnityEngine.UI; public class VisibleTextGetter : MonoBehaviour { public ScrollRect scrollRect; // 绑定到你的 ScrollRect 对象上 public RectTransform contentPanel; // ScrollView 内部 Content 面板 public float padding = 0f; // 容差范围,防止边界误判 private void Update() { if (scrollRect != null && contentPanel != null) { GetVisibleItems(); } } private void GetVisibleItems() { Vector2 viewPortPositionMin = scrollRect.viewport.rect.position; Vector2 viewPortPositionMax = new Vector2( viewPortPositionMin.x + scrollRect.viewport.rect.width, viewPortPositionMin.y + scrollRect.viewport.rect.height); foreach (RectTransform child in contentPanel) { Rect itemBounds = RectTransformUtility.CalculateRelativeAnchorBounds(contentPanel, child); bool isVisibleX = itemBounds.xMin <= viewPortPositionMax.x + padding && itemBounds.xMax >= viewPortPositionMin.x - padding; bool isVisibleY = itemBounds.yMin <= viewPortPositionMax.y + padding && itemBounds.yMax >= viewPortPositionMin.y - padding; if (isVisibleX && isVisibleY) { Debug.Log(child.gameObject.name); // 输出可见项名称或其关联文本内容 } } } } ``` 上述脚本实现了动态检测 `ScrollRect` 当前可见区域中的所有子物体,并打印出这些子物体的名字或者进一步处理其中包含的文字内容[^2]。 注意此代码需附加至场景中的某个游戏物件之上,并设置好对应的 `ScrollRect` 和 `Content Panel` 参数。 #### 关键点解析 - **Viewport 计算**:利用 `ScrollRect` 的 viewport 属性获得实际显示窗口大小及其位置。 - **Item Bounds 判断**:借助 `RectTransformUtility.CalculateRelativeAnchorBounds()` 函数得到每个项目相对整个内容面板的矩形边界数据。 - **Padding 调整**:增加一个小数值作为误差补偿,避免因像素级差异造成错误判定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值