課題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ゲームオブジェクトに登録します
アイテムプレハブへの設定:
- 各プレハブの
ItemController
のitemSE
フィールドに対応するサウンドを再設定する。
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()
の使用方法。- オブジェクトごとにサウンドを管理する方法。
ディスカッション
コメント一覧
まだ、コメントがありません