我在ScrollRect中有一些GameObjects(实际上是ScrollRect翻译的内容对象内部。)
当移动内容对象的localPosition时,子对象按预期移动,但是存在于每个子对象底部的水平分隔符不会以恒定方式显示。有时线条看起来更粗或更薄,滚动时会“闪烁”。
我希望水平线不要明显改变。关于如何做的任何想法?
答案 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
的倍数。