【Swift】SpriteKitの使い方。バックミュージックや効果音を鳴らす。(Swift 2.2、XCode 7.3)

2020年6月16日

PlaySoundFileNamed Actionとは

本記事ではSpriteKit Sceneファイルの編集画面(シーンエディタ)にある部品のPlaySoundFileNamed Action(以下、サウンドアクション)について説明する。

PlaySoundFileNamed Action

サウンドアクションとは、バックミュージックや効果音を再生するためのアクションである。ゲームを楽しく盛り上げるにはサウンドは欠かせない存在だ。

 

サウンドアクションを使ってみる

実際にサウンドアクションを使ってみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。⇒「テスト用プロジェクト

事前準備では、背景と鳥2匹をシーンに追加し、タップで茶鳥を落として赤鳥と衝突するところまでを実装しておいた。それと、サウンドファイル(フリー素材)を追加しておいた。

 

下図赤枠のSKSファイルを選択してシーンエディタを開く。Animate横のボタン(黄緑枠)を押してタイムラインを表示する。茶色枠のオブジェクトライブラリボタンを押して部品一覧を表示し、ドラッグ&ドロップで「PlaySoundFileNamed Action」を背景ノードのタイムラインまで運ぶ(紫矢印)。

アトリビュートインスペクタボタンを押して設定画面を表示し、Filenameに「bird_music」を設定する。追加したアクションの左隅(黄枠)をクリックして吹き出しのメニューを表示し「∞」を選択する。これで、サウンドが繰り返し再生されるようになった。

PlaySoundFileNamed Action

 

以下は実際のプレイ動画

 

アトリビュートインスペクタの設定項目は以下の3つ。

StartTime

シーンが切り替わってからサウンドが再生し始めるまでの時間(秒)

 

Duration

サウンドの再生時間(秒)

 

Filename

サウンドファイル名

ソースコードでサウンドを再生する

SKSファイルでは無く、ソースコードでサウンドを再生する場合はdidMoveToViewメソッドを以下のコードのように変更する。

 

playSoundFileNamedメソッドに与える引数のwaitForCompletionは、trueの場合はサウンドがすべて流れ終わったらアクション終了falseの場合はサウンド再生開始とともにアクション終了となる。

例えば、以下のコードのようにド、ミ、ソの3つのサウンドを順番に再生するアクションを作るときに、waitForCompletionをすべてtrueにするとどうなるか。

 

以下の動画のようになる。

 

waitForCompletionをすべてfalseにするとどうなるか。

 

以下の動画のようになる。ドミソがほぼ同時に再生されて和音になった。サウンドが開始した瞬間に次のアクションに移行するため、同時に再生されたように聞こえるということだ。

 

今回の検証では、サウンドを再生するアクションは1つなのでtrueでもfalseでも変わらないように思える。

しかし、falseにして実行してみたところ、筆者の環境ではアクションを無限ループに変更する箇所でメモリが増え続け、サウンドは再生されずにアプリが以下のエラーを吐いて落ちる。。(・□・;)

新手のバグだろうか。。waitForComplitionをtrueにすればメモリは増えずにサウンドが再生されるので今回の検証ではtrueで進める。

 

サウンドアクションで再生した音楽を止めるには以下のコードのように、removeActionForKeyメソッドを利用する方法が昔あったが、現在の筆者の環境ではなぜか停止できない。⇒参考stackoverflow「How to stop/cancel PlaySoundFileNamed?

 

音楽の一時停止や音量、速度の調整が必要であれば、サウンドアクションを使わずに、以下のコードのようにAVAudioPlayerを利用したほうが良さそうだ。AVAudioPlayerの使い方については次の記事を参照されたし。⇒「AVAudioPlayerとは

 

以下はAVAudioPlayerを使ったプレイ動画

 

効果音を鳴らす

サウンドアクションを効果音に使う場合は、アクションをループさせないだけである。では最後に、鳥ノードが衝突したときに鳥の鳴き声の効果音を鳴らそう。

TestScene.swiftを以下のコードに変更する。ノードの接触が通知されたらサウンドアクションを使って効果音を再生している。バックミュージックはAVAudioPlayerで再生し、画面タップで一時停止できるようにした。

 

以下は実際のプレイ動画