i-school - パズルゲーム 発展13

BGMとSEを設定する


 SoundManagerクラスを利用して、ゲーム内にBGMを再生させます。また適所にSEの再生を追加します。

 SoundManagerクラスの製作方法については、こちらを参考して作成してください。


Enum列挙子の登録と再生処理の実装場所


 BGMとSEの再生を実装する際の名称と実装場所です。他にもあるようでしたら、適宜追加してください。

<BGM>

 1.Select  ゲームスタート〜干支の選択中
 2.Game  パズルゲーム開始時〜パズルゲーム中
 3.Result パズルゲーム終了〜リザルト表示中
 4.Select  リザルト表示終了〜ゲーム再スタート(AudioClipは【1】と同じ)

<SE>

 1.Result   リザルト表示時(スコアと消した数のカウントに合わせて、ドラムロール音)
 2.OK     干支の選択時(干支選択中に干支をタップして選択した時)と、スタートボタン押下時
 3.Erase    干支を消した時(パズルゲーム中)
 4.Skill    スキル発動時(スキルボタンを押した時)
 5.Transition リザルト表示→干支の選択へ遷移する時(フェイドアウト中)
 6.Shuffle   シャッフル時(シャッフルボタンを押した時)


SoundManager.cs
    public enum BGM_Type
    { 
        Select,
        Game,
        Result,
    }

    // SE管理
    public enum SE_Type
    {
        Result,
        OK,
        Erase,
        Skill,
        Transition,
        Shuffle,
    }


実装手順


 以下の手順で処理を実装します。

 1.Unityに音源をインポートする
 2.SoundManagerゲームオブジェクトのSoundManagerスクリプトのアサイン情報にAudioClipを追加する
 3.スクリプトにBGMを再生する処理を追加する
 4.スクリプトにSEを再生する処理を追加する
 5.ゲームを実行して動作を確認する

 まずは最初にUnityへ、AudioClipの元となる音源を追加します。


1.Unityに音源をインポートする


 無料のダウンロードサイトより、BGMとSEをダウンロードして、Unityへインポートしてください。
音源ファイルには、mp3ファイルが、サイズも小さく音質も良好であるためおすすめです。

 Unityへ音源をインポートする際には事前にフォルダを作成しておいて、その中へ整理してインポートしておいてください。
ここではProject内にAudioフォルダを作成し、その子フォルダとしてBGMとSEフォルダを作成しています。

フォルダ作成例



 インポートが終了しましたら、それらファイルの名前をこれから適用する内容に合わせて変更しておいてください。

BGMファイル名前


SEファイルの名前



2.SoundManagerゲームオブジェクトのSoundManagerスクリプトのアサイン情報にAudioClipを追加する


 SoundManagerゲームオブジェクトを選択し、インスペクターを確認します。
BGM_Clips 変数と SE_Clips 変数の Size が 0 になっていますので、それぞれ利用する音源の数に変更します。
BGM_Clips は 3、SE_Clips は 6 です。

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


Sizeをそれぞれ設定する









音源(AudioClip)のアサイン動画
https://gyazo.com/3954c2891a4a13a9d3ead449f140bfc8


完成したSoundManagerゲームオブジェクトのインスペクター画像



 再生するための音源の登録が終了しましたので、続いて、再生処理を追加します。


3.スクリプトにBGMを再生する処理を追加する


 以下の実装場所にBGMを再生する処理を追加します。
対象となるスクリプトのメソッドのみを抜粋して記述します。

 1.Select  ゲームスタート〜干支の選択中
 2.Game  パズルゲーム開始時〜パズルゲーム中
 3.Result パズルゲーム終了〜リザルト表示中
 4.Select  リザルト表示終了〜ゲーム再スタート(AudioClipは【1】と同じ)


