0

我在 ScrollRect 内部有一些 GameObjects(实际上在 ScrollRect 翻译的内容对象内部)。

当内容对象的 localPosition 移动时,子对象会按预期移动,但每个子对象底部的水平分隔线不会以恒定的方式出现。有时,滚动时线条看起来更粗或更细并且“闪烁”。

我希望水平线不会明显改变。关于如何做的任何想法?

在此处输入图像描述

4

2 回答 2

0

我相信您可以使用 Canvas.pixelPerfect 属性来强制 UI 元素遵守 pixelperfect 标准。

于 2017-09-29T19:40:49.313 回答
0

我在尝试自己解决类似问题时遇到了这个问题,所以我想我会分享我的解决方案。

假设您想将 ScrollRect 限制为整个像素,您可以执行以下操作:

public class PixelPerfectScrollRect : ScrollRect
{
    protected override void LateUpdate ()
    {
        base.LateUpdate();
        ensurePixelPerfectScroll();
    }

    void ensurePixelPerfectScroll ()
    {
        float diff = content.rect.height - viewport.rect.height;
        float normalizedPixel = 1 / diff;
        verticalNormalizedPosition = Mathf.Ceil(verticalNormalizedPosition / normalizedPixel) * normalizedPixel;
        // can also do the same for horizontalNormalizedPosition, using rect.width instead of rect.height
    }
}

将此附加到 GameObject 并以与使用 ScrollRect 相同的方式使用它。这也假设每个 UI 单元都是一个像素;normalizedPixel如果您的游戏不是这种情况,您将不得不进行扩展。

这是因为 ScrollRects 可以将它们的contentRectTransforms 移动到diff远离其本地空间原点的像素。如果 ScrollRects 使用像素值,我们可以将它们四舍五入为整数,但由于 ScrollRects 处理标准化位置,我们需要标准化我们所需的像素值。如果在“像素空间”中,您diff以 1 为增量从 0 移动到 1,那么在“标准化空间”中,您需要以 1/ 为增量从 0 移动到 1 diff。(您将整个空间除以diff。)因此我们需要确保我们的标准化值四舍五入到最接近的 1/ 倍数diff

于 2020-10-07T00:46:46.717 回答