とりとめも

藻類が学んだり感じたりしたことを未来の自分のために書き留めるところ

【Godotお勉強メモ】Labelノードの文字列の色を変えたい!カスタムプロパティって何!

はじめに

Labelノードの色を変えるお話です。
Godotバージョン:4.1.3

前回のあらすじ

marimomemo.hatenablog.jp

画面の左上に経過時間を表示させるラベルを追加しました。

今回は

このラベルの色を下図のように変えます。
わざわざ独立した記事にした理由は後述。

別に見やすくなってるわけでもないですが・・・

前置き:Labelノードの文字列の色を変えるの難しくないですか

まずはこの記事を書いた理由ですが、ラベルの色を変える方法で結構ハマったためです。

Labelノードに、いい感じに色を変えられそうなプロパティが見つからないんですよね。

たとえば、シーンのスクリプトcolor=Color(255,0,0)や、font_color=Color(255,0,0)のように書いても、対応するプロパティが無くてエラーになります。

また、ダメ元でmodulate = Color(255,0,0,255)のように書くと、下図のようにめっちゃ文字が滲みます。

なにこれ

この事象の原因はわかっていないのですが、modulateはLabelのテキストの色・透明度を変えるのではなくLabelノード全体の色・透明度を変えるからだと理解しました。

ともあれ、Labelの文字列の色を変えるには、きちんとそれに対応したプロパティをいじる必要があります。

ここをいじりたい

先ほどは「いい感じに色を変えられそうなプロパティが見つからない」と書きましたが、実際には、インスペクターを見るとそれっぽいものがあります。
Font Colorという設定です。

Font Colorあるやん

しかし、font_color=Color(255,0,0)と書いても、Identifier "font_color" not declared in the current scope.というエラーが出るだけです。

結論

Labelのシーンスクリプトに以下の記述を追加します。

extends Label
var elapsed_time:int = 0
func _ready():
        #
        # (略。前回作成した箇所)
        #

    # フォントカラーを設定したテーマを作成する
    var theme = Theme.new()
    theme.set_color("font_color", "Label", Color(255, 0, 0))
    # Labelにテーマを適用する
    set_theme(theme)

Theme is 何

まず、Labelノードの色に関わるプロパティは、Theme Propertiesというカテゴリに属するようです。

docs.godotengine.org

こうしたテーマプロパティは、他のプロパティと同じようにアクセスすることができません。
インスペクターで言えば、下図のあたりはテーマプロパティなのでしょう。(Theme Overridesって書いてあるし)

Theme Overridesって書いてる

それではこのThemeって何なんでしょう。

docs.godotengine.org

まとまったドキュメントを見つけられませんでしたが、ひとつのクラスのようです。
つまり、Labelのようなノードに存在するTheme Propertiesというのは、Label自体が直接持つプロパティではなく、Labelが内部に持つThemeオブジェクトのプロパティということでしょう。

そのため例えば、font_sizeはThemeのプロパティなので、Labelのプロパティのつもりでアクセスしようとしても存在しないことになります。

そこで先ほどのコードのように、新しくThemeのインスタンスを作成して、そのfont_colorプロパティを編集。
その後、そのThemeをLabelに設定することで、目的のfont_colorの変更が実現できるということでした。

終わりに

経過時間の計算とかラベルの設定シリーズはもう少し続くつもりです。

やってみたいことがあったのですが、ちゃんとできるかな・・・。