i-school - 2Dタップシューティングゲーム 発展38
 ここからは4回に分けて音楽の面でのゲームの演出を追加していきます。

 この手順では BGM の準備処理を実装していきます。

発展38 −BGMの準備−
76.BGM用のオーディオファイルをダウンロードしてUnityにインポートする
77.オーディオ用のデータベースとして利用するスクリプタブル・オブジェクトを作成する準備を行う −SoundDataSO スクリプトを作成するー
78.SoundDataSO スクリプトを利用して SoundDataSO スクリプタブル・オブジェクトを作成し、オーディオのデータを登録する



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

 ・BGMを鳴らす場面・シーンを考える



76.BGM用のオーディオファイルをダウンロードしてUnityにインポートする

1.設計


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

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

<BGM リスト>
 1.Main       --  ゲームプレイ中
 2.Boss      --  ボス戦時

 今後、場面が増えたり、リザルト表示のタイミングで BGM を変更したい、といった場合には、上記に追加をして検討してください。
また自分で BGM を考える場合にも、このようにリスト化しておくと管理しやすくなります。


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


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

 オーディオファイルは mp3 ファイルがサイズも小さく音質もよいため、おすすめです。
そのほかのUnityで再生可能なファイルについてはこちらを確認してください。

Unity公式マニュアル
オーディオファイル
https://docs.unity3d.com/ja/current/Manual/AudioFi...

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


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


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

 事前に Unity内に Audio フォルダを作成しておいて、その中へインポートするようにしましょう。
今回は Audio フォルダ内に BGM フォルダと SE フォルダとった形でフォルダを作り、利用する目的・種類ごとにフォルダ分けしておくと便利です。
今回は BGM フォルダ内に全ファイルをインポートしています。また、ファイル名も管理しやすいように、分かりやすい名称に変更しています。


Audio/BGM フォルダ画像



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


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


77.オーディオ用のデータベースとして利用するスクリプタブル・オブジェクトを作成する準備を行う −SoundDataSO スクリプトを作成するー

1.設計


 次回の手順で新しく作成する SoundManager スクリプトを利用して、インポートしたオーディオファイルをBGMとして再生したり、停止したりする制御を行います。
再生中のBGMを切り替えるにはいくつか手法がありますが、今回は2つの AudioSource コンポーネントを用意し、各 AudioClip プロパティ欄にオーディオファイルをその都度、
スクリプトを利用して動的にアサインして、再生させるオーディオファイルを切り替えていく方法を使います。

 このとき、オーディオファイルをゲーム内で動的にアサインする方法としては、リソースからロードしたり、
ゲームオブジェクトに事前にアサインしておいたりと様々な実装の方法があります。
 
 今回はオーディオ専用のスクリプタブル・オブジェクトを作成しておいて、そちらにデータ単位として、オーディオファイルを事前に登録しておく手法を利用します。

 スクリプタブル・オブジェクトには、BGM 用のデータ、SE 用のデータ、というように、用途ごとにクラスを作成し、それをクラス単位で List にして管理を行います。
エネミーやバレットの場合はそれぞれ1つのクラスで管理していましたが、それが複数あるという形式になります。
 
 また、各クラス用にて利用するための enum を一緒に宣言します。BGM 用の enum を作成して、BGM の種類を登録し、、SE 用の enum を作成して、SE の種類を登録する、という形式になります。

 これらの情報をすべてまとめて1つのスクリプト内に記述します。
今回はまず、BGM 用の enum の宣言と、BGM 用のクラスの宣言を行い、BGM 用クラスの List を宣言します。


2.SoundDataSO スクリプトを作成する


 スクリプタブル・オブジェクトを作成するために必要な、SoundDataSO スクリプトの作成を行います。
作成する手順はいままでと同じです。enum については1つのスクリプト内に記述していますが、
他の enum のように、enum のみのスクリプト・ファイルを用意しても構いません。
色々な方法での実装がありますので、試してみてください。

 必要な情報を考えてから実装してみましょう
記述する順番には任意ですが、enum の情報(BGM の種類)を BgmData クラスで利用し、完成した BgmData クラスを List にするので、
下記のような順番で記述していくとよいでしょう。

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



SoundDataSO.cs


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


3.SoundDataSO スクリプトの構造について


 実装した処理の内容について、順番に確認していきます。

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


1.BGM 用の enum。Main や Boss といった再生するシーン名で列挙子を登録しておく

 enum (イーナム) を利用して、BGM の種類を事前に登録し、この情報 BGM に関連する情報として BgmData クラス内に設定できるようにします。

    public enum BgmType {
        Main,
        Boss,
        Silence = 999
    }

 enum ではゲーム内に登場させたい種類の情報を、列挙子(れっきょし)という形で種類を作成できます。
今回は、BGM の種類、という情報を BgmType という名前で作成し、その中に BGM の種類を登録しておきます。
これは変更可能な情報ですので、先々に BGM の種類が増減しても対応できます。
 
 また無音状態用の列挙子などもあると便利ですので、ゲームの内容に応じた enum と列挙子を考えて作成して運用していきましょう。


2.BGM を管理する1つ単位でのデータ(通し番号、ボリューム、オーディオファイル、【1】で作成した enum による BGM の種類などのデータ群)を扱うクラス

 オーディオファイルを個々で扱う方法ではなく、1つのデータ単位として管理できるように BgmData クラスとして作成して管理を行うようにします。
