SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Godot Engine 2Dゲーム開発入門

【Godot Engine 2Dゲーム制作 Part4】UI部品を作成し、リストダイアログをつくろう

Godot Engine 2Dゲーム開発入門 第6回

リストダイアログのスクリプトの作成

ListDialogシーンのスクリプトの作成

 いよいよリストダイアログの本体のスクリプトです。

 list_dialog.tscnを開いて、ルートの「ListDialog」ノードにスクリプトをアタッチします。

 「ListDialog」ノードを右クリックして「スクリプトをアタッチ」を選択します。「ノードにスクリプトをアタッチする」ダイアログが表示されますので「テンプレート」にチェックを入れて、そのまま「作成」ボタンを押します。

 res://scn/list_dialog/list_dialog.gdと保存されたはずです。

 list_dialog.gdをScriptビューで開いて、次のように書き換えます。

list_dialog.gd
extends CanvasLayer

class_name ListDialog

signal selected(id: int)

var list_item_2_row = preload("./list_item_2_row.tscn")


func _ready() -> void:
	var i = {"title": "title", "desc": "description"}
	init("ダイアログタイトル", [i, i, i, i, i, i, i, i, i])
	selected.connect(func(x): print(x))


# 初期化
func init(title: String, menus: Array) -> void:
	%Title.text = title
	var vbox = %VBoxContainer

	# 追加	
	for i in menus.size():
		var menu = menus[i]
		var item = list_item_2_row.instantiate()
		item.set_info_ex(i, menu["title"], menu["desc"])
		vbox.add_child(item)
		item.item_pressed.connect(selected.emit)

スクリプトの解説

 まず、冒頭部分を解説します。

 リストダイアログは、他の場所から呼び出す予定ですので、クラス名としてListDialogを設定します。

class_name ListDialog

 また、呼び出し元に選択したリスト番号を返すために、シグナルselected(id: int)を定義します。

signal selected(id: int)

 リストアイテムとして「ListItem2Row」を使いますので、preload関数で読み込み、変数list_item_2_rowに部品として代入しておきます。

var list_item_2_row = preload("./list_item_2_row.tscn")

 次にinit関数を見ていきます。

 まずは冒頭部分です。

	%Title.text = title
	var vbox = %VBoxContainer

 固有名アクセスを設定した「Title」ノードのtextに、タイトルのテキストを設定します。そして、「VBoxContainer」を、変数vboxでアクセス可能にします。

 次は中盤以降です。

	# 追加	
	for i in menus.size():
		var menu = menus[i]
		var item = list_item_2_row.instantiate()
		item.set_info_ex(i, menu["title"], menu["desc"])
		vbox.add_child(item)
		item.item_pressed.connect(selected.emit)

 引数の配列menusに従い、リストを構築していきます。list_item_2_rowをインスタンス化して、「ID」「タイトル」「説明」を設定して、vboxの子ノードとして追加します。

 また、リストアイテムのitem_pressedシグナルと、自身のselectedシグナルを接続して、値を受け取れるようにします。

 最後に_ready関数を見ていきます。

func _ready() -> void:
	var i = {"title": "title", "desc": "description"}
	init("ダイアログタイトル", [i, i, i, i, i, i, i, i, i])
	selected.connect(func(x): print(x))

 先ほどのinit関数を利用してダイアログを開きます。そしてselectedシグナルと匿名関数を接続します。匿名関数ではクリックした要素の番号を得て出力します。

実行確認

 ここまでのスクリプトを実行します。

 list_dialog.tscnを開いた状態で、「F6」を押すか、画面右上の「カチンコの中に▶のアイコン」DialogList(現在のシーンを実行)ボタンを押します。

 リストダイアログが表示されます。各項目をクリックすると、その番号が出力されます。マウスのホイールでリストをスクロールできることも確認してください。

DialogList
DialogList

次のページ
リストダイアログを手軽に呼び出せるようにする

この記事は参考になりましたか?

Godot Engine 2Dゲーム開発入門連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/21374 2025/08/07 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー