Unity+C#学习笔记-Scroll相关

目录


前言:实习的时候遇到一个问题,就是我需要在页面刚加载的时候,滑动条处于最开始的位置,也就是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;
    }
}

源码

UGUI的源码
Unity相关的源码

找到ScrollbarEditor.cs,对上了就可以假装自己看懂了
Unity+C#学习笔记-Scroll相关
上面的是界面的内容看起来,我找错了
看到导入的包UnityEngine.UI,应该是Scrollbar.cs这个文件,这里是涉及value返回值和numberOfSteps的关系,numberOfSteps为0或者1的时候是原值,其他的会经过计算。
Unity+C#学习笔记-Scroll相关
Scrollrect.cs文件里
我的unity里面就是水平的滑动轴
Unity+C#学习笔记-Scroll相关
刷新会有这样一个计算过程,那个黄色和蓝色的框框有一个简单的例子,就是在内容大于视图的时候,初始相对位置来计算value。但是view大于content的时候,就是红色框框的计算,可能是我value赋值的位置太早了,因为我的content宽度是动态变化的,所以还没有来得及初始化,就会这样先0后1
Unity+C#学习笔记-Scroll相关

参考

这个是官方文档
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

上一篇:Unity——技能系统(一)


下一篇:UGUI Set Anchor And Pivot