Unityに関連する記事です

 ここからはゲームの演出を追加していきます。

 この手順ではBGMを再生し、場面に応じて自動的にBGMを切り替える処理を実装していきます。


手順26 ーBGMの制御処理の実装 
44.BGM用のオーディオファイルをダウンロードしてUnityにインポートする
45.スクリプトを使って、シーンに合わせてBGMを自動的に切り替える制御処理を実装する



 新しく学習する内容は以下になります。

・AudioSource.Playメソッド、AudioSource.Stopメソッド
・DOTweenの機能と実装例ぁ AudioSource.DOFadeメソッドを利用したBGMのクロスフェード演出処理ー



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


1.設計 ーBGMを鳴らす場面・シーンを考えるー


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

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

 1.title      --  タイトル表示中
 2.main       --  ゲームプレイ中
 3.result     --  ゲームクリア時、リザルト表示中
 4.gameover   --  ゲームオーバー時、ゲームオーバー表示中


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


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

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

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

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


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


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

 事前に Unity内に Audio フォルダを作成しておいて、その中へインポートするようにしましょう。
今回は Audio フォルダ内に BGM フォルダと SE フォルダを作成し、BGM フォルダ内に全ファイルをインポートしています。


Audio/BGM フォルダ画像



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


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


45.スクリプトを使って、シーンに合わせてBGMを自動的に切り替える制御処理を実装する


1.設計


 新しく作成する AudioManager スクリプトを利用して、先ほどの手順でインポートしたオーディオファイルをBGMとして再生したり、停止したりする制御を行います。
再生中のBGMを切り替えるにはいくつか手法がありますが、今回は4つの AudioSource コンポーネントを用意し、各 AudioClip プロパティ欄にオーディオファイルをアサインしておき
それを場面に応じて、再生させる AudioSource コンポーネントを切り替えていく方法を使います。

 他の方法については、SoundManager スクリプトを利用するページに作成方法を提示していますので、今回はその方法については割愛します。

 現在、ゲームの進行状態は GameDirector スクリプトを利用して管理を行っていますので、GameDirector スクリプトから AudioManager スクリプトに用意した
BGMを再生する処理を呼び出すように処理を追加して、BGMの再生と場面に応じたBGMの切り替え処理を実装します。


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


 音楽の情報を管理させるマネージャークラスを作成し、この中でゲーム内の BGM と SE の管理を行います。
このような1つの役割をまとめたマネージャークラスを作成しておくことで、今回であれば、音楽に関する情報はすべてここに集約して利用する活用が可能になります。

 おなじ機能を1つのクラスに集約することにより、音楽の管理や制御を行いやすくすることが出来ます。


AudioManager.cs



3.<AudioSource.Playメソッド、AudioSource.Stopメソッド>


 AudioSource.Playメソッドを利用することで、AudioSource コンポーネントの AudioClip にアサインされているオーディオファイルをゲーム内で再生することが出来ます。

 また、AudioSource.Stopメソッドを利用することで、AudioSource コンポーネントの AudioClip にアサインされているオーディオファイルの再生を停止することが出来ます。

 どちらのメソッドも、AudioSource コンポーネントを変数に代入することで命令を出すことが出来ます。

    [SerializeField]
    private AudioSource[] audioSources;

    // 新しい指定されたBGMを再生
    audioSources[index].Play();

    // 再生を停止
    audioSources[index - 1].Stop();

参考サイト
Unity公式スクリプトリファレンス
AudioSource
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unity公式スクリプトリファレンス
AudioSource.Play
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unity公式スクリプトリファレンス
AudioSource.Stop
https://docs.unity3d.com/ja/current/ScriptReferenc...


4.<DOTweenの機能と実装例ぁ AudioSource.DOFadeメソッドを利用したBGMのクロスフェード演出処理ー>


 DOTweenの機能である、AudioSource.DOFadeメソッドを利用すると、指定した時間をかけて徐々にボリューム(音量)を制御することが出来ます。

 第1引数に 変化後の Volume の値(動かしたい値)、第2引数には、Volume の値が変化するまでの時間を指定します。
Volume の値は AudioSource の Volume プロパティ欄を操作し、最小値は 0、最大値は 1 で指定を行います。

徐々にボリュームを小さくする場合
    // 徐々にボリュームを下げる
    audioSources[index - 1].DOFade(0, 0.75f);   // 0.75 秒かけて、現在のボリュームを 0 (最小値)にする
徐々にボリュームを大きくする場合
    // 徐々にボリュームを上げる
    audioSources[index].DOFade(0.1f, 0.75f);       // 0.75 秒かけて、現在のボリュームを 0.1f にする

 この機能を上手く活用することで、BGMが突然切り替わったり、あるいはBGMが切り替わるまでの無音の時間を作らない演出が可能になります。
今回の場合、新しく流すBGMのボリュームを徐々に大きくしていき、その間に前に流れていたBGMのボリュームが徐々に小さくなるという、BGMのクロスフェード演出を行っています。

 ボリュームは 1.0f まで設定可能ですが、最大値にしてしまうと、今後追加する SE の音を最大にしても聴こえなくなる恐れがありますので
ここでは小さめに設定して、バランスを取りながらスクリプトの値を調整してください。変数にしてインスペクターから設定できるようにしてもいいでしょう。


