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

2025年3月26日

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

背景:

  • 現在の設計では、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);
        }
    }
}

AudioSource.PlayClipAtPoint(clip, position); は、UnityのAPIの一つで、指定した位置で音声を再生するための便利なメソッドです。

主なポイント

  • 引数について
    • clip
      再生したいオーディオクリップ(AudioClip)を指定します。
    • position
      再生する音の位置をワールド座標(Vector3)で指定します。この位置に応じて、リスナーとの距離による音の大きさ(3Dサウンドの定位効果)が変化します。
  • 内部処理
    • このメソッドは、一時的なGameObjectを生成し、その上にAudioSourceコンポーネントを自動的に追加します。
    • 指定されたクリップを再生し、再生が終了するとそのGameObjectは自動的に破棄されます。
    • そのため、個別にAudioSourceを管理する必要がなく、手軽に音の再生が可能です。

使用例と用途

  • 効果音の再生
    衝突音や銃声など、特定の位置で発生する効果音を再生する際に便利です。
  • 3Dサウンドの実現
    音源の位置がリスナーの位置に応じて変化するため、リアルな空間表現が求められるゲームなどに適しています。

このメソッドを利用することで、シーン内でのオーディオ再生を簡単に実装でき、動的に生成される効果音の管理が容易になります。

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

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

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

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

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

  • サウンド再生の削除BasketController からサウンド再生のコードを削除し、単にアイテムの Collect()メソッドを呼び出すように変更しました。
  • AudioSourceコンポーネントの削除: サウンドを再生しないため、インスペクターでAudioSourceコンポーネントを削除できます
  • アイテムの種類に依存しない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