課題3: サウンドを各アイテムから再生する

各アイテム(リンゴ、爆弾)が収集された際に、それぞれ異なるサウンドを鳴らすように設定し、オブジェクト指向的なサウンド管理を学ぶ。

背景:

  • 現在の設計では、BasketControllerがアイテムのタグに基づいてサウンドを再生していました。これでは、BasketControllerがアイテムの種類に依存してしまい、拡張性や保守性が低下します。
  • 各アイテム自身がサウンドを再生することで、BasketControllerはアイテムの種類を意識せずに済み、コードの責任範囲が明確になります。

ステップ:

ItemControllerにサウンド再生の機能を追加する:

ItemController スクリプトを修正する

  • アイテムごとに異なるサウンドを設定できるように、AudioClipを追加する。
  • サウンドを再生する際にAudioSource.PlayClipAtPoint()を使用する。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemController : MonoBehaviour
{
    public float dropSpeed = -0.03f;
    public AudioClip itemSE;  // 各アイテムが持つサウンド

    void Update()
    {
        // アイテムの移動
        transform.Translate(0, this.dropSpeed, 0);

        // アイテムが画面外に出たら破壊
        if(transform.position.y < -1.0f)
        {
            Destroy(gameObject);
        }
    }

    void OnTriggerEnter(Collider other)
    {
        // バスケットに触れた時
        if(other.gameObject.tag == "Basket")
        {
            // サウンドを再生し、アイテムを即座に破壊
            AudioSource.PlayClipAtPoint(this.itemSE, transform.position);
            Destroy(gameObject);
        }
    }
}

バスケットゲームオブジェクトのタグを登録:

  • 新しく、Basketタグを作成し、basketゲームオブジェクトに登録します

アイテムプレハブへの設定:

  • 各プレハブのItemControlleritemSEフィールドに対応するサウンドを再設定する。

BasketControllerからサウンド再生を削除する:

  • サウンド再生の削除BasketController からサウンド再生のコードを削除し、単にアイテムの Collect()メソッドを呼び出すように変更しました。
  • アイテムの種類に依存しないBasketController はアイテムのタグに基づく処理を行わず、ItemController が自身で処理を行うため、依存性が低減されました。
void OnTriggerEnter(Collider other)
{
    if(other.gameObject.tag == "Apple")
    {
        this.director.GetComponent<GameDirector>().GetApple();
    }
    else
    {
        this.director.GetComponent<GameDirector>().GetBomb();
    }
    // Destroy(other.gameObject); // ここも削除、アイテム側で破壊
}

テストと確認:

  • ゲームをプレイし、バスケットがリンゴや爆弾に衝突した際に、各アイテムに設定されたサウンドが正しく再生されることを確認する。
  • サウンドが途切れずに再生されることを確認する。

学習ポイント:

  • AudioSource.PlayClipAtPoint() の使用方法。
  • オブジェクトごとにサウンドを管理する方法。

Unity

Posted by hidepon