5.AudioManager ゲームオブジェクトを作成して、AudioManager スクリプトをアタッチし、設定を行う


 ヒエラルキーの空いている場所を選択して右クリックをしてメニューを開き、Create Empty を選択して空のゲームオブジェクトを1つ作成します。
名前を AudioManager に変更します。

 先ほど作成した AudioManager スクリプトをドラッグアンドドロップしてアタッチしてください。



 続けて AudioManager ゲームオブジェクトを選択して、インスペクターにて AudioManager スクリプトのアタッチを確認し、設定を行います。

 インスペクターの一番下にある Add Component ボタンを押して、AudioSource コンポーネントを追加してください。

 最初に、Play On Awake のチェックを外します。このチェックが入っていると自動的にBGMが再生されますが、
今回はスクリプトより再生・停止の制御を行いますので、このチェックは不要です。

 次に、AudioClip プロパティ欄にインポートして用意したオーディオファイルをドラッグアンドドロップしてアサインします。
ここでは title ファイルをアサインします。


<手順動画 アサイン>
https://gyazo.com/d44bd8a9fcf8cd91744d33b0ef0c8eac


AudioManager ゲームオブジェクト AudioSource コンポーネント画像



 この手順をあと3回繰り返して行い、それぞれの AudioClip プロパティ欄に main、result、gameover のオーディオファイルをアサインしてください。


AudioManager ゲームオブジェクト AudioSource コンポーネント画像



AudioManager ゲームオブジェクト AudioSource コンポーネント画像


 
 ゲームオーバー時のBGMについてはループ処理が不要な場合には Loop のチェックを外してください。


AudioManager ゲームオブジェクト AudioSource コンポーネント画像




 すべての AudioSource コンポーネントの設定が完了したら、画像のように、AudioSource コンポーネントを小さく折りたたんでください。
AudioManager スクリプトにアサインする際に操作をスムースにするための手順です。


AudioManager ゲームオブジェクト AudioSource コンポーネントを折りたたむ




 AudioManager スクリプトの AudioSources 配列変数の Size を 0 から 4 に変更してください。
Element 0 〜 3 が新しく追加されます。ここに、AudioSource コンポーネントを順番にアサインしてください。
配列の順番を利用してBGMの再生処理を行うため、このアサインの順番が違うと想定しているBGMが再生されませんので注意してください。


<手順動画 アサイン>
https://gyazo.com/218a1ab80c1935bc420c3083e1696ad2

アサインの順番
Element 0  => AudioClip プロパティ欄に title オーディオファイルをアサインしている AudioSource コンポーネント

Element 1  => AudioClip プロパティ欄に main オーディオファイルをアサインしている AudioSource コンポーネント

Element 2  => AudioClip プロパティ欄に result オーディオファイルをアサインしている AudioSource コンポーネント

Element 3  => AudioClip プロパティ欄に gameover オーディオファイルをアサインしている AudioSource コンポーネント


 以上で設定は完了です。


AudioManager ゲームオブジェクト 完成時のインスペクター画像



6.GameDirector スクリプトにBGMを切り替える処理を追加する


 AudioManager スクリプトを扱えるようにするため、新しく変数を1つ追加しています。

 また、Startメソッド、Updateメソッドに AudioManager スクリプトに用意した PlayBGMメソッドを呼び出す処理を追加して、
BGMの再生と切り替えの処理を実装します。


GameDirector.cs

 <= クリックすると開きます



7.GameManager ゲームオブジェクトの設定を行う


 GameDirector スクリプトの修正が終了したので、GameManager ゲームオブジェクトを選択して、インスペクターを確認します。
新しく AudioManager 変数が追加されて、アサイン情報が登録できるようになっていますので、こちらに AudioManager ゲームオブジェクトをドラッグアンドドロップしてアサインします。


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



<手順動画 アサイン>
https://gyazo.com/3e7a188897fe3fded2deed757321cb6d


GameManager ゲームオブジェクト アサイン後のインスペクター画像


 
 以上で設定は完了です。


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


 ゲームを実行してみましょう。タイトル表示の際に title のオーディオファイルが再生されていれば成功です。
クリックしてゲームを開始して、バルーンを生成してみてください。
このとき、title のボリュームが徐々に小さくなり、main のオーディオファイルのボリュームが徐々に大きくなりながら再生が開始されれば切り替えも成功です。

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


<応用:ゲームクリアとゲームオーバー時のBGMの処理を追加する>


 GameDirector スクリプトでは、ゲームクリアとゲームオーバーの状態に関しては管理を行っていません。
そのため、現在はゲームクリア時とゲームオーバー時にはBGMの切り替えが行われないままになっています。

 次の手順ではこれらの場面でのBGMの切り替え処理を実装していきますが、その前に、
どのように制御を行えばBGMを再生することができるようになるか、自分で設計を考えて実装をしてみましょう。


 最も簡単な実装方法は、ゲームクリアやゲームオーバーの判定を行っているスクリプトに、AudioManager スクリプトを紐づけして
ゲームオーバーになった際に、GameDirector スクリプトに追加した内容と同じ処理を追加することです。

 あるいは、GameDirector スクリプトにゲームオーバーの管理処理も追加して、BGMの切り替えについてはすべて
GameDirector スクリプトにて処理を行うようにしてもいいでしょう。


 是非自分なりのロジックを考えて実装してください。


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

 次は 手順27 ーBGMの制御処理の実装◆ です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます