Unityで効果音(SE)を再生する方法について。複数の音を鳴らす方法も分かったのでメモしておきます。あとJavascriptでのコーディングはしていないので、便宜上C#での説明になります。
ちなみにUnityで使用できる音声ファイルのフォーマット(拡張子)は
- aif
- wav
- mp3
- ogg
です。
効果音を鳴らす方法
効果音を再生する方法は
- 音声用コンポーネントで効果音を用意して再生
- プログラム側で変数に効果音を格納して用意して再生
の2種類があります。(他にもあるかもしれませんが、僕はこれらの方法しか分からないので2種類としておきます)
また、以降説明する内容は1つのゲームオブジェクトにコンポーネントやスクリプトを設定すること前提とします。
音声ファイルをプロジェクトに取り込んでおく
各々での再生方法の前に、音声ファイルをプロジェクトに取り込んでおきましょう(インポート)。
効果音として鳴らしたい音声ファイルをプロジェクトビューにドラッグ&ドロップするか、メニューの「Assets > Import New Asset…」からプロジェクトにインポートします。
これで取り込みは完了です。
音声用コンポーネントで効果音を用意して再生
それではコンポーネントに音声ファイルを用意して再生する方法から。
効果音を鳴らしたいゲームオブジェクトに音声用コンポーネントの「Audio Source」を追加します。追加方法はゲームオブジェクトを選択し、インスペクターウインドウの「Add Component > Audio > Audio Source」、もしくはメニューの「Component」にも同じメニューがあるので同じくAudio Sourceを選びます。
複数の効果音を同じゲームオブジェクトから鳴らしたい場合は、複数のAudio Sourceを追加しましょう。
Audio Sourceコンポーネントを追加したら、「Audio Clip」の項目にプロジェクトビューからドラッグ&ドロップ、もしくは項目右の「○」マークをクリックして音声ファイルを設定します。Audio Sourceを2つ以上追加している場合も同様にそれぞれ音声ファイルを設定します。
(コンポーネントを追加した初期状態では「Play On Awake」にチェックがついてます。これはオブジェクトが生成された段階で再生する設定なので、もし生成と同時に再生してほしくない場合はチェックを外します)
これでコンポーネントによる音声の用意は完了です。次にスクリプトを作成し、以下のソースコードを記述してオブジェクトに追加します。この例では「PlaySound」というスクリプト名です。(スクリプト名とClass名が同じでなければコンパイルエラーになるので注意して下さい)
using UnityEngine;
using System.Collections;
public class PlaySound : MonoBehaviour {
private AudioSource sound01;
void Start () {
//AudioSourceコンポーネントを取得し、変数に格納
sound01 = GetComponent<AudioSource>();
}
void Update () {
//指定のキーが押されたら音声ファイル再生
if(Input.GetKeyDown(KeyCode.K)) {
sound01.PlayOneShot(sound01.clip);
}
}
}
このスクリプトを追加したら、ゲームを実行してキーボードのKを押してみます。音声が鳴ればOKです。
音声コンポーネント(音声ファイル)が複数の場合
もし追加したAudio Sourceコンポーネントが2つ以上なら10行目のGetComponent
の末尾に「s」を追加し、GetComponents
にします。(単数形から複数形に修正)。
そして型指定のAudioSource
に”[]”(大括弧)を追加し、AudioSource[]
にします(ただの変数から配列に修正)。変数への格納部分も同様に修正します。(以下を参考にして下さい)
using UnityEngine;
using System.Collections;
public class PlaySound : MonoBehaviour {
private AudioSource sound01;
private AudioSource sound02;
void Start () {
//AudioSourceコンポーネントを取得し、変数に格納
AudioSource[] audioSources = GetComponents<AudioSource>();
sound01 = audioSources[0];
sound02 = audioSources[1];
}
void Update () {
//指定のキーが押されたら音声ファイル再生
if(Input.GetKeyDown(KeyCode.K)) {
sound01.PlayOneShot(sound01.clip);
}
if(Input.GetKeyDown(KeyCode.L)) {
sound02.PlayOneShot(sound02.clip);
}
}
}
参考:Can I play multiple AudioSources from one gameobject? – Unity Answers
プログラム側で変数に効果音を格納して再生
次にプログラム側で効果音を用意し再生する方法です。プログラムで効果音を用意するには様々な方法があると思うのですが、とりあえず簡単なサンプルを載せておきます。
using UnityEngine;
using System.Collections;
public class PlaySound : MonoBehaviour {
//音声ファイル格納用変数
public AudioClip sound01;
public AudioClip sound02;
void Update () {
//指定のキーが押されたら音声ファイルの再生をする
if(Input.GetKeyDown(KeyCode.K)) {
audio.PlayOneShot(sound01);
}
if(Input.GetKeyDown(KeyCode.L)) {
audio.PlayOneShot(sound02);
}
}
}
この例では2つの変数を用意していますが、必要であれば3以上、不要であれば1つにします。また、Update関数内のキーボード入力で再生するif文も変数に合わせて追加、もしくは削除しておきます。
そして、効果音を鳴らしたいゲームオブジェクトに上記のスクリプトと「Audio Source」コンポーネントを追加して下さい。スクリプト名は「PlaySound」です。
publicな変数には、インスペクターウインドウからドラッグ&ドロップで音声ファイルを設定します。
音声ファイルの設定が終わったらゲームを実行して確認してみましょう。(上記のソースコードのままで言うなら)KとLキーを押下すると音が鳴るはずです。
参考: Unity – Scripting API: AudioSource.PlayOneShot
ちなみにUnityは自動的に非圧縮の音声ファイル(wav)をoggに変換してくれるようですね。Unityで自動変換するより専用のソフトで変換した方が良いようです。
BGM再生の場合はカメラオブジェクトにアタッチすると良い形になります。