本投稿は2024年9月時点の内容になります。アップデートにより変更となる場合があります。また環境によって違いがあると思いますのであくまで参考として、ご了承ください。
様々な書籍、ブログや動画を参考にさせていただきました。多すぎて一つ一つはお紹介できませんが感謝です。
初心者の自分がUnity ソフトウエアでゲームを作ってみました。とりあえずシンプルなものということでモグラたたきに挑戦です。ゲーム作ってみるかという感じになったときに、いいタイミングで某ゲームのイベントシナリオ内ミニゲームにモグラたたきが実装されていたのでUIとかエフェクトとか、諸々の仕様をぱくって参考にして作ってみましたよ。様々なHowToの中の選択肢のひとつとして、同じ初心者さんの参考になればよいです。
\ チェック /
目次
今回はゲームに効果音をつけていきます。
今回はゲームに効果音をつけていきたいと思います。
今までやってきた「ScriptableObject」や「アニメーションイベント」を使うと簡単に効果音をあつかえます。
本記事のポイント
- Unity で音を出す方法
- ScriptableObjectを使った効果音の管理
- スクリプトから効果音を鳴らす方法
- アニメーションイベントを使って動きに音を合わせる方法
Unity プロジェクトで音を出す仕組み
Unity プロジェクトで音を出すには以下の3つが必要です。
音を出すのに必要なもの
- AudioClip AudioSourceコンポーネントで使うオーディオデータ(実際はデータそのものではなく参照している。オーディオデータをアセットとして扱うもの)。音が記録された媒体(例えばCD)的なものだとイメージしてOKです。mp3やwavなどが扱えます。
- AudioSource 字面的にこちらがオーディオデータぽいですが違います。まさに音源です。音を再生するプレイヤーとスピーカーが一緒になったものをイメージ。
- AudioListener AudioSourceから発生した音を拾うマイクみたいなものです。これで音を拾ってゲーム機から音を出します。デフォルトでメインカメラについています。
とくにスクリプトを中心に扱ってるときにAudioSourceの存在を忘れてハマったりします。なので、この3つが必要なことを覚えておきましょう。
今回はAudioListenerには特に触れません。他2つを見ていきます。
AudioClip 音素材の準備
なにはともあれ鳴らす音ががなければ始まりません。音の素材をゲットしましょう。
今回はピコピコ系の音は「効果音ラボ」様、声はユニティちゃん公式の「『コーゲンシティ・オールスターズ!』ユニティちゃんアクションボイスパック Vol.1」を使わせていただきました。
フリー素材を使ときも有料素材を使う場合もライセンス等に注意しましょう!ダウンロードの方法は各サイトにて確認しましょう。
これらの音素材をプロジェクト内にインポートすればAudioClipとして扱えます。必要な音素材を必要に応じてリネームしてフォルダーに整理しておくといいです。
ScriptableObjectでAudioClipを管理する
効率よく効果音を使えるようにScriptableObjectを使ってデータベース化していきます。
ScriptableObjectの使い方はこちらも参考にしてみて下さい。
以下スクリプトです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//メニュー表示
[CreateAssetMenu]
public class AudioClipDB : ScriptableObject
{
//Listの定義
public List<AudioClipData> audioClipList=new List<AudioClipData>();
//データベースに登録したオーディオクリップを含むAudioDataを名前で取得するメソッド
public AudioClipData FindAudioClipByName(string name)
{
AudioClipData audioClipData=audioClipList.Find(AudioClipData=>AudioClipData.Name == name);
//一致するものがなかったらコンソールに出力
if (audioClipData == null)
{
Debug.Log("指定された名前がステータスリストに見当たりません");
}
return audioClipData;
}
}
//AudioDataの項目
[System.Serializable]
public class AudioClipData
{
public string Name;
public AudioClip AudioClip;
[Range(0f,1f)] public float DefaultVolume;
}
スクリプトざっくり解説
- (6-23)ScriptableObjectのデータベース化の処理
- (6)「作成」メニューに表示
- (12-23)データベースに登録したオーディオクリップを含むAudioDataを名前で取得するメソッド
- (25-31)AudioDataの項目
オーディオクリップデータベースの作成
- プロジェクト上で右クリック>作成>「AudioClipDB」作成をクリック 任意の名前で作成します。
- 「+」をクリックして各クリップを登録していきます。
- 削除したいときは「-」をクリックします。
- 今回はキャラクター用、カウントダウン用、エフェクト用に分けましたが、一緒に効果音用としてまとめてしまっても問題ありません。
AudioSourceコンポーネント
音を出したいゲームオブジェクトにAudioSourceコンポーネントを追加します。
カウントダウンで音を出したいので、例としてCountDownオブジェクトに付けてみます。
音を出すためのスクリプトの準備
音を出すスクリプトを作成します。スクリプトから効果音を出すにはAudioSource.PlayOneShot(AudioClip)を使っていきます。上記で作ったデータベースを使えるように、以下「AudioController」クラスとメソッドを書いていきます。
以下スクリプトです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioController : MonoBehaviour
{
[SerializeField] AudioSource audioSource;
[SerializeField] AudioClipDB audioClipDB;
public void PlayAudioData(string name)
{
//データベースから名前でAudioClipを含むAudioDataの取得
AudioClipData audioData=audioClipDB.FindAudioClipByName(name);
//取得したAudioClip
audioSource.PlayOneShot(audioData.AudioClip, audioData.DefaultVolume);
}
}
スクリプトざっくり解説
- (7)AudioSourceの設定
- (8)データベースの設定
- (10-14)AudioDataを名前から取得してそのフィールドのAudioClipをPlayOneShotで鳴らします。
「CountDown」オブジェクトにスクリプトをアタッチして、自身のAudioSourceとデータベースのScriptableObjectをアサインします。
効果音を鳴らしてみます
実際にスクリプトから音を出していきます。作成した「AudioController」を使って、他のスクリプトやアニメーションイベントから音を鳴らします。
アニメーションイベントから音を出す
アニメーションイベントを使って効果音を追加します
- 音をつけたいアニメーションウィンドウを開いてアニメーションイベントを付けます。今回はまず、カウントダウンCountDownの秒数に音をつけたいので60,120,180フレームにイベントを追加します。
- functionを設定して引数に鳴らしたい音の名前を入れます。今回は「countdown」。
- 次にカウントダウンCountDownの最後「GO」にも別の音をつけたいので、240フレーム目にもイベントを追加します。
- functionを設定して引数に鳴らしたい音の名前を入れます。今回は「go」。
どうですか?アニメーションに簡単に効果音をつけることができました。
同様に敵キャラ(Unityちゃん)にも動作に合わせて効果音(声)を入れていきます。
Unityちゃんにも効果音(声)を追加します
- 「AudioSource」コンポーネントと「AudioController」スクリプトをアタッチして、スクリプトにAudioSourceとAudioDataのScriptableObjectをアサインします。
- アニメーションイベントを使って出現時の効果音を付けます。
- アニメーションイベントを使ってクリック時の効果音(声)を付けます。
- アニメーションイベントを使ってクリックされなかった時の効果音(声)を付けます。
次はスクリプトから効果音を出します
レベルアップした時の効果音をつけます。プレイヤーのレベル表示に付けてもいいですが、後々レベルのスライダー表示に光るエフェクトをつけたいので、効果音のスライダー表示に付けたいと思います。
以下スクリプトの修正点です。
public class PlayerExpSliderUI : MonoBehaviour
{
[SerializeField] Player Player;
[SerializeField] Slider PlayerExpSlider;
//AudioControllerを設定
[SerializeField] AudioController AudioController;
//レベルアップをチェックするためのフィールド
int currentLevel;
//省略
public void UpdatePlayerExpBar()
{
PlayerStatus _player = Player.PlayerStatus;
PlayerExpSlider.value = 1 - (_player.NextExp - _player.Exp) / _player.RequiredExp;
//変更点 レベルアップ時の処理
if (currentLevel<Player.PlayerStatus.Level)
{
AudioController.PlayAudioData("levelup");
currentLevel = Player.PlayerStatus.Level;
}
}
//省略
}
スクリプトざっくり解説
- (6)AudioSourceの設定
- (8)レベルアップをチェックするためのフィールド
- (16-20)変更点 レベルアップ時の処理 データベースからAudioData「levelup」を取得して、そのAudioClipを鳴らします。
必要なものをアサインします。
これでレベルアップ時の効果音が鳴らせました。
まとめ
まとめ
- Unity プロジェクトで音を鳴らすにはAudioSource、AudioClip、AudioListenerが必要
- 効果音をスクリプトから鳴らすときはAudioSource.PlayOneShot(AudioClip)を使う
- ScriptableObjectを使ってAudioClipを管理すると便利
- スクリプトとアニメーションイベントを使うとアニメーションに合わせて効果音を出せる
\ Unityのスクリプトを書くのに役立ちます /
もっと早く教えてほしかった!Unity C#入門
MARU
\ 初学に使った書籍です /
動画×解説でかんたん理解! Unityゲームプログラミング超入門
大角 茂之/大角 美緒
おすすめ記事
Unity ソフトウエアでゲーム制作#1モグラたたき編(29.ゲームにBGM…
Unity ソフトウエアでゲーム制作#1モグラたたき編(27.エフェクト2パ…
Unity ソフトウエアでゲーム制作#1モグラたたき編(26.エフェクトその1)
Unity ソフトウエアでゲーム制作#1モグラたたき編(25.プレハブバリア…
Unity ソフトウエアでゲーム制作#1モグラたたき編(24.Buttonで…
Unity ソフトウエアでゲーム制作#1モグラたたき編(23.シンプルなアニ…