我在 ScrollRect 内部有一些 GameObjects(实际上在 ScrollRect 翻译的内容对象内部)。
当内容对象的 localPosition 移动时,子对象会按预期移动,但每个子对象底部的水平分隔线不会以恒定的方式出现。有时,滚动时线条看起来更粗或更细并且“闪烁”。
我希望水平线不会明显改变。关于如何做的任何想法?
我在 ScrollRect 内部有一些 GameObjects(实际上在 ScrollRect 翻译的内容对象内部)。
当内容对象的 localPosition 移动时,子对象会按预期移动,但每个子对象底部的水平分隔线不会以恒定的方式出现。有时,滚动时线条看起来更粗或更细并且“闪烁”。
我希望水平线不会明显改变。关于如何做的任何想法?
我相信您可以使用 Canvas.pixelPerfect 属性来强制 UI 元素遵守 pixelperfect 标准。
我在尝试自己解决类似问题时遇到了这个问题,所以我想我会分享我的解决方案。
假设您想将 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 处理标准化位置,我们需要标准化我们所需的像素值。如果在“像素空间”中,您diff
以 1 为增量从 0 移动到 1,那么在“标准化空间”中,您需要以 1/ 为增量从 0 移动到 1 diff
。(您将整个空间除以diff
。)因此我们需要确保我们的标准化值四舍五入到最接近的 1/ 倍数diff
。