unity入门:按钮控制横向滚动视窗显示最左最右
unity入门:按钮控制横向滚动视窗显示最左最右
- 实现逻辑
- 步骤概述
- 1. UI结构设置
- 2. 编写控制脚本
- 3. 关联按钮事件
- 平滑滚动
实现逻辑
在Unity中实现点击按钮让左右滚动视图到达最左或最右的效果,核心是通过代码控制Scroll Rect组件的horizontalNormalizedPosition属性。
步骤概述
设置UI结构: 确保你的场景中有一个Scroll View(包含Scroll Rect组件)和两个按钮(例如"左"和"右")。
编写控制脚本:创建一个脚本,该脚本引用ScrollRect组件,并包含让滚动视图滚动到最左或最右的方法。
关联按钮事件:将按钮的OnClick()事件与脚本中的相应方法关联起来。
1. UI结构设置
首先,确保你的Unity场景中有一个标准的Scroll View,并且其Scroll Rect组件的Horizontal选项已启用(允许水平滚动)。同时创建两个按钮(UI -> Button),分别用于触发滚动到最左和最右的动作。
2. 编写控制脚本
创建一个新的C#脚本,例如ScrollViewHorizontalController,并将其附加到Scroll View游戏对象或任何合适的游戏对象上(如场景管理器),代码如下。
using UnityEngine;
using UnityEngine.UI;public class ScrollViewHorizontalController : MonoBehaviour
{public ScrollRect targetScrollRect; // 引用你的ScrollRect组件// 滚动到最左边 (horizontalNormalizedPosition = 0f)public void ScrollToLeft(){if (targetScrollRect != null){targetScrollRect.horizontalNormalizedPosition = 0f;}else{Debug.LogWarning("Target ScrollRect is not assigned!");}}// 滚动到最右边 (horizontalNormalizedPosition = 1f)public void ScrollToRight(){if (targetScrollRect != null){targetScrollRect.horizontalNormalizedPosition = 1f;}else{Debug.LogWarning("Target ScrollRect is not assigned!");}}
}
3. 关联按钮事件
1.在Unity编辑器中,选择你的左或右按钮。
2.在Inspector窗口中,找到Button组件的On Click () 事件。
3.点击"+"添加一个新的触发事件。
4.将包含ScrollViewHorizontalController脚本的游戏对象拖拽到事件栏的None (Object) 区域。
5.在下拉菜单中,选择ScrollViewHorizontalController -> ScrollToLeft(或者ScrollToRight,对于“To Right”按钮)。
或在代码中创建public Button Left然后 Left.onClick.AddListener(abc);绑定按钮。
完成上面操作点击绑定的按钮滚动视图就能自动滑动到最左或最右了
平滑滚动
如果你不希望立即跳转,而是希望有一个平滑的动画过渡到最左或最右,可以使用协程(Coroutine)和Mathf.Lerp进行插值,代码如下。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;public class ScrollViewSmoothController : MonoBehaviour
{public ScrollRect targetScrollRect;public float smoothTime = 0.3f; // 平滑滚动所需时间(秒)private Coroutine smoothCoroutine;public void SmoothScrollToLeft(){if (targetScrollRect != null){if (smoothCoroutine != null){StopCoroutine(smoothCoroutine);}smoothCoroutine = StartCoroutine(SmoothScroll(0f));}}public void SmoothScrollToRight(){if (targetScrollRect != null){if (smoothCoroutine != null){StopCoroutine(smoothCoroutine);}smoothCoroutine = StartCoroutine(SmoothScroll(1f));}}private IEnumerator SmoothScroll(float targetPosition){float startPosition = targetScrollRect.horizontalNormalizedPosition;float elapsedTime = 0f;while (elapsedTime < smoothTime){elapsedTime += Time.deltaTime;float newPosition = Mathf.Lerp(startPosition, targetPosition, elapsedTime / smoothTime);targetScrollRect.horizontalNormalizedPosition = newPosition;yield return null;}// 确保最终位置准确targetScrollRect.horizontalNormalizedPosition = targetPosition;smoothCoroutine = null;}
}