Developer

さくさく理解する Godot 入門(ただし2Dに限る)基礎編 ColorRect, Label, Button, TextureButton【第2回】
2022.07.12
Lv1

さくさく理解する Godot 入門(ただし2Dに限る)基礎編 ColorRect, Label, Button, TextureButton【第2回】

目次

  • Label

Label

■基本

Label は文字列を表示するためのノードクラスで、下記のような継承関係を持つ。

  Object > Node > CanvasItem > Control > Label

Label を画面に設置する方法は ColorRect 同様に、Ctrl + A 等を実行し、「Node を新規作成」ダイアログを開き、 Label を選ぶだけだ。

Label に表示するテキストは、エディタ右側のインスペクタで、Label > Text に入力する。テキストは途中で改行することも可能だ。
また、そのすぐ下で水平・垂直アラインを指定することもできる(下図参照)。

Label に表示するテキストは通常シーンエディタで設定するが、 アプリ実行時に下記のようなスクリプトで動的にテキストを参照・変更することも可能だ。

    $LabelObjName.text = "hello"    # ラベル表示文字列変更

非常に残念なことに、デフォルトではビットフォントで、サイズ変更できないし、日本語が表示もできない。
なので TTF, OTF 等のスケーラブルフォントを設定するのが必須だ。

その具体的方法は以下の通り。

1.TTF, OTF等のフォントデータファイルそのものは res://fonts/ 等の下に予め用意しておく

2.エディタ右側のインスペクタで Control > Theme Overrides > Fonts を開き、 ドロップダウンメニューから「新規 DynamicFont」を選ぶ。

3.「DynamicFont」部分をクリックし、Font > Font Data 右端のドロップダウンを押し、新規 DynamicFontData または クイックロードを選ぶ

4.クイックロードを選んだ場合は、フォントデータファイル一覧がすぐに表示されるので、使用したいフォントデータファイルを選択する。

■文字色・サイズをスクリプトで変更

シーンエディタ > インスペクタ で簡単に色を変更可能だが、スクリプトにより動的に変更したい場合がある。 たとえば、ナンプレアプリでは縦横3×3ブロックに同じ数字がある場合は、 下図のように数字が赤色になり、そのことをユーザに伝える。

Label に color プロパティがあれば変更は簡単なのだが、残念ながらそれが無い。 これは、Label > Control > Theme Overrides > Colors という構造になっているためだ。

スクリプトで文字色を変更するには、下記のように Control のクラスメソッドである add_color_override(String name, Color color) を用いる。

    l.add_color_override("font_color", Color.red)   # 色変更

文字サイズを変更する場合は、いったんラベルのフォントを取り出し、サイズを変更してから、 そのフォントをラベルに設定する。これは、文字サイズがラベルのプロパティではなく、フォントのプロパティだからだ。

以下に $Label オブジェクトのフォントサイズを変更するコードを示す。

    var font = $Label.get_font("font")      # フォントオブジェクト取得
    font.size = 64                          # サイズ変更
    $Label.add_font_override("font", font)  # サイズ変更したフォントオブジェクトに置き換え

■Label オブジェクト動的生成

ナンプレアプリでは、盤面の 9×9 = 81箇所に数字を表示するために、Label を配置している。
忍耐力のある人であればシーンエディタで手で81箇所に設置してもよいのだが筆者には無理だ。

下記は Label ノードを動的に生成し、画面に配置するコード。

    var l = Label.new()             # ラベルオブジェクト生成
    l.text = "abcあいうえおxyz"     # 表示文字列
    l.rect_position = Vector2(100, 200)     # 表示位置
    add_child(l)                    # 親オブジェクトの子ノードとして追加

ナンプレの場合は半角数字を表示するだけなので問題ないのだが、 上記コードでは、フォントフェースがデフォルトのままで日本語が表示されない。
下記のように記述すると、生成したフォントノードのフォントフェースを変更することができる。

    var l = Label.new()             # ラベルオブジェクト生成
    var df = DynamicFont.new()      # ダイナミックフォントオブジェクト生成
    df.font_data = load("res://fonts/FlopDesignFONT.otf")   # フォントデータ読み込み
    df.size = 32                    # サイズ指定
    l.set("custom_fonts/font", df)  # ラベルオブジェクトに生成したファンとオブジェクトを設定
    l.text = "abcあいうえおxyz"     # 表示文字列
    l.rect_position = Vector2(100, 200)     # 表示位置
    add_child(l)                    # 親オブジェクトの子ノードとして追加

■Label シーン

Label を大量に動的に生成したい場合、前節のようにオブジェクトをコードで生成するのではなく、 Label シーンを作成しておき、それを動的に画面に配置するという方法もある。
むしろ、こららの方法の方が一般的だと思う。
フォントの設定をエディタで行うことができるので、見栄えを確認できて簡単でミスもしずらいからだ。

下記コードは、ナンプレアプリで盤面の81箇所に入力数字用 Label ノードを生成している部分だ。

var InputLabel = load("res://InputLabel.tscn")  # 外部シーンをロード
func init_labels():
    # 入力数字用 Label 生成
    for y in range(N_VERT):
        for x in range(N_HORZ):
            var px = x * CELL_WIDTH     # ラベル位置
            var py = y * CELL_WIDTH
            var label = InputLabel.instance()   # 外部シーン
            label.rect_position = Vector2(px, py + 2)   # 位置指定
            label.text = ""
            $Board.add_child(label)     # 盤面の子ノードとして追加

load(外部シーン) で予め外部シーンを変数に読み込んでおき、instance() をコールすることでシーンをインスタンス化することができる。

まとめ:

  • Label はテキストを表示するためのノードクラスだ。
  • シーンエディタで表示テキストを設定できるし、スクリプトで動的に変更も可能だ。
  • TTF または OTF フォントを設定した方が使い勝手がいいぞ。
     Label オブジェクトをスクリプトで動的生成することも可能だが、 Label シーンを別に作成し、それをインスタンス化する方が簡単だぞ。

TechProjin Godot入門 関連連載リンク

Godotで学ぶゲーム制作
さくさく理解するGodot入門 連載目次

標準C++ライブラリの活用でコーディング力UP!
「競技プログラミング風」標準C++ライブラリ 連載目次