[Unity学习]使用ScrollRect实现自动滚动到底部显示实时消息,并在拖动的时候取消自动滚动,再次手动滑到底部,又继续自动滚动

首先需要重写ScrollRect组件:

using UnityEngine.UI;
using UnityEngine.EventSystems;

public class MScrollRect : ScrollRect
{
    public bool isDrag;
    public override void OnDrag(PointerEventData eventData)
    {
        base.OnDrag(eventData);
        isDrag = true;
    }

    public override void OnEndDrag(PointerEventData eventData)
    {
        base.OnEndDrag(eventData);
        if (normalizedPosition.y<=0)
        {
            isDrag = false;
        }
    }
}

下面通过协程实现在不滚动ScrollRect的时候,自动滚动到底部。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public static class UIHelper
{
 	public static void AddScrollText(Text prefab, RectTransform contentRoot, string text, MScrollRect scrollRect)
    {
        if (contentRoot == null)
            return;

        var listItem = GameObject.Instantiate<Text>(prefab, contentRoot, false);
        listItem.text=text;

        if (scrollRect != null && scrollRect.isActiveAndEnabled)
            scrollRect.StartCoroutine(ScrollToBottom(scrollRect));
    }

    public static IEnumerator ScrollToBottom(MScrollRect scrollRect)
    {
        yield return null;

        if (scrollRect != null && scrollRect.isActiveAndEnabled&&!scrollRect.isDrag)
            scrollRect.normalizedPosition = new Vector2(0, 0);
    }
}

 

使用时,写下面类似代码即可:

using UnityEngine;
using UnityEngine.UI;

public class AutoScrollTest : MonoBehaviour
{
    public Text textPrefab;
    public RectTransform contentRoot;
    public MScrollRect scrollRect;
    private float interval = 1;
    private float time=0;
    private void Update()
    {
        time += Time.deltaTime;
        if (time>=interval)
        {
            AddText();
            time = 0;
        }
    }

    public void AddText()
    {
        UIHelper.AddScrollText(textPrefab, contentRoot, time.ToString(), scrollRect);
    }
}

Unity原生Scroll View更改配置如下:
在这里插入图片描述
其中ScrollView游戏物体更改组件如下:
在这里插入图片描述
content配置如下:
在这里插入图片描述
实现效果如下:
在这里插入图片描述
大功告成!加上对象池模式控制添加的text实例效果会更好哦。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
想要实现使用 ScrollView 组件的自动滚动并循环滚动的话,可以使用 Unity 中的 RectTransform 和 ContentSizeFitter 组件以及编写代码来实现。 具体实现步骤如下: 1. 创建一个空的 GameObject,作为容器,并添加一个 RectTransform 组件。 2. 在容器中创建多个子 GameObject,用于显示内容,并且将它们的 RectTransform 组件设置为相同的大小。 3. 将所有子 GameObject 放入一个父节点下,并将父节点的 RectTransform 组件设置为水平或垂直布局,同时选择 ContentSizeFitter 组件,并将 Vertical Fit 和 Horizontal Fit 设置为 Preferred Size。 4. 编写脚本来控制容器的滚动。首先,获取容器的 RectTransform 组件和子节点的 RectTransform 组件,然后根据需要将子节点重新排列,并将容器滚动到正确的位置。 5. 在 Update 函数中,不断地调用滚动函数,以便实现自动滚动。可以使用 Time.deltaTime 来控制滚动速度。 6. 当滚动到最后一个子节点时,将容器滚动到第一个子节点的位置,从而实现循环滚动。 下面是一个简单的示例代码: ```csharp using UnityEngine; using UnityEngine.UI; public class AutoScroll : MonoBehaviour { public RectTransform container; public float scrollSpeed = 50f; private RectTransform[] items; private float containerHeight; private float itemHeight; private float scrollPosition; void Start() { items = container.GetComponentsInChildren<RectTransform>(); containerHeight = container.rect.height; itemHeight = items[0].rect.height; scrollPosition = containerHeight; } void Update() { // 计算下一帧的滚动位置 scrollPosition -= Time.deltaTime * scrollSpeed; // 当滚动到最后一个子节点时,将容器滚动到第一个子节点的位置 if (scrollPosition < -itemHeight) { // 将最后一个子节点移到第一个子节点前面 items[items.Length - 1].SetAsFirstSibling(); // 重新排列子节点的位置 for (int i = 0; i < items.Length; i++) { items[i].anchoredPosition = new Vector2(0, -i * itemHeight); } // 重置滚动位置 scrollPosition = containerHeight - itemHeight; } // 滚动容器 container.anchoredPosition = new Vector2(0, scrollPosition); } } ``` 这个示例代码中,我们首先在 Start 函数中获取容器和子节点的 RectTransform 组件,并计算容器的高度和子节点的高度。然后,在 Update 函数中,我们计算下一帧的滚动位置,并在滚动到最后一个子节点时,将最后一个子节点移到第一个子节点前面,并重新排列子节点的位置。最后,我们通过修改容器的 anchoredPosition 来实现滚动。 需要注意的是,这个示例代码中没有考虑容器的宽度和子节点的宽度。如果需要支持水平滚动,需要修改代码来考虑宽度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值