前回まででゲーム内容が完成しました。しかし、まだサウンドをつけていないので音がなくて寂しい印象があります。そこでここではBGMやSEをつける作業を行いましょう。
「くろくま基本アセット」のSoundManagerについて
では作業に入る前に、まず最初に導入してもらった「くろくま基本アセット」のサウンド管理機能(SoundManager)について簡単に説明します。
このSoundManagerはAwakeのタイミングで「Resources」フォルダ内のBGM・SEを自動的にスキャンしてディクショナリに登録します。登録したサウンドの呼び出しは簡単で、
- 利用側のクラスで、StartのタイミングでSoundManagerを取得する
- それ以降の好きなタイミングで「PlayBGM(SE)ByName」メソッドを呼び出す
という手順を踏むだけです。まあ、この後実際のコードを掲載するのでそちらを見ていただければすぐにわかると思います。
※ちなみに、SoundManagerの動作の仕組みを詳しく知りたい方は姉妹サイトの「【Unity】サウンド管理クラス(SoundManager)を作る」をご覧ください。
サウンドファイルの移動
さて、それではサウンドを鳴らすための下準備を行います。「UnityChan2D」→「Demo」→「Sounds」の中にサウンドファイルがあると思いますが、それを「Resources」→「Audio」の中の「BGM」フォルダまたは「SE」フォルダに移動してください(当然ですがBGMは「BGM」フォルダ、効果音は「SE」フォルダに入れましょう)。
これでSoundManagerがサウンドファイルを読み込めるようになりました。
各種スクリプトの変更
そうしたら、次はサウンドが鳴るように次の2つのスクリプトを変更しましょう。
- GameManager
- PlayerController
GameManagerの変更
まず、またしてもGameManagerを変更します。スクリプトを開いて次のように変更してください(適宜省略してあります。「追加その3」というコメントのあるところが該当箇所です)。
//省略 //追加その3 [Header("サウンドの設定")] [SerializeField] AudioClip bgm = null; [SerializeField] AudioClip clearSe = null; [SerializeField] AudioClip gameOverSe = null; //省略 void Start() { if (Debug.isDebugBuild) { InstantiateWhenLoadScene(); InitGame(); //追加 } //追加その3 if(bgm != null) { soundManager.PlayBgmByName(bgm.name); } } //省略 public void Clear() { if (isClear || isGameOver) { return; } //追加その3 if (clearSe != null) { soundManager.PlaySeByName(clearSe.name); } //省略 } public void GameOver() { if (isGameOver || isClear) { return; } //追加その3 if (gameOverSe != null) { soundManager.PlaySeByName(gameOverSe.name); } //省略
ここでは
- BGM
- クリア時のSE
- ゲームオーバー時のSE
を追加しました。
PlayerControllerの変更
次に、またまたPlayerControllerを変更します。スクリプトを次のように変更してください(こちらも適宜省略してあります。「追加その3」というコメントのあるところが該当箇所です)。
//省略 [SerializeField] AudioClip damageSe = null; //追加その3 bool jump = false; bool damage = false; float inputH = 0; Animator animator; SpriteRenderer spriteRenderer; Rigidbody2D rigidBody2D; SoundManager soundManager; //追加その3 protected override void Start() { base.Start(); animator = GetComponent<Animator>(); spriteRenderer = GetComponent<SpriteRenderer>(); rigidBody2D = GetComponent<Rigidbody2D>(); soundManager = GameObject.FindGameObjectWithTag("GameController").GetComponent<SoundManager>(); //追加その3 } //省略 protected override void Damage() { //既にダメージ状態(=無敵時間中)なら終了 if (damage) { return; } //ヒットポイントを-1 //Hpプロパティにより、HPが0になると自動的にDead()が呼ばれる(※BaseCharacterController参照) Hp--; if(Hp > 0) { //追加その3 if(damageSe != null) { soundManager.PlaySeByName(damageSe.name); } StartCoroutine("DamageTimer"); } else { //追加その2 Dead(); } } //省略
こちらではダメージ時のSEを追加しました。
これで一通りサウンドが鳴るようになるはずです。実際にゲームを動かして確認してみましょう。