利点は、1つの BgmData クラス内には1つ分のBgm 用のデータが登録できることです。

 BgmData クラス内に必要な変数を用意することによって、オーディオファイルの登録だけではなく、BGM の種類や、ボリュームの大きさといった値を用意しておくことが出来ます。
そしてこれらの情報を参照して利用できるような設計にしています。

 例えば、BgmData.bgmType と記述すれば、それはその BgmData クラスに登録されている BgmType の値を参照することが出来るようになります。

    [Serializable]
    public class BgmData {
        public int no;          // BGM の通し番号
        public BgmType bgmType;      // BGM の種類
        public float volume = 0.05f;   // BGM のボリューム
        public AudioClip bgmAudioClip;  // BGM として鳴らすオーディオファイル
    }

 このようにエネミー1体分に必要になるデータをクラスとしてまとめておくことで管理と利用が容易になります
また、エネミーの情報を増やしたい(獲得できる Exp や属性など)場合には、この EnemyData クラス内に 型と変数を追記すれば、好きなだけ増やすことも出来ます。
この教材でも順番に EnemyData クラスに追記していきますので、それを確認するとわかりやすいでしょう。


3.BGM 用のクラスのデータを複数作成してまとめる List(リスト)

 BgmData クラスには BGM に関連する情報をまとめておいて、登録できるようにしました。
このデータは BGM 1つ分ですので、もしも複数の BGM のデータを用意して登録したい場合、
この BgmData クラスを複数用意して、それを管理するための変数が必要になります。

 他のスクリプタブル・オブジェクトと同じように、BgmData 型の List を用意して管理をさせます。

    public List<BgmData> bgmDataList = new List<BgmData>();



 public 修飾子にて List を宣言することで、インスペクター上でサイズの変更が可能です
例えば BGM のデータを3つ分作って登録したい場合には、インスペクターで List のサイズを 3 に設定すれば
BgmData クラスが 3 つ、Element 0 〜 Element 2 として作成されますので、ここに BGM のデータを1つずつ、合計3つ分登録することが出来ます。


 以上でスクリプタブル・オブジェクト用のスクリプトの作成は完了です。


78.SoundDataSO スクリプトを利用して SoundDataSO スクリプタブル・オブジェクトを作成し、オーディオのデータを登録する

1.設計


 SoundDataSO スクリプトを元に SoundDataSO スクリプタブル・オブジェクトを作成します。
SoundDataSO スクリプトに用意してある BgmData 型の List である bgmDataList 変数がデータベースの役割を持っています。


2.<クラスのリスト化によるデータベース作成>


 BgmData クラスは1つのデータ情報を扱うことが出来ます。今回であればBGM 1つ分の情報です。
そのため複数の BGM の情報を扱う必要がある今回のような場合には、その分だけ BgmData クラスを追加して作成しなければなりません

 それらを管理するために BgmData 型の List を作り、まとめて管理を出来るようにしています。
ここで大切なことは、1つ1つの別の変数に個別に BgmData が存在していたのではまとめて管理していることにはなりません
BgmData のリストとはすなわち、BgmData をまとめて扱っているデータの集合体になりますので、ここにデータベースとして役割を成立させることが出来ます

 この管理方法はいままでと同じです。


3.SoundDataSO スクリプタブル・オブジェクトを作成する


 最初に、スクリプタブル・オブジェクトを管理するためのフォルダを作成しておきます。
Project 内で右クリックをしてメニューを開き、Datas フォルダを作成してください。
この中に作成されたスクリプタブル・オブジェクトを入れて管理します。



 Unity の左上のメニューより、Assets => Create => Create SoundDataSO を選択します。
新しく SoundDataSO というファイルが作成されます。名前はそのままで構いません。

 このアイコンの形が違うファイルがスクリプタブル・オブジェクトになります。
これはアセットとして取り扱われるようになる情報です。

 SoundDataSO スクリプタブル・オブジェクトを Datas フォルダへ移動してください。
今まで同様にスクリプタブル・オブジェクトを作成したら、Datas フォルダ内で管理するようにします。


<フォルダ管理>



 スクリプタブル・オブジェクトを活用して、BGM のデータを登録していきましょう。


4.SoundDataSO スクリプタブル・オブジェクトの設定を行う


 作成された SoundDataSO スクリプタブル・オブジェクトを選択してインスペクターを確認します。
SoundDataSO スクリプトにて宣言した bgmDataList 変数がインスペクターに表示されて、 Sizeが 0 になっています。
これがスクリプタブル・オブジェクトの中身です。

 Size に任意の数を入力すると、同数の Element が作成されます。これが List で管理する BgmData クラスの情報群になります。


インスペクター画像



 まずは BGM のデータを2つ分登録しておきたいと思います。
bgmDataList 変数の Size を 2 に変更してください。Element 0 〜 1 が下に作成されます。

 Element とは List の要素(中身)のことです。
そのため、Element 1つが BgmData 1つになります。Element の番号は 0 から始まります。



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


インスペクター画像



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

 また BGM の再生中に SE が一緒に鳴るようになりますので、あまりに BGM が大きいと SE の音が聴こえないことがあります。
まずは Volume の値も小さい値にしておいて、SE を鳴らすようになってから調整を行うようにします。
スクリプトを修正する必要はなく、スクリプタブル・オブジェクトのインスペクターより変更すれば Volume が変更になります。
これもスクリプタブル・オブジェクトの便利な部分です。



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

 次は 発展39 −BGMの再生− です。