【问题标题】:Unity 2D Setting the value of a Scrollbar to 0unity 2D 设置滚动条的值为 0
【发布时间】:2017-07-24 01:20:57
【问题描述】:

我只是想在每次创建新的文本对象时将我的滚动视图对象的滚动条的值设置为 0。这样,最新的对象将始终保持在底部,而无需向下滚动(例如视频游戏的聊天)。我的问题是由于某种原因程序将值设置为 0 然后创建文本对象,因此它将第二个最新对象保留在滚动视图的底部。

我的代码:

//Creates the Text objects
private GameObject GenerateTextObject(string content)
{
    //Creates the Text objects
    GameObject messagePrefab = Instantiate(MessagePrefab);
    Text textComponent = messagePrefab.GetComponent<Text>();

    //Sets the content of the text and parent
    textComponent.text = content;
    messagePrefab.transform.SetParent(ContentPanel.transform, false);

    ScrollbarVertical.value = 0;

    return messagePrefab;
}

在代码中,我在函数末尾设置了值,但在创建对象之前仍将滚动条的值设置为 0(正确地将滚动视图移动到底部)。

https://gyazo.com/897982521f13d7792ec26540490a40c0 在 Gyazo 图片中,您可以看到它不会一直向下滚动。

我尝试过使用协程和 waitForEndFrame 以及 waitforseconds(1),但似乎都不起作用。

编辑:当加载 Unity 并向滚动视图发送新消息时,我看到滚动条一直向下移动,然后很快向上移动,只是隐藏了新的文本对象。

【问题讨论】:

  • 将 ScrollRect 的 elasticity 更改为 0 然后执行 ScrollbarVertical.value = 0;。这只是一个想法。不确定这是否会奏效。
  • 不...我尝试使用所有 ScrollRect 选项进行调整,但似乎没有任何效果。 :(, 非常感谢再次帮助程序员
  • 经过大量思考和解决不同的“修复”后,我想出了解决此问题的方法。再次感谢您的帮助:)
  • 我正要告诉你试试this。继续并提出您的答案,因为这将对其他人有所帮助。不客气!

标签: c# unity3d canvas


【解决方案1】:

您可以做的是创建一个新的Scroll View 并按照以下步骤操作:

结果是每秒调用一次GenerateTextObject(Time.time.ToString());

private GameObject GenerateTextObject(string content)
{
    //Creates the Text objects
    GameObject messagePrefab = Instantiate(MessagePrefab);
    Text textComponent = messagePrefab.GetComponent<Text>();

    //Sets the content of the text and parent
    textComponent.text = content;
    messagePrefab.transform.SetParent(ContentPanel.transform, false); 

    //Force reset to the bottom on each message
    //ScrollbarVertical.value = 0;

    return messagePrefab;
}

【讨论】:

  • 像魅力一样工作。谢谢你:)
【解决方案2】:

我还没有想出解决这个问题的适当方法(老实说,我不知道问题的原因),但我已经针对这种情况做了一些解决方法。

为此,我简单地创建了一个小函数:

public void Testing()
{
    if (testing == true)
    {
        ScrollbarVertical.value = 0;
        testing = false;
    }

}

这将附加到滚动条的内置功能“On Value Changed (Single)”。为了让它工作,我只是在 GenerateTextObject(string content) 上创建一个文本对象后将 bool "testing" 更改为 true。

这个修复真的很难看,并且可能在不久的将来会导致更多问题,但现在,它是一个快速而肮脏的解决方案。

【讨论】:

  • 你在哪里调用那个函数?
  • 我不确定它是如何正确调用的(我在统一和编程方面真的很新)但是在检查器上,在 Scrollbar Vertical 对象下,有一个小地方叫做“On Value Changed “,这是我添加它的地方。 gyazo.com/5483eabac4b30171d6306facc60236ba
  • 糟糕。我错过了你提到的OnValueChanged。明白了。
【解决方案3】:

抱歉,我遇到了类似的问题,谷歌搜索找不到好的答案。所以我发布了我找到的解决方案。

我尝试将滚动条值更改为 1 或 0,具体取决于方向,以便每次打开 UI 面板时,它都会从顶部开始。但无论我做什么,似乎都没有任何效果。

所以我的解决方案是改变内容的 Y 位置而不是滚动条的值。

我的滚动条方向设置为从下到上。然后我取内容的 sizeDelta,除以 2,(因为我需要 1 的值作为滚动条的值)。然后我将它乘以 -1(如果我不这样做,它将从底部开始)。然后我将该值设置为内容的 Y 位置。

到目前为止,每次打开我的 UI 面板时,它都像一个魅力。

希望这可以帮助任何寻找解决方案的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2015-08-06
    • 2011-04-03
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多