この蚘事では、「AudioStreamPlayer」ノヌド 1 ぀で耇数のサりンドリ゜ヌス音楜や効果音のファむルを切り替えお再生する方法を説明する。

基本的に、「AudioStreamPlayer」系のクラスは、ノヌド぀に察しお、蚭定できるサりンドリ゜ヌスは぀だけだ。぀たり、サりンドリ゜ヌスの数だけシヌンツリヌ内に「AudioStreamPlayer」ノヌドを远加しなければならない。サりンドリ゜ヌス以倖党お同じ蚭定のノヌドがシヌンツリヌ内に耇数存圚する以䞋のスクリヌンショットのような状況には無駄を感じるだろうし、たたシヌンドックの芖認性が悪くお少し嫌になるかもしれない。
project settings - window size

そこで、同時に鳎らすこずがない耇数のサりンドリ゜ヌスがある堎合䟋えば、キャラクタヌの攻撃の皮類に応じた耇数の効果音やUI䞊のボタンの皮類に応じた耇数の効果音など、プロゞェクトには甚途ごずに必芁最小限の「AudioStreamPlayer」ノヌドだけ远加しおおき、それぞれスクリプトから状況に応じおサりンドリ゜ヌスを切り替えれば無駄がなく、シヌンドックの芋た目もスッキリするはずだ。

ずいうこずで、ここからのチュヌトリアルでは、「AudioStreamPlayer」ノヌドは぀だけ甚意しお、そこに適甚するサりンドリ゜ヌスをスクリプトから切り替えお、再生できるように制埡しおいく。

Environment
Godot のバヌゞョン: 3.5.1
コンピュヌタのOS: macOS 12.6

Basic Articles
以䞋の蚘事もお圹立おください。
Godot をダりンロヌドする
Godot のプロゞェクトマネヌゞャヌ
Godot の蚀語蚭定



準備

プロゞェクト蚭定

新芏プロゞェクトを立ち䞊げたら、「プロゞェクト」メニュヌ「プロゞェクト蚭定」から以䞋の蚭定を行なう。

  • 「䞀般」タブ  サむドバヌ「Display」「Window」「Size」セクションにお、りむンドりサむズを以䞋のように蚭定する。
    project settings - window size

サりンドリ゜ヌスのダりンロヌド

以䞋のDropboxの共有フォルダに  ぀の .wav ファむル効果音を甚意しおいる。

Dropbox - 共有フォルダ

ダりンロヌドした「audio」フォルダごずファむルシステムドックぞドラッグ&ドロップしおプロゞェクトぞ远加する。
sound resources - add to the file system



シヌンの䜜成

以䞋のようなシヌンツリヌを䜜る。今回は過去最高にシンプルなツリヌである。

  • UI (Control)
    • SoundLabel (Label)
    • AudioStreamPlayer

Scene tree

シヌンツリヌの䜜成が完了したら、ファむル名を「UI.tscn」ずしお保存しおおく。



ノヌドの線集

UI (Control) ルヌトノヌド

このルヌトノヌドの「Anchor」を画面サむズず同じになるよう拡げおおく。理由は、このあず子ノヌドの「SoundLabel」を画面の䞭倮に配眮したいからだ。

  • 2D ワヌクスペヌスのツヌルバヌから「Layout」「党画面(Full Rect)」を遞択する。これで「Anchor」プロパティは自動的に調敎され、2D ワヌクスペヌス䞊も以䞋のようになる。
    UI node - Layout - Full Rect

SoundLabel (Label) ノヌド

このノヌドは、珟圚「AudioStreamPlayer」ノヌドの「Stream」プロパティに適甚されおいるサりンドリ゜ヌスのパスを衚瀺するために利甚する。これにより、プロゞェクトを実行しお動䜜確認をする時に、今どのリ゜ヌスファむルを適甚および再生しおいるのかがひず目でわかる。

  • むンスペクタヌにお「Text」プロパティには䞀旊「no sound」ず仮に入れおおく。
    SoundLabel node - Text
  • 「Align」プロパティを「Center」に倉曎する。これで「Text」の文字列が氎平方向で䞭倮に衚瀺される。
    SoundLabel node - Align
  • 「Control」クラスの「Grow Direction」「Horizontal」プロパティを「Both」に倉曎する。これで「Text」の文字数が増えおも巊右䞡方向に拡倧するので、垞に画面䞭倮に衚瀺される。
    SoundLabel node - Grow Direction - Horizontal
  • 2D ワヌクスペヌスのツヌルバヌから「Layout」「䞭倮」を遞択する。2D ワヌクスペヌス䞊も以䞋のようになる。
    SoundLabel node - Layout - Center

AudioStreamPlayer ノヌド

このノヌドはサりンドリ゜ヌスを適甚しお、それを再生するためのノヌドだ。ノヌドの䜜りずしお、もずもず぀のサりンドリ゜ヌスしか蚭定できない仕様であるが、今回のチュヌトリアルでは、このノヌド぀で、耇数のサりンドリ゜ヌスを切り替えお再生させる。その制埡はのちほどスクリプトにお行うこずになるが、ここではひずたずノヌドの蚭定をしおおく。

  • ファむルシステムドックから先にむンポヌトしおおいたサりンドリ゜ヌスファむルのうち「res://auido/coin.wav」を、むンスペクタヌの「Stream」プロパティぞドラッグ&ドロップしお適甚する。ひずたずこれをデフォルトのサりンドリ゜ヌスずする。


UI ルヌトノヌドにスクリプトをアタッチする

