ScrollViewの下にコンテンツがたまっていったときに、一番下にスクロールして最新のコンテンツが見えるようにしてほしい。LINEみたいな感じ
Scrollbar
観察してたらScrollbarのValueの0~1でスクロール位置が決まっている。
DirectionをButtonToTopにしているときは、Value=0で一番下に行く!
ならコンテンツが追加されたときにValueを0にしたらいい
_Scrollbar.value = 0.0f;
これでやったけど、完全には下に行かない・・・少し下に下がるけど数値が0にならない;;
この人もチャット追加時に、スクロールバーの位置を変えている
scrollPos.y = Mathf.Infinity;
scrollRect.verticalNormalizedPosition
ググったら他の方法もあった
scrollRect.verticalNormalizedPosition = 0.0f;
これは内部的な値なんだろうか。
これでも試したけど、Scrollbarと同じような挙動で、少し下に行くけど完全にはいかない。
コルーチン使う
ここで議論されていた
スクロールrectを更新するのに1フレームかかるため、コードはおそらくUpdateでのみ機能します。そのコードをコルーチンに配置し、フレームの終わりを待つと、機能するはずです。
だって。
1フレーム??チャットが追加されるときに1回呼び出すだけじゃダメなのか?
スレッドにあったコード。コルーチンで1フレーム待って、Canvasのフォーカスしたあと、スクロールバー動かして、再度Canvasフォーカスしている
-
// Called at the end of instantiation function.
-
IEnumerator ForceScrollDown () {
-
// Wait for end of frame AND force update all canvases before setting to bottom.
-
Canvas.ForceUpdateCanvases ();
-
comScroll.verticalNormalizedPosition = 0f;
-
Canvas.ForceUpdateCanvases ();
-
}
他のコメントには2フレーム待っているものもあった
-
// auto-scroll
-
if (gameObject.activeSelf)
-
{
-
StartCoroutine(AutoScroll());
-
}
-
}
-
-
private IEnumerator AutoScroll()
-
{
-
LayoutRebuilder.ForceRebuildLayoutImmediate(container);
-
scrollRect.verticalNormalizedPosition = addNewToTop ? 1 : 0;
-
}
私の場合は1回呼び出すだけで動いた
これは良いやり方なのだろうか?