【问题标题】:Scroll Rect manual scrolling through script Unity C#Scroll Rect 手动滚动脚本 Unity C#
【发布时间】:2017-04-17 08:07:30
【问题描述】:

我想为 Unity 制作一个 C# 脚本,当我按下“UP”键时让滚动视图向上滚动,当我按下“DOWN”键时让滚动视图向下滚动。

【问题讨论】:

  • content.localPosition = new Vector3(content.localPosition.X, content.LocalPosition.Y + 1, content.localPosition.Z);
  • 这是改变“内容”的位置吗?

标签: c# unity3d scrollbar scrollview


【解决方案1】:

简单使用

ScrollRect.horizontalNormalizedPosition // value range (0 to 1)

ScrollRect.verticalNormalizedPosition // value range (0 to 1)

尝试在向上和向下按钮的按钮单击事件处理程序上相应地 lerp 这些值。

或者您可以在UnityUI-Extentions 上查看脚本HorizontalScrollSnap.csVerticalScrollSnap.cs

【讨论】:

  • 这个解决方案使用起来有点麻烦,因为您可能希望在内容空间中滚动一个恒定的量。因此,您必须进行一些计算才能确定要加减的标准化数量。令人惊讶的是,没有更简单或更标准的方法来模仿滚轮的作用。
【解决方案2】:

其他答案似乎不完整或过于复杂,所以这就是我的做法。假设scroll 是您要滚动的方向,speed 是一个以内容单位/秒为单位控制滚动速度的属性,scrollRect 是对 ScrollRect 组件的引用:

        if (scroll != 0) {
            float contentHeight = scrollRect.content.sizeDelta.y;
            float contentShift = speed * scroll * Time.deltaTime;
            scrollRect.verticalNormalizedPosition += contentShift / contentHeight;
        }

这应该为任何内容大小移动正确的数量,并正确地导致顶部和底部的弹性反弹(如果您的 ScrollRect 已为此配置)。

【讨论】:

  • 这行得通,但我注意到速度并没有达到应有的速度。例如我将它设置为 10 它没有滚动 10 个单位/秒。我认为这是因为滚动查看器不会滚动完整的内容高度,所以我删除了视口高度:float contentHeight = scrollRect.content.SizeDelta.Y - scrollRect.viewport.rect.height;然后我还将变量重命名为scrollHeight,之后将滚动速度更改为10滚动10单位/秒
【解决方案3】:

为了平滑滚动(使用 lerp)。

[SerializeField]
private ScrollRect _scrollRectComponent;
[SerializeField]
RectTransform _container; 
private IEnumerator LerpToPage(int page)
{
    Vector2 _lerpTo = (Vector2)_scrollRectComponent.transform.InverseTransformPoint(_container.position) - (Vector2)_scrollRectComponent.transform.InverseTransformPoint(target.position);
    bool _lerp = true;
    Canvas.ForceUpdateCanvases();

    while(_lerp)
    {
        float decelerate = Mathf.Min(10f * Time.deltaTime, 1f);
        _container.anchoredPosition = Vector2.Lerp(_scrollRectComponent.transform.InverseTransformPoint(_container.position), _lerpTo, decelerate);
        if (Vector2.SqrMagnitude((Vector2)_scrollRectComponent.transform.InverseTransformPoint(_container.position) - _lerpTo) < 0.25f)
        {
            _container.anchoredPosition = _lerpTo;
            _lerp = false;
        }
        yield return null;
    }
}

【讨论】:

    【解决方案4】:

    您的问题非常不完整。对于 2d 还是 3d?你试过什么?

    以下是 id 的做法,其中包含一些您遗漏信息的假设。 在您的相机组件中添加此代码:

    void Update() {
        if (Input.GetKeyDown(Input.KeyCode.W) {
            transform.position = new Vector3(transform.position.x, transform.position.y + 2, transform.position.z);
        }
    }
    

    它的作用是访问您将脚本附加到的对象转换并在您单击 W 时将其位置的 Y 值调整为 +2。

    然后您可以添加更多 if 语句并调整键,但核心就在那里。

    【讨论】:

    • 我想与 VR 3d 应用程序一起使用。我不想改变相机的旋转。我在我的应用程序中所做的是将对象添加到 Content 分支,在添加了许多对象后,旧对象开始上升并消失,我需要向上滚动(使用垂直滚动条)才能看到它们
    • 哦,我明白了。或许 Umair M 的反应更准确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多