Developer

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

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

目次

  • はじめに
  • ColorRect

はじめに

本稿では Godot 2D ゲームのユーザインタフェース(UI)において一般的に最もよく使用されるであろう ColorRect, Label, Button, TextureButton ノードクラスについて、 比較的詳しく解説する。
ColorRect は単一の色を持つ矩形領域ノードクラス、Label はテキストを表示するノードクラス、 Button はテキストを、TextureButton は画像を用いるボタンノードクラスだ。

上図はすでに解説したナンプレ(数独)アプリのパズル画面だが、 この画面は ColorRect, Label, Button, TextureButton により作成されている。
アプリ画面全体背景、上部のタイトルバー、9×9盤面背景には ColorRect が使用されている。
タイトルバーテキスト、難易度・空欄数・経過時間・メッセージテキストはすべて Label だ。 また、盤面の数字も Label により表示されている。
1~9の数字ボタンには Button が使用されている。
Undo/Redo などのコマンドボタンには画像を用いた TextureButton が使用されている。

以下、それぞれのノードクラスについて詳しく説明する。

ColorRect

■基本

ColorRect は単色の矩形で、下記のような継承関係を持つ。

  Object > Node > CanvasItem > Control > ColorRect

Object はすべてのクラスのルートクラスで、Node は画面に配置可能なクラスの基底クラスだ。 CanvasItem は2Dノードクラスの基底クラスで、Control はユーザインターフェース(UI)クラスの基底クラスだ。 で、ColorRect はそれの派生クラスというわけだ。

ナンプレパズル画面の、背景、タイトルバー、盤面背景部分は ColorRect を利用している。

他のノードクラスでも同様なのだが、ノードクラスオブジェクトを画面に配置するには、 シーンエディタにて、親にしたいノードを選択し、画面左上の「+」をクリックするか、Ctrl + A を押す。

そうすると上図の「Node を新規作成」ダイアログが表示されるので、ノードクラスツリーから「ColorRect」を選択する。
ノードクラスは大量に存在するので、目的とするノードクラスを探すのは大変だ。 そんな時は、検索部分に「ColorRect」の一部を入力するとよい。 ノードクラスが絞り込まれるので目的とするノードクラスを探すのが簡単になるぞ。

画面に ColorRect を配置し、エディタ右側のインスペクタでサイズを 500×900 にし、色を微妙に明るい緑(#80c080)に設定すると、 下図のようなナンプレアプリ背景のできあがりだ。

■自前描画

タイトルバーも ColorRect だが、ちょっと凝った見た目をしている。
タイトルバーノードにスクリプトをアタッチし、_draw() 関数を実装することで、外観を自由に変えることができる。
下記にそのためのコードを示す。

extends ColorRect
const RADIUS = 5        # 四隅角丸半径
func _draw():
    var style_box = StyleBoxFlat.new()      # 影、ボーダなどを描画するための矩形スタイルオブジェクト
    style_box.bg_color = color   # 矩形背景色
    style_box.border_color = Color.green        # ボーダ色
    style_box.set_border_width_all(2)           # ボーダ幅
    style_box.set_corner_radius_all(RADIUS)     # 四隅角丸半径
    style_box.shadow_offset = Vector2(0, 4)     # 影オフセット
    style_box.shadow_size = 8                   # 影(ぼかし)サイズ
    draw_style_box(style_box, Rect2(Vector2(0, 0), self.rect_size))      # style_box に設定した矩形を描画

このコードはタイトルバーオブジェクトにアタッチする。

盤面背景の市松模様も同様に描画している。下記はそのコードだ。

const N_VERT = 9
const N_HORZ = 9
const CELL_WIDTH = 54               # セル幅(ピクセル数)
const BOX_WIDTH = CELL_WIDTH * 3    # 3x3ブロック幅
const bgcol = Color("e0e0e0")       # 明るいグレー
func _draw():
    draw_rect(Rect2(0, 0, BOX_WIDTH, BOX_WIDTH), bgcol)     # 3x3ブロック背景矩形描画
    draw_rect(Rect2(BOX_WIDTH, BOX_WIDTH, BOX_WIDTH, BOX_WIDTH), bgcol)
    draw_rect(Rect2(BOX_WIDTH*2, 0, BOX_WIDTH, BOX_WIDTH), bgcol)
    draw_rect(Rect2(0, BOX_WIDTH*2, BOX_WIDTH, BOX_WIDTH), bgcol)
    draw_rect(Rect2(BOX_WIDTH*2, BOX_WIDTH*2, BOX_WIDTH, BOX_WIDTH), bgcol)

スクリプトで描画するより、ペイントまたはドローソフトで画像を作る方が簡単でいいやん、と思われる方がいるかもしれないが、 スクリプトで描画しておく方が、後で変更する場合手間が少ない。 例えば、色を変えたり、市松模様を逆パターンしたいときなど、スクリプトで描画していれば、 ペイントまたはドローソフトで画像を修正するより(筆者の場合は)簡単で時間がかからない。

まとめ:

  • ColorRect は単色の矩形領域を表示するためのノードクラスだ。
  • シーンエディタで簡単に配置し、インスペクタで色・位置・サイズを変更することができる。
  • スクリプトをアタッチし、_draw() をオーバライドすることで、かなり自由に見た目を変えることができるぞ。