Godot4 ビッグカツブロック崩し13 シーン切り替え時に途切れずに音を再生

※この連載の全ての記事は、タグ「ビッグカツ」の検索一覧から探すことができます。
※この連載で作ったゲームは「BigBreakOut(ゲームの作り方の記事付き) | フリーゲーム投稿サイト GodotPlayer」でプレイできます。

昔から人気の駄菓子「ビッグカツ」フリー素材画像が公開されたので、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 を使って、ビッグカツ画像を使ったブロック崩しを作成します。

「ビッグカツブロック崩し」作成の第13回では、音を再生するノードシーンの切り替え消されてしまい音が途切れてしまう問題に対処するため、シーンをまたいで使えるグローバルなノードを自動読み込み(Autoload) で作成して、そのグローバルなノードの下で音を途切れずに再生させます。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。

前回の記事

前回は、タイトルシーンを作成して、設定してある別のシーン(例ではブロック崩しのステージ)に切り替えるスクリプト例とテスト結果を紹介しました。

グローバルなノードに割り当てるスクリプトの作成

シーンをまたいで最初から最後まで使えるグローバルなノードにも、スクリプトを割り当てることができます。
ゲーム中最初から最後まで使いたいデータや機能を定義しておくと良いでしょう。

今回はシーンドックのノードのスクリプトではないので、ファイルシステムドックでスクリプトを作成します。
ファイルシステムドックの「 res:// 」フォルダ右クリックして表示されるメニュー「新規作成」→「スクリプト」を選択します。

Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成1

継承元のクラスは Node 以降の派生クラス(例では Node)を選択します。
Node の継承元である Object クラスなどは簡素ですが、シーンに配置できず、グローバルなノードのスクリプトにも対応しません。

ファイルパス(例では res://scutil.gd)を確認・設定して「作成」ボタンを押します。

Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成2

スクリプトには後から必要に応じて変数や関数を定義しますが、今は、ファイルを作成しただけで十分です。

static 関数を定義するスクリプトファイルの作成については以下の記事も参照してください。

グローバルなノードを自動読み込みで定義

ゲーム実行中、最初から最後までシーンをまたいで利用できるグローバルなノードプロジェクト定義します。

メニュー「プロジェクト」→「プロジェクト設定」で「プロジェクト設定」ダイアログを表示して、「グローバル」→「自動読み込み」タブを選択します。

Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成3

上図の「自動読み込み」タブの左上の「パス」項目に先ほど作成した scutil.gd スクリプトを選択します。
※「パス」項目の右側のフォルダアイコンのボタンから選択できます。

Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成4

次に「ノード名」項目で、グローバルなノードの名前を設定します。
ここで指定した名前でゲーム実行中のスクリプトからいつでもアクセスできるようになります。

class_name で定義したクラス名と同じノード名は指定できないので注意しましょう。

Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成5

ノード名を指定したら右側の「追加」ボタンで、グローバルなノードを追加します。

Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成6

以上で、シーンをまたいでゲームの最初から最後まで存在するグローバルなノードが作成できました
変数や関数を持たせたい場合は、先ほど作成してパスに指定した scutil.gd スクリプト定義しましょう。

Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成7

※設定したグローバル変数は、自動的に解放されるので、queue_free などを呼び出さないでください。

AutoLoad の詳細については公式サイトの「Singletons (Autoload) — Godot Engine (4.x)の日本語のドキュメント」を参照してください。

グローバル変数をスクリプトから使用する

音を再生するノードをもたせる上位ノードとして、シーンをまたいで存在するグローバルなノード(例では SCUtilGlobal )を指定します。
自動読み込み(AutoLoad)で設定したグローバルなノードは、その際に指定したノード名アクセスできます。

Godot4 ビッグカツブロック崩し シーンを超えて存在するノードとそれに割り当てるスクリプトの作成8

前回作成したタイトルのシーンに割り当てたスクリプトに、音を再生する処理を追加します。
※追加した部分はハイライトされている行です。

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!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました