i-school - 2Dタップシューティングゲーム 発展40
 引き続き音楽の面でのゲームの演出を追加していきます。

 この手順ではタイミングに合わせて SE を再生する処理を実装していきます。

発展40 −SEの再生−
81.SE 用のオーディオファイルをインポートし、SoundDataSO スクリプトを修正して、SE 用のオーディオデータを登録する
82.SoundManager スクリプトを修正し、SE 用の再生・停止処理を追加する
83.適宜なタイミングに合わせて SE を再生する処理を実装する



 新しい学習内容は、以下の通りです。

 ・オーディオファイルの容量圧縮やメモリ使用の設定



81.SE 用のオーディオファイルをインポートし、SoundDataSO スクリプトを修正して、SE 用のオーディオデータを登録する

1.設計


 SE とは効果音のことです。要所要所タイミングよく SE が鳴ることによって、ゲームの臨場感を増す演出が出来ます。

 無料の音楽サイトや持っている音源などをUnityへインポートして、ゲーム内で音楽を鳴らすための準備をします。

 まずはどのタイミング・シーンで SE を鳴らすかを想定し、その種類分の SE が必要になることを把握します
今回想定しているのは以下の3種類です。左側が想定するファイル名、右側が SE を鳴らす場面です。

<SE リスト>
 1.BulletDamage_1       --  エネミーにプレイヤーのバレットが接触したタイミング
 2.GameClear         --  ゲームクリア時のUI表示のタイミング
 3.GameOver             --  ゲームオーバー時のUI表示のタイミング

 今後、SE を鳴らしたいタイミングが増えた場合には、上記に追加をして検討してください。

 なお今回は、キャラのバレットの発射時や、エネミーから攻撃を受けた際の効果音についてはボイスを利用しています。
それらについてボイスではなくて SE で対応を行う場合には、それらの種類も列挙子として登録をしてください。


2.SE を再生する場面をイメージして、オーディオファイルを探してダウンロードする


 無料の音源ダウンロードサイトなどへアクセスして、頭の中で場面を思い浮かべながら、どんな SE がよいか、視聴しながら決めていきましょう。
先ほど提示した場面に合わせて、合計で3種類のオーディオファイルを用意をしてください。

 ダウンロードしたオーディオファイルは、上記のSEリストを参考にファイル名を変更しておきましょう。


3.オーディオファイルをUnityへインポートする


 Unityへオーディオファイルをインポートする方法は、画像ファイルと同じです。
Unityへドラッグアンドドロップしてフォルダへ移動することでインポートされます。

 今回は Audio フォルダ内の SE フォルダ内に全ファイルをインポートしています。


Audio/SE フォルダ画像



 無料サイトからダウンロードした場合にはオーディオファイルが圧縮されている可能性がありますので、必ず解凍を行った上でUnityへインポートしてください。
解凍されていないオーディオファイルはインポートが行えません


4.SoundDataSO スクリプトを修正して、SE 管理用のクラスを新しく追加する

 
 SoundDataSO スクリプトを修正して、BGM と同じように、SE 専用のクラスを作成して、
クラス単位で、オーディオファイルを登録したり、SE の種類を登録できるようにしましょう。

 enum、クラスの構成、List など、すべて BGM の際と同じ構成での製作になります。

 必要な情報を考えてから実装してみましょう

 記述する順番には任意ですが、enum の情報(SE の種類)を SeData クラスで利用し、完成した SeData クラスを List にするので、
下記のような順番で記述していくとよいでしょう。

<スクリプト内に実装する内容の例>
 1.SE 用の enum。BulletDamage、GameOver といった再生するタイミングや、シーン名で列挙子を登録しておく
 2.SE を管理する1つ単位でのデータ(通し番号、ボリューム、オーディオファイル、【1】で作成した enum による SE の種類などのデータ群)を扱うクラス
 3.【2】の SE 用のクラスのデータを複数作成してまとめる List(リスト)



SoundDataSO.cs


 スクリプトを作成したらセーブします。


5.SoundDataSO スクリプタブル・オブジェクトに SE 用のデータの設定を行う


 Datas フォルダ内にある SoundDataSO スクリプタブル・オブジェクトを選択してインスペクターを確認します。
SoundDataSO スクリプトにて宣言した seDataList 変数がインスペクターに表示されて、 Sizeが 0 になっています。
SE の種類として登録した列挙子の数に合わせて、seDataList 変数の Size を 3 に変更してください。Element 0 〜 2 が下に作成されます。

 下記の画像のように設定を行ってみてください。
オーディオファイルは Audio フォルダにある SE 用のオーディオファイルをドラッグアンドドロップしてアサインしてください。


インスペクター画像



 各数値やオーディオファイルは任意ですが、No の値だけは異なる番号で設定してください。できれば 0 から連番が理想です。
この番号はオーディオファイル用の番号として利用する可能性がありますので、同じ番号を重複して設定してしまうと、同じ番号のオーディオファイルが複数存在することになり、
番号によってオーディオファイルを特定することが出来なくなります。

 BGM の再生中に SE が一緒に鳴るようになりますので、あまりに BGM が大きいと SE の音が聴こえないことがあります。
まずは Volume の値も大きめ値にしておいて、BGM と一緒に SE を鳴らしてから調整を行うようにします。
またファイルによっては音量の大小がありますので、実際にファイルを再生して調整を行うことも大切です。


 以上でこの手順は完了です。


82.SoundManager スクリプトを修正し、SE 用の再生・停止処理を追加する

1.設計


 SoundManager スクリプトも、SoundDataSO スクリプトと同じように、SE の情報を追加して、
再生用のメソッドと停止用のメソッドを用意します。

 SoundManager はシングルトンパターンですので、SE の再生についてもメソッドを呼び出す命令を実行すれば
いずれのスクリプトからでも参照なしで SE を再生することが出来ます。

 BGM の実装を振り返りながら実装を行ってください。
BGM と異なり、SE は重複して鳴るようにすることを前提にしています。


2.SoundManager スクリプトを修正する


 必要な情報を宣言し、メソッドを考えてみてください。
BGM と異なり、SE は重複して鳴るようにすることを前提にしていますので、
それを考えた設計ロジックを考えていくことになります。


SoundManager.cs


 スクリプトを修正したらセーブします。


3.<オーディオファイルの容量圧縮やメモリ使用の設定>


 多くの BGM や SE を Unity にインポートして、それらをゲーム内で利用する場合、
オーディオファイルの数が増える程、アプリの容量は増え、メモリも圧迫していきます。

 インポートしたオーディオファイルには、これらの部分を設定できる項目があります。
モノラルに切り替えたり、ゲーム実行時ではなく、再生するタイミングでファイルを読み込むようしたりなど、
現在制作しているゲームに沿った設定変更が可能です。

 ゲーム製作に慣れてきたら、こういったメモリの負荷の部分などにもフォーカスしていきましょう。
他の処理にも言えることですが、Unity の公式マニュアルや公式スクリプトリファレンスには一度目を通して学習しておきましょう。


参考サイト
Unity公式マニュアル
オーディオクリップ
https://docs.unity3d.com/ja/2018.4/Manual/class-Au...
すくまりのメモ帳様
【Unity】重複ありのBGMの鳴らし方「Play()」「PlayOneShot()」
https://squmarigames.com/2018/12/19/unity-beginner...


4.ゲームを実行して動作を確認する


 ゲームを実行してみてください。Awake メソッドの処理が実行されて、SE 用の AudioSource コンポーネントが新しく10個追加されます。(合計12個)


SoundManager ゲームオブジェクト インスペクター画像



 それでは最後に SE を鳴らす処理を実装していきます。


83.適宜なタイミングに合わせて SE を再生する処理を実装する

1.設計


 今回追加した SE の再生処理を適宜なタイミングで鳴るように、自分のスクリプトに処理を追加してみましょう。

 メソッドの呼び出し命令は BGM の再生の場合と同じです。引数の型の指定が SeType になっています。

  // ゲームオーバーのSE
  SoundManager.instance.PlaySE(SoundDataSO.SeType.GameOver);

 どの場面で SE を鳴らすか、SE の種類に合わせて処理を追加してください。
また、ゲームオーバーの場合などは、SE を再生する直前に BGM を無音(Silence)や停止しておくことで BGM がなくなり、
SE のみを再生するという演出を行うことが出来ます。

 色々な処理の記述をして、どのような挙動になるかを体験してください。


 
 以上でこの手順は終了です。

 次は 発展41 −ボイスの再生− です。