サウンド マネージャーを作成する前に、まず空のクラス Manager を作成してすべてのマネージャー シングルトンを保存します。これにより、後でマネージャーを使用するときに、Manager クラスを直接呼び出すだけで済みます。Manager クラスを作成するたびに、Manager クラスに登録する必要があります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Manager
{
public static AudioManager m_Audio = AudioManager.Instance;
}
サウンドマネージャーの完全なコード:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioManager : ManagerBase<AudioManager>
{
// environment sound
private AudioSource envPlayer;
// sound effect
private AudioSource sePlayer;
// music
private AudioSource Player;
// Start is called before the first frame update
void Start()
{
envPlayer = gameObject.AddComponent<AudioSource>();
sePlayer = gameObject.AddComponent<AudioSource>();
Player = gameObject.AddComponent<AudioSource>();
// do not destroy audio manager when switching scene
GameObject.DontDestroyOnLoad(gameObject);
}
// play music
public void PlayMusic(string name, float volume = 1) {
AudioClip clip = Resources.Load<AudioClip>(name);
PlayMusic(clip, volume);
}
public void PlayMusic(AudioClip clip, float volume = 1) {
Player.volume = volume;
Player.clip = clip;
if (Player.isPlaying) {
Player.Stop();
}
Player.Play();
}
public void StopMusic() {
Player.Stop();
}
public void ChangeMusicVolume(float volume) {
Player.volume = volume;
}
// play environment sound
public void PlayEnvMusic(string name, float volume = 1) {
AudioClip clip = Resources.Load<AudioClip>(name);
PlayEnvMusic(clip, volume);
}
public void PlayEnvMusic(AudioClip clip, float volume = 1) {
envPlayer.volume = volume;
envPlayer.clip = clip;
if (envPlayer.isPlaying) {
envPlayer.Stop();
}
envPlayer.Play();
}
public void StopEnvMusic() {
envPlayer.Stop();
}
public void ChangeEnvMusicVolume(float volume) {
envPlayer.volume = volume;
}
// play sound effect
public void PlaySeSound(string name, float volume = 1) {
AudioClip clip = Resources.Load<AudioClip>(name);
PlaySeSound(clip, volume);
}
public void PlaySeSound(AudioClip clip, float volume = 1) {
sePlayer.PlayOneShot(clip, volume);
}
// play sound effect on an object
public void PlaySeSoundOnObject(string name, GameObject go, float volume = 1) {
AudioClip clip = Resources.Load<AudioClip>(name);
PlaySeSoundOnObject(clip, go, volume);
}
public void PlaySeSoundOnObject(AudioClip clip, GameObject go, float volume = 1) {
AudioSource player = go.GetComponent<AudioSource>();
if (player == null) {
player = go.AddComponent<AudioSource>();
}
player.volume = volume;
player.PlayOneShot(clip);
}
public override byte GetMessageType() {
return MessageType.Type_Audio;
}
}
コード解釈:
1
// environment sound
private AudioSource envPlayer;
// sound effect
private AudioSource sePlayer;
// music
private AudioSource Player;
// Start is called before the first frame update
void Start()
{
envPlayer = gameObject.AddComponent<AudioSource>();
sePlayer = gameObject.AddComponent<AudioSource>();
Player = gameObject.AddComponent<AudioSource>();
// do not destroy audio manager when switching scene
GameObject.DontDestroyOnLoad(gameObject);
}
サウンド マネージャーは、envPlayer、sePlayer、Player の 3 つのプレーヤーをセットアップし、それぞれゲーム環境の音楽、効果音、BGM を管理するために使用されます。ゲーム オブジェクトに AudioSource コンポーネントをマウントする必要がないように、Start メソッドで 3 つのマネージャーを初期化します。同時に、ゲームシーンの切り替え時にサウンドマネージャーが削除されないことを望み、GameObject.DontDestroyOnLoad(gameObject); を使用して実現します。
2
// play music
public void PlayMusic(string name, float volume = 1) {
AudioClip clip = Resources.Load<AudioClip>(name);
PlayMusic(clip, volume);
}
public void PlayMusic(AudioClip clip, float volume = 1) {
Player.volume = volume;
Player.clip = clip;
if (Player.isPlaying) {
Player.Stop();
}
Player.Play();
}
public void StopMusic() {
Player.Stop();
}
public void ChangeMusicVolume(float volume) {
Player.volume = volume;
}
音楽を再生するメソッド PlayMusic では、AudioClip オブジェクトを直接取得するか、音楽名を取得して Resources フォルダーで対応する AudioClip を見つけるという 2 つの状況を考慮します。
AudioClipを直接取得した場合、ボリュームやクリップを設定した後、他の音楽を再生しているかどうかを判断し、再生中の音楽を再生している場合は、再生中の音楽を閉じてから、新しいクリップの再生を開始します。もちろん、ここでは特定のゲームのニーズに応じて再生ロジックを変更することもできます
音楽名が渡された場合は、リソースから音楽をロードし、2 番目の PlayMusic メソッドを呼び出します。
同時に音楽を消す方法や音量を変更する方法も設定します
環境音の設定はBGMの設定とまったく同じなので、ここでは繰り返しません。
// play sound effect
public void PlaySeSound(string name, float volume = 1) {
AudioClip clip = Resources.Load<AudioClip>(name);
PlaySeSound(clip, volume);
}
public void PlaySeSound(AudioClip clip, float volume = 1) {
sePlayer.PlayOneShot(clip, volume);
}
// play sound effect on an object
public void PlaySeSoundOnObject(string name, GameObject go, float volume = 1) {
AudioClip clip = Resources.Load<AudioClip>(name);
PlaySeSoundOnObject(clip, go, volume);
}
public void PlaySeSoundOnObject(AudioClip clip, GameObject go, float volume = 1) {
AudioSource player = go.GetComponent<AudioSource>();
if (player == null) {
player = go.AddComponent<AudioSource>();
}
player.volume = volume;
player.PlayOneShot(clip);
}
サウンド設定のために、PlaySeSoundOnObject メソッドを追加しました。この方法は、3D ゲームでは、音源がプレイヤーに直接ではなく、遠くにあるゲーム オブジェクトにあることがあり、距離が離れるにつれて音が小さくなる場合があることを考慮しています。PlaySeSoundOnObject メソッドは、音源として使用するゲーム オブジェクトを渡し、オブジェクトに AudioSource があるかどうかを判断し、存在しない場合はコンポーネントを追加し、オブジェクト上の AudioSource で効果音を再生します。