一个像素水平分频线与Unity ScrollRect闪烁?

时间:2017-09-28 09:26:10

标签: unity3d scrollrect

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

当移动内容对象的localPosition时,子对象按预期移动,但是存在于每个子对象底部的水平分隔符不会以恒定方式显示。有时线条看起来更粗或更薄,滚动时会“闪烁”。

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

enter image description here

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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可以将其content的RectTransforms移离其本地空间原点最多diff个像素。如果ScrollRects使用像素值,我们可以将它们四舍五入为整数,但是由于ScrollRects处理的是归一化位置,因此我们需要归一化所需的像素值。如果在“像素空间”中以1为增量从0移到diff,则在“归一化空间”中以1 / diff增量从0移到1。 (您将整个空间除以diff。)因此,我们需要确保将标准化值四舍五入到最接近的1 / diff的倍数。