目录
前言:实习的时候遇到一个问题,就是我需要在页面刚加载的时候,滑动条处于最开始的位置,也就是value=0,但是奇怪的事情发生了,UGUI的值始终都不能变成0,就像这篇文章里的问题一样:【Unity】UGUI:为什么Scrollbar无法把初值设置为0,查了半天没有解决。
Scrollbar
我在自己的赋值为0的地方打上断点调试,发现value值一开始的确变成0,后面自动变成了1,百思不得其解,就去请教了前辈同事。
viewModel.ScrollbarScrollbar.value = 0;
事实证明,你前辈就是你前辈,他找到了源码,找到了自动变成1的原因,那个滑动条没有加载完成之前有一个地方判断的,巴拉巴拉我忘记了,等会找一下源码看看。
下面是解决办法。
ScrollRect
在我的代码里面初始化成这样就好了:
viewModel.ModeContentScrollRect.normalizedPosition = Vector2.zero;
下面是官网资料的例子:
using UnityEngine;
using System.Collections;
using UnityEngine.UI; // Required when Using UI elements.
public class ExampleClass : MonoBehaviour
{
public ScrollRect myScrollRect;
public Vector2 myPosition = new Vector2(0.5f, 0.5f);
public void Start()
{
//Change the current scroll position.
myScrollRect.normalizedPosition = myPosition;
}
}
源码
找到ScrollbarEditor.cs,对上了就可以假装自己看懂了
上面的是界面的内容看起来,我找错了
看到导入的包UnityEngine.UI,应该是Scrollbar.cs这个文件,这里是涉及value返回值和numberOfSteps的关系,numberOfSteps为0或者1的时候是原值,其他的会经过计算。
Scrollrect.cs文件里
我的unity里面就是水平的滑动轴
刷新会有这样一个计算过程,那个黄色和蓝色的框框有一个简单的例子,就是在内容大于视图的时候,初始相对位置来计算value。但是view大于content的时候,就是红色框框的计算,可能是我value赋值的位置太早了,因为我的content宽度是动态变化的,所以还没有来得及初始化,就会这样先0后1
参考
这个是官方文档
https://docs.unity3d.com/2018.1/Documentation/ScriptReference/UI.ScrollRect-normalizedPosition.html
这个大佬的知乎文章很值得看看,有 一系列关于UGUI源码的解读
https://zhuanlan.zhihu.com/p/340598873
https://zhuanlan.zhihu.com/p/340598576