1.Select ゲームスタート〜干支の選択中


 GameManagerスクリプトのStartメソッドに再生処理を追加します。


    IEnumerator Start() {
	StartCoroutine(TransitionManager.instance.FadePanel(0.0f));

////* ここに追加 *////

	SoundManager.instance.PlayBGM(SoundManager.BGM_Type.Select);

/////////////////////

	// スコアなどを初期化
	GameData.instance.InitGame();

	// ステートを干支選択中に変更
	gameState = GameState.Select;

   // 割愛


2.Game パズルゲーム開始時〜パズルゲーム中


 GameManagerスクリプトのPreparateGameメソッドに再生処理を追加します。

    public IEnumerator PreparateGame() {
	// ステートを準備中に変更
	gameState = GameState.Ready;

	// 残り時間の表示
	uiManager.UpdateDisplayGameTime(GameData.instance.gameTime);

	// ゲームに登場させる干支の種類を設定する
	yield return StartCoroutine(SetUpEtoTypes(GameData.instance.etoTypeCount));

	// スキルボタンの設定
	yield return StartCoroutine(SetUpSkill(GameData.instance.selectedSkillType));

	// 引数で指定した数の干支を生成する
	StartCoroutine(CreateEtos(GameData.instance.createEtoCount));

////* ここに追加 *////

	SoundManager.instance.PlayBGM(SoundManager.BGM_Type.Game);

/////////////////////

   }


3.Result パズルゲーム終了〜リザルト表示中


 GameManagerスクリプトのMoveResultPopUpメソッドに再生処理を追加します。
同じメソッド内の処理ですので、一緒にResult用のSEの再生処理も追加しておきましょう。
(SEの【1.リザルト表示時(スコアと消した数のカウントに合わせて、ドラムロール音】)

    private IEnumerator MoveResultPopUp() {
        resultPopUp.transform.DOMoveY(0, 1.0f).SetEase(Ease.Linear).OnComplete(() => {
		// ゲーム結果表示
		resultPopUp.DisplayResult(GameData.instance.score, GameData.instance.eraseEtoCount);
		//Debug.Log("リザルト内容を表示します");
	});

////* ここから追加 *////

	// SEを鳴らすまでの待機時間
	yield return new WaitForSeconds(0.5f);      // <= ☆ 待機時間は音源に合わせて適宜調整してください

	// ドラムロールのSE再生
	SoundManager.instance.PlaySE(SoundManager.SE_Type.Result);

	// SEが流れ終わってBGMを切り替えるまでの待機時間
	yield return new WaitForSeconds(2.5f);      // <= ☆ 待機時間は音源に合わせて適宜調整してください

	SoundManager.instance.PlayBGM(SoundManager.BGM_Type.Result);

/////////////////////

    }


4.Select リザルト表示終了〜ゲーム再スタート


 ResultPopUpスクリプトのOnClickMovePopUpメソッドに再生処理を追加します。
 音源には【1】と同じSelectのものを利用します。
同じメソッド内の処理ですので、一緒にTransition用のSEの再生処理も追加しておきましょう。
((SEの【5.リザルト表示→干支の選択へ遷移する時(フェイドアウト中)】)

private void OnClickMovePopUp() {

////* ここから追加 *////

        SoundManager.instance.PlayBGM(SoundManager.BGM_Type.Select);
        SoundManager.instance.PlaySE(SoundManager.SE_Type.Transition);

/////////////////////

        btnClosePopUp.interactable = false;

        transform.DOMoveY(posY, 1.0f);

        StartCoroutine(GameData.instance.RestartGame());
    }


4.スクリプトにSEを再生する処理を追加する


 以下の実装場所にBGMを再生する処理を追加します。
 対象となるスクリプトのメソッドのみを抜粋して記述します。

 1.Result   リザルト表示時(スコアと消した数のカウントに合わせて、ドラムロール音)
 2.OK     干支の選択時(干支選択中に干支をタップして選択した時)と、スタートボタン押下時
 3.Erase    干支を消した時(パズルゲーム中)
 4.Skill    スキル発動時(スキルボタンを押した時)
 5.Transition リザルト表示→干支の選択へ遷移する時(フェイドアウト中)
 6.Shuffle   シャッフル時(シャッフルボタンを押した時)

【1】と【5】はすでにBGMと一緒に追加済ですので、残る部分を追加していきます。


2.OK 干支の選択時(干支選択中に干支をタップして選択した時)と、スタートボタン押下時


 どちらも同じSEを利用します。

 干支の選択時は、EtoButtonスクリプトのOnClickEtoButtonメソッドに再生処理を追加します。

 private IEnumerator OnClickEtoButton() {

////* ここから追加 *////

        SoundManager.instance.PlaySE(SoundManager.SE_Type.OK);

/////////////////////

        // 干支ボタンの保持する干支データをGameDataに代入(選択した干支データとする)
        GameData.instance.selectedEtoData = etoData;

        // 干支ボタンをポップアニメさせる
        transform.DOScale(new Vector3(1.3f, 1.3f, 1.3f), 0.15f).SetEase(Ease.Linear);
        yield return new WaitForSeconds(0.15f);
        transform.DOScale(Vector3.one, 0.15f);

        // 干支ボタンの色を選択中の色に変更し、他の干支ボタンの色を選択中でない色に変更
        etoSelectPopUp.ChangeColorToEtoButton(etoData.etoType);
    }


スタートボタン押下時は、EtoSelectPopUpスクリプトのOnClickStartメソッドに再生処理を追加します。

    private void OnClickStart() {

////* ここから追加 *////

        SoundManager.instance.PlaySE(SoundManager.SE_Type.OK);

/////////////////////

        // スタートボタンを押せないようにして重複タップを防止
        btnStart.interactable = false;

    // 割愛


3.Erase 干支を消した時(パズルゲーム中)


 GameManagerスクリプトのOnEndDragメソッドに再生処理を追加します。

    private void OnEndDrag() {
	if (eraseEtoList.Count >= 3) {
	    // 選択されている干支を消す
	    for (int i = 0; i < eraseEtoList.Count; i++) {
		// 干支リストから取り除く
		etoList.Remove(eraseEtoList[i]);

		// エフェクト生成
		GameObject effect = Instantiate(eraseEffectPrefab, eraseEtoList[i].gameObject.transform);
		effect.transform.SetParent(etoSetTran);

		// 干支を削除
		Destroy(eraseEtoList[i].gameObject);

////* ここから追加 *////

		SoundManager.instance.PlaySE(SoundManager.SE_Type.Erase);

/////////////////////

	    }

	    // スコアと消した干支の数の加算
	    AddScores(currentEtoType, eraseEtoList.Count);

	    // スキルポイント加算
	    uiManager.AddSkillPoint(eraseEtoList.Count);

    // 割愛


4.Skill スキル発動時(スキルボタンを押した時)


 UIManagerスクリプトのTriggerSkillメソッドに再生処理を追加します。

    public void TriggerSkill() {

////* ここから追加 *////

        SoundManager.instance.PlaySE(SoundManager.SE_Type.Skill);

/////////////////////

        // ボタンの重複タップ防止
        btnSkill.interactable = false;

        // 登録されているスキルを使用
        unityEvent.Invoke();

    // 割愛



6.Shuffle シャッフル時(シャッフルボタンを押した時)


 UIManagerスクリプトのTriggerShuffleメソッドに再生処理を追加します。

    private void TriggerShuffle() {

////* ここから追加 *////

        SoundManager.instance.PlaySE(SoundManager.SE_Type.Shuffle);

/////////////////////

        // シャッフルボタンを押せなくする。重複タップ防止
        ActivateShuffleButton(false);

        // シャッフル開始
        shuffle.StartShuffle();
    }

 以上で再生処理の追加は終了です。


5、ゲームを実行して動作を確認する


 再生処理を追加しましたので、BGMやSEが正常に鳴るかを確認してみましょう。

 音量についてはSoundManagerスクリプトから適宜調整を行ってください。
SEのボリュームについてはAudioMixer処理を用意してありますので、もしも音量がバラバラすぎて調整が難しい場合には利用してください。

 以上でこの手順は完成です。おつかれさまでした。



 次は 発展14 です。

 合計3回の手順に分けて、ボム機能の制作をおこないます。