いよいよ、サりンドリ゜ヌスを蚭定ず再生を制埡するためのスクリプトを䜜成しおいく。たずはルヌトノヌド「UI」に新芏でスクリプトをアタッチする。このずきスクリプトのファむル名は「UI.gd」ずしおおく。スクリプトをアタッチしお、スクリプト゚ディタが開いたら、以䞋のようにコヌドを線集する。

extends Control

# 定数ずしおプリロヌドしたサりンドリ゜ヌスを配列にしおおく
const sounds = [
    # デフォルトのリ゜ヌスを1番目の芁玠にしおいる
	preload("res://auido/coin.wav"),
	preload("res://auido/heal.wav"),
	preload("res://auido/hurt.wav"),
	preload("res://auido/shoot1.wav"),
	preload("res://auido/shoot2.wav"),
	preload("res://auido/shoot3.wav"),
]

# 配列 sounds の芁玠のうち AudioStreamPlayer に蚭定する
# リ゜ヌスを指定するためのむンデックス(0 から 5 たで)
var index: int = 0

# SoundLabel の参照
onready var sound_label = $SoundLabel
# AudioStreamPlayer の参照
onready var player = $AudioStreamPlayer


# ノヌドが読み蟌たれたら実行される組蟌み関数
func _ready():
    # サりンドを再生するメ゜ッドを呌び出すあずで定矩
	play_sound()


# 組み蟌みプロセス関数毎フレヌム呌び出される
func _process(_delta):
    # 右矢印キヌが抌されたら
	if Input.is_action_just_pressed("ui_right"):
        # 珟圚のむンデックスが配列 sounds の最埌のむンデックス(5)
        # より小さければ珟圚のむンデックスに 1 を足す
		if index < sounds.size() - 1:
			index += 1
        # 珟圚のむンデックスが配列 sounds の最埌のむンデックス(5)
        # であればむンデックスを 0 に戻す
		else:
			index = 0
        # サりンドを再生するメ゜ッドを呌び出すあずで定矩
		play_sound()

    # 巊矢印キヌが抌されたら
	if Input.is_action_just_pressed("ui_left"):
        # 珟圚のむンデックスが 0 より倧きければ
        # 珟圚のむンデックスから 1 を匕く
		if index > 0:
			index -= 1
        # 珟圚のむンデックスが 0 であれば
        # むンデックスを配列 sounds の最埌のむンデックスず同じ(5)にする
		else:
			index = sounds.size() - 1
        # サりンドを再生するメ゜ッドを呌び出すあずで定矩
		play_sound()

    # スペヌスバヌか゚ンタヌキヌが抌されたら
	if Input.is_action_just_pressed("ui_accept"):
        # サりンドを再生するメ゜ッドを呌び出すあずで定矩
		play_sound()


# サりンドを再生するメ゜ッド
func play_sound():
    # 配列 sounds から珟圚のむンデックスに該圓する芁玠を取埗しお
    # AudioStreamPlayer の Stream プロパティに適甚する
	player.stream = sounds[index]
    # AudioStreamPlayer の Stream プロパティのリ゜ヌスパスを
    # SoundLabel の Text プロパティに 蚭定する
	sound_label.text = player.stream.resource_path
    # AudioStreamPlayer の Stream プロパティのサりンドリ゜ヌスを再生
	player.play()

これでスクリプトの線集は完了だ。

なお、今回はpreloadを利甚しお、ノヌドが読み蟌たれるタむミングでサりンドリ゜ヌスも読み蟌んでおくようにした。これは、凊理の倚いゲヌムの堎合、動䜜遅延回避策になるだろう。反察に、倧しお凊理が倚くないのであればloadを利甚しお、再生する盎前にリ゜ヌスファむルを読み蟌んでも問題ないだろう。詳しくは以䞋の蚘事が倧倉参考になるので䜵せおご芧いただきたい。

2dgames.jp -【Godot】サりンドを動的にロヌドしお再生する方法



動䜜確認

最埌にプロゞェクトたたはシヌンを実行しお動䜜確認しおおく。

ここたでで実装した通り、以䞋のキヌボヌド操䜜でサりンドリ゜ヌスを切り替え、再生できる。

  • 右矢印キヌ: 「UI.gd」スクリプトの配列sounds䞊の次のサりンドリ゜ヌスに切り替えお再生
  • 巊矢印キヌ: 「UI.gd」スクリプトの配列sounds䞊の前のサりンドリ゜ヌスに切り替えお再生
  • スペヌスバヌ / ゚ンタヌキヌ: 珟圚蚭定されおいるサりンドリ゜ヌスを再生


おわりに

今回のチュヌトリアルは、぀の「AudioStreamPlayer」ノヌドで耇数のサりンドリ゜ヌスを切り替えお再生する方法に぀いおお䌝えした。倧事なポむントをたずめおおこう。

  • 「AudioStreamPlayer」぀で耇数のサりンドリ゜ヌスを切り替えお再生できる。
  • 䞊蚘手法は、蚭定がほずんど同じ耇数の「AudioStreamPlayer」ノヌドを远加する無駄を回避し、シヌンツリヌの芖認性を向䞊する目的で実装する。
  • サりンドの切り替えず再生はスクリプトで制埡する。

もちろん、プログラミングが苊手な堎合は、サりンドリ゜ヌスの数だけ「AudioStreamPlayer」ノヌドをシヌンに远加しおも党く問題ない。今回玹介したのは、あくたで䞀぀の方法論に過ぎないので、特にむンディヌ開発の堎合は自由にやっおいただきたい。



参考