※この連載の全ての記事は、タグ「ビッグカツ」の検索一覧から探すことができます。
※この連載で作ったゲームは「BigBreakOut(ゲームの作り方の記事付き) | フリーゲーム投稿サイト GodotPlayer」でプレイできます。
昔から人気の駄菓子「ビッグカツ」のフリー素材画像が公開されたので、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 を使って、ビッグカツ画像を使ったブロック崩しを作成します。
「ビッグカツブロック崩し」作成の第13回では、音を再生するノードがシーンの切り替えで消されてしまい音が途切れてしまう問題に対処するため、シーンをまたいで使えるグローバルなノードを自動読み込み(Autoload) で作成して、そのグローバルなノードの下で音を途切れずに再生させます。
![](https://compota-soft.work/wp1/wp-content/uploads/2024/09/GodotEngine4.3-公式サイトの一部-20240911.png)
※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
前回の記事
前回は、タイトルシーンを作成して、設定してある別のシーン(例ではブロック崩しのステージ)に切り替えるスクリプト例とテスト結果を紹介しました。
グローバルなノードに割り当てるスクリプトの作成
シーンをまたいで最初から最後まで使えるグローバルなノードにも、スクリプトを割り当てることができます。
ゲーム中最初から最後まで使いたいデータや機能を定義しておくと良いでしょう。
今回はシーンドックのノードのスクリプトではないので、ファイルシステムドックでスクリプトを作成します。
ファイルシステムドックの「 res:// 」フォルダを右クリックして表示されるメニュー「新規作成」→「スクリプト」を選択します。
![Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成1](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-シーンを超えて存在するノードとそれに割り当てるスクリプトの作成1.png)
継承元のクラスは Node 以降の派生クラス(例では Node)を選択します。
Node の継承元である Object クラスなどは簡素ですが、シーンに配置できず、グローバルなノードのスクリプトにも対応しません。
ファイルパス(例では res://scutil.gd)を確認・設定して「作成」ボタンを押します。
![Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成2](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-シーンを超えて存在するノードとそれに割り当てるスクリプトの作成2.png)
スクリプトには後から必要に応じて変数や関数を定義しますが、今は、ファイルを作成しただけで十分です。
static 関数を定義するスクリプトファイルの作成については以下の記事も参照してください。
グローバルなノードを自動読み込みで定義
ゲーム実行中、最初から最後までシーンをまたいで利用できるグローバルなノードをプロジェクトで定義します。
メニュー「プロジェクト」→「プロジェクト設定」で「プロジェクト設定」ダイアログを表示して、「グローバル」→「自動読み込み」タブを選択します。
![Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成3](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-シーンを超えて存在するノードとそれに割り当てるスクリプトの作成3.png)
上図の「自動読み込み」タブの左上の「パス」項目に先ほど作成した scutil.gd スクリプトを選択します。
※「パス」項目の右側のフォルダアイコンのボタンから選択できます。
![Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成4](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-シーンを超えて存在するノードとそれに割り当てるスクリプトの作成4.png)
次に「ノード名」項目で、グローバルなノードの名前を設定します。
ここで指定した名前でゲーム実行中のスクリプトからいつでもアクセスできるようになります。
class_name で定義したクラス名と同じノード名は指定できないので注意しましょう。
![Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成5](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-シーンを超えて存在するノードとそれに割り当てるスクリプトの作成5.png)
ノード名を指定したら右側の「追加」ボタンで、グローバルなノードを追加します。
![Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成6](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-シーンを超えて存在するノードとそれに割り当てるスクリプトの作成6.png)
以上で、シーンをまたいでゲームの最初から最後まで存在するグローバルなノードが作成できました。
変数や関数を持たせたい場合は、先ほど作成してパスに指定した scutil.gd スクリプトで定義しましょう。
![Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成7](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-シーンを超えて存在するノードとそれに割り当てるスクリプトの作成7.png)
※設定したグローバル変数は、自動的に解放されるので、queue_free などを呼び出さないでください。
AutoLoad の詳細については公式サイトの「Singletons (Autoload) — Godot Engine (4.x)の日本語のドキュメント」を参照してください。
グローバル変数をスクリプトから使用する
音を再生するノードをもたせる上位ノードとして、シーンをまたいで存在するグローバルなノード(例では SCUtilGlobal )を指定します。
※自動読み込み(AutoLoad)で設定したグローバルなノードは、その際に指定したノード名でアクセスできます。
![Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成8](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-シーンを超えて存在するノードとそれに割り当てるスクリプトの作成8-1024x558.png)
前回作成したタイトルのシーンに割り当てたスクリプトに、音を再生する処理を追加します。
※追加した部分はハイライトされている行です。
extends Control
## 左クリックまたはタップされた際に切り替えるシーンの tscn ファイルを設定してください。
@export var next_scene: PackedScene = null
## ボタンが押されたときの効果音をあらかじめ読み込んで保持します。
@onready var audio_stream_button: AudioStream = preload("res://sound/Button.wav")
# Called when the node enters the scene tree for the first time.
func _ready():
# 設定を確認します。
if next_scene == null:
printerr("TitleScene ノードの next_scene プロパティに切り替え先のシーン (tscn) を設定してください。")
SCUtilGlobal.greet()
return
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func _input(event):
# 左クリックまたはタップされた場合
if (event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT) or (event is InputEventScreenTouch):
SCUtil.AudioStreamOneShotPlay(SCUtilGlobal, audio_stream_button)
# シーンを設定されたものに切り替えます。
change_next_scene()
## [member next_scene] に設定されたシーン (tscn) に切り替えます。
func change_next_scene():
get_tree().change_scene_to_packed(next_scene)
return
指定した AudioStream の音を1回だけ再生する自作関数 AudioStreamOneShotPlay については以下の記事を参照してください。
テスト
F6 キーなどで、現在開いているタイトルのシーンを実行します。
タイトル画面をクリックすると効果音が再生され、ステージのシーンに切り替わりますが、グローバルなノードの下位に音を再生するノードを配置したおかげで、シーンを切り替えてもノードが削除されず、途切れずに音が再生されました。
まとめ
「ビッグカツブロック崩し」作成の第13回では、音を再生するノードがシーンの切り替えで消されてしまい音が途切れてしまう問題に対処するため、シーンをまたいで使えるグローバルなノードを自動読み込み(Autoload) で作成して、そのグローバルなノードの下で音を途切れずに再生させました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- Xユーザーのビッグカツといか姿フライのすぐる【公式】さん: 「使いどころは思いつきませんが、フリー素材としてどうぞご自由にお使いくださいませ! https://t.co/8F9q3hS02b」 / X
- しょかきうたげ【フリーフォント版あり】 – ぼんのう堂 – BOOTH
- Singletons (Autoload) — Godot Engine (4.x)の日本語のドキュメント
- AudioStreamPlayer — Godot Engine (4.x)の日本語のドキュメント
記事一覧 → Compota-Soft-Press
コメント