📝

【Godot Engine】RichTextLabelのスクロール処理を自作する

2023/02/01に公開

はじめに

RichTextLabelを使用する際はscroll_followingを有効化することで追加した文章に合わせて自動でスクロールすることができますが、最下行への移動が一瞬で終わります。
私はスクロール中に一瞬でも途中の行を表示させたかったので、自力でスクロール処理を作成しました。

方法

Main.gd
extends Control
@onready var richtextlabel:RichTextLabel = $RichTextLabel
@onready var textedit:TextEdit = $TextEdit
var count:int = 0
var propetytween:PropertyTweener
var tween:Tween

## textをrichtextlabel.textに追加
func submit(text:String):
    count += 1
    richtextlabel.add_text("{0}: {1}".format([count, text]))
    richtextlabel.newline()

    # これがないと一度に10行程度入力した時に最下行までスクロールしません
    richtextlabel.get_line_count()
    var bar:VScrollBar = richtextlabel.get_v_scroll_bar()
    if(tween != null):
        tween.kill()
    tween = get_tree().create_tween()
    propetytween = tween.tween_property(bar, "value", bar.max_value, 0.3)
    pass

func _on_button_pressed():
    submit(textedit.text)

このコードでは、MainシーンのButtonを押下した時、
textedit.textの値をrichtextlabel.textに追加しています。
richtextlabel.get_line_count()を使用することでbar.max_valueを更新し、tween.tween_property()で最下行へのスクロールができるようになっています。

tween.kill()を入れておかないと、Buttonを連続で押した時にスクロールの挙動が不安定になります。
気になる方は入れておきましょう。

サンプルコード

https://github.com/gurencrize/RichLabelTextManualScroll

参考記事

https://docs.godotengine.org/ja/latest/classes/class_richtextlabel.html
https://docs.godotengine.org/ja/latest/classes/class_range.html

Discussion