【Godotお勉強メモ】Labelノードの文字列の色を変えたい!カスタムプロパティって何!
はじめに
Labelノードの色を変えるお話です。
Godotバージョン:4.1.3
前回のあらすじ
画面の左上に経過時間を表示させるラベルを追加しました。
今回は
このラベルの色を下図のように変えます。
わざわざ独立した記事にした理由は後述。
前置き: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=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というカテゴリに属するようです。
こうしたテーマプロパティは、他のプロパティと同じようにアクセスすることができません。
インスペクターで言えば、下図のあたりはテーマプロパティなのでしょう。(Theme Overridesって書いてあるし)
それではこのThemeって何なんでしょう。
まとまったドキュメントを見つけられませんでしたが、ひとつのクラスのようです。
つまり、Labelのようなノードに存在するTheme Propertiesというのは、Label自体が直接持つプロパティではなく、Labelが内部に持つThemeオブジェクトのプロパティということでしょう。
そのため例えば、font_sizeはThemeのプロパティなので、Labelのプロパティのつもりでアクセスしようとしても存在しないことになります。
そこで先ほどのコードのように、新しくThemeのインスタンスを作成して、そのfont_colorプロパティを編集。
その後、そのThemeをLabelに設定することで、目的のfont_colorの変更が実現できるということでした。
終わりに
経過時間の計算とかラベルの設定シリーズはもう少し続くつもりです。
やってみたいことがあったのですが、ちゃんとできるかな・・・。