【Unity 2022】音の再生とプログラミングについての初心者向け講座
ゲームを作る際に必ず必要な要素といえる音の実装の仕方について今回の記事では説明していこうと思います。
少なからず、音の実装には難しそうというイメージを持っていると思いますが、実際に見てみると意外と簡単だと感じると思いますので、気負いすぎずに行きましょう。
ではさっそく解説していきます。
音を鳴らすためのオブジェクトを設置する
音が鳴るときは、必ず発生源が存在します。
この発生源は、例えば人の声であれば人間が発生源ですし、金属バットにボールが当たったときのカキーンという音は金属バットが発生源です。
この発生源をまずは決めなければなりません。
今回は便宜上とりあえずエンプティオブジェクトを作って、そいつを発生源にすることにしましょう。(現在作っているゲームのキャラクターなどに音をつけたい場合は、そのキャラクターを発生源にしてもいいですよ。)
エンプティオブジェクトを作成
では、Unityを起動させ、ヒエラルキーの+(Create)から”Create Enpty”を選択してください。
一応エンプティオブジェクトについて説明しておきますと、transformの情報以外何も入っていないからのオブジェクトになります。
まだ何も詰められていない段ボール箱というような理解でいいです。
空っぽのオブジェクトなので、シーンビューには何も表示されていませんね。
名前はなんでもいいですが、"audio"という名前にでもしておきましょう。
オーディオソースを実装する
音を発生させるオブジェクトの配置は終わりました。
しかし、オブジェクトを配置しただけでは音を鳴らせるようにはなりません。
実際に音を鳴らすためには、スピーカーのようなものが必要になるのです。
では、先ほど設置したオブジェクト”audio"をクリックし、右側のインスペクター画面の下のほうにある”AddComponent”をクリックしてください。
クリックしますと、プルダウンメニューが表示されると思いますので、メニューの中の”Audio”→”AudioSource”を選択してください。
すると以下の画像のような項目が出現すると思います。これでスピーカーであるオーディオソースを実装することができました。
このオーディオソースの中を見ていくと、”PlayOnAwake”という項目にチェックがついているのが確認できると思います。
これは、「ゲームのスタートと同時に音を鳴らす」という設定になりますので、通常の効果音の場合はチェックを外しておきます。
ただ、BGMといった最初から流れている音楽の場合は逆にチェックをつけることで初めから流れる設定にしておきます。
このほかにも、このオーディオソースは、音についての様々な設定を行うことのできるコンポーネント(部品)になっています。
詳しく説明するときりがないので音を鳴らすということに絞って説明しますが、魅力的な機能が多いので、興味のある方は詳しく調べてみてください。
音源ファイルをインポートする
オーディオソースの実装までできましたが、音を鳴らすにしても、その肝心な音そのものがなかったら音はならせません。
ですので、まずは、鳴らしたい音を準備してください。
僕はゲームの効果音として、よくこちらのサイトにあげられている効果音を利用させてもらっていますので、効果音が欲しいと思っている方は、よかったらこちらのサイトもご覧になってみてください。
https://taira-komori.jpn.org/freesound.html
では、音の素材を準備することができましたら、さっそくインポートしていきましょう。
まずは、Unityの下のほうにあるprojectウィンドウの、Assetsフォルダを開いてください。
そして、そのフォルダの中で、右クリック→"Create"→"Folder"を選択し、フォルダーを作ります。
名前はAudioとでもしておきましょう。このフォルダーについて説明しておきますと、実際はなくても機能しますが、後々整理しやすいようにフォルダに分けることにしています。
インポートとは言いましても、実はすごく簡単で、PCのフォルダから該当の音楽ファイルをそのままドラッグしてきて、先ほど作成したUnityのaudioフォルダーの中まで持っていき、そこに置くだけです。
これでインポートの完了です。
僕の場合は決定音という名前で保存していたファイルを持ってきました。
オーディオクリップをセットする
音楽ファイルをインポートできたら、次は、その音楽ファイルをオーディオソースにアタッチします。
まずは、audioオブジェクト(音の発生源)を選択し、インスペクターに注目してください。
そして、インスペクターに表示されているAudioSourceコンポーネントの中の、上のほうにAudioClipという項があると思います。
この項の右側にあるスペースはNone(AudioClip)となっていると思いますので、この場所に先ほどインポートした音楽ファイルを持っていきます。
では、実際にドラッグして、アタッチしましょう。
アタッチすることができましたら、あとは再生するだけです。
これまで音楽ファイルと呼んでいたものは、UnityではAudioClipと呼ばれているので、ここからは単にクリップと呼ぶようにします。
クリップをアタッチすることは、オーディオソースをラジカセだとすると、中にCD(クリップ)をセットしたのと同じようなことになります。
では次に、実際に音を鳴らしていく方法について説明していきます。
音を再生する
音を再生する方法について説明していこうと思いますが、まずは、音を再生させるためにはスクリプトが必要ですので、スクリプトを作成してください。
Assetsフォルダの中に"scripts"フォルダを作成し、その中にスクリプトを作成していくとごちゃごちゃしなくて済みます。
スクリプトについて何もわからないという方は、まずは以下の記事を読んでみてください。
スクリプトを作成できましたら、名前をaudioにしておきましょう。
このaudioスクリプトをaudioオブジェクトのところまでドラッグして持っていき、アタッチしてください。
そしたら、audioオブジェクトのインスペクターから、スクリプトがアタッチされていることを確認しておきましょう。
アタッチされたことが確認できましたら、スクリプトをダブルクリックして開きます。
音楽再生プログラムの書き方
まず、プログラムの書き方からさっそく行きますが、以下のように書きます。
GetComponent<AudioSource>().Play();
この一文を書くだけでOKです。
短すぎて拍子抜けという感じかもしれませんが、一つのスクリプトから一つの音を鳴らすだけならこれをかくだけでOKなのです。
この一文を自分が鳴らしたいタイミングの箇所に書き込みます。
実際に音を鳴らしてみよう
では、ここからは、実際にUnityで音を鳴らしてみたいと思います。
まずは、audioスクリプトを開いてください。
次に、Update関数でもStart関数でもない部分(public Classと書かれている部分の下のところ)に下記のようなプログラムを書きます。
float t=0;
このfloat型の変数は、音の再生に直接は関係ありませんが、今回のプログラムでは1秒おきに音を鳴らしていこうと思いますので、タイマー機能を実装するために宣言しています。
そして、Start関数は飛ばして、Update関数の中に次のように書きます。
t+=Time.deltaTime;
if(t>=1)
{
GetComponent<AudioSource>().Play();//ここで音が鳴る
t=0;
}
//のあとの文(コメントといいます)のところは書かなくても大丈夫です。
以下のコードと同じように書かれていればOKです。
ここまで書けましたら、スクリプトを保存して、実行してみましょう。
すると、目の前には何もないまっさらな画面が広がっていると思いますが(からのオブジェクトなので当たり前ですね笑)、1秒おきに自分が用意した音がなっているのがわかると思います。
ピコンピコンうるさいですが、これでOKです。
スクリプトから複数の音を再生
先ほどまでの方法では、一つの音を再生するということに限定した方法でした。
ここで、勘のいい方ならお気づきでしょうが、音を再生するときに、
GetComponent<AudioSource>().Play();
という一文のみを書いただけなので、例えば音が3つあったときに、この書き方ではどの音を再生するように言っているのか区別できませんよね。
しかし、一つのオブジェクトから複数の音を場合に応じて鳴らしたいという局面はたくさんあります。
そこで、ここからは、複数の音を鳴らし分ける方法について説明していきます。
この方法では、主にスクリプトを用いりますので、スクリプトを開いておきましょう。
オーディオソースの宣言
ではまず、音を鳴らすためのオーディオソース(スピーカー)を設定していきます。
先ほどのスクリプトの t を宣言したところに次のように書いてください。
public AudioSource aud;
audと書かれたところは任意の名前でもOKです。
ちなみに、この、tを宣言したところで宣言された変数は、一つ外側の{}の中であれば、どこでも使える変数ということになります。
どういうことかといいますと、そこで宣言された変数は、Update関数の中でもStart関数の中でも使用することができるということです。
というのも変数には宣言された場所によって、それぞれ適応範囲が決まっているのです。
例えば、Update関数のなかで宣言された変数は、Updateの中では使えても、Start 関数の中では使うことができません。
publicという単語が出てきましたが、これは、変数の適応範囲を広くするといった具合の役割を持っています。
このpublicをつけて宣言した変数は、スクリプトの外からでも値を変えることができます。
では、宣言したaud(オーディオソース型の変数)にオーディオソースを実際に割り当てたいと思いますので、まずはスクリプトを保存していったん閉じてください。
そして、ヒエラルキーからaudioオブジェクトを選択し、インスペクターのaudioスクリプトのところに注目してください。
下の画像のようになっていると思います。
Audという項目が出てきているのがわかりますが、このAudというのは、スクリプトの中でpublicで宣言したaudのことになります。
そして、Audの右側はNone(AudioSource)となっていますが、これは、オーディオソースが割り当てられていないということを示しています。
ここにオーディオソースを割り当てる必要があるのです。
では実際に、前の項で付与したオーディオソースをAudの項に当てはめましょう。
そのままAudioSourceと書かれた部分をドラッグし、持っていくだけでできます。
こうなっていればOKです↓。
クリップの宣言
次にクリップを宣言する必要があります。
このクリップの宣言も、やり方はオーディオソースと同じです。
やはり、書く場所はtを宣言した場所と同じところです。
audの宣言文の下に、以下の文を書いてください。
public AudioClip a;
public AudioClip b;
今回は2つ文を書きましたが、これは、1つの音だけを宣言してもさっきと変わらないので、2つの音を宣言して、2つの音を鳴らし分けようという計らいからです。
スクリプトを保存して閉じてください。
そして、audioオブジェクトのインスペクターのaudioスクリプトに注目すると、今度は以下のようになっていると思います。
このうちのAの項目には、先ほどインポートした音をprojectウィンドウのaudioフォルダーからドラッグして当てはめましょう。
もう一つのBについてですが、めんどくさいとは思いますが、もう一つ、違う音を用意しましょう。
音を用意しましたら、Bにも音をドラッグして当てはめます。
僕の場合はこんな感じになりました。
音を鳴らすときの書き方
ここまで来たら、あとは好きなタイミングで音を鳴らすことができます。
音を鳴らしたい場合の書き方は以下のようになります。
aud.PlayOneShot(a); //()の中はbでもいい
まず、先頭のaudについてですが、ここには宣言したAudioSourceを書きます。
先ほどaudという名前でオーディオソースを宣言しましたので、audを書いているのです。
そして、PlayOneShot()で()の中に指定された音を再生することができます。
ですので、(a)であれば、先ほど宣言したクリップのaが再生され、(b)であればbが再生されます。
実際に鳴らしてみよう
それでは、実際に鳴らしていきたいと思いますので、Update関数の中を下のように書きかえてください。
if(Input.GetKeyDown(KeyCode.A))
aud.PlayOneShot(a);
if(Input.GetKeyDown(KeyCode.B))
aud.PlayOneShot(b);
そして、一番上に宣言した t はもう使いませんので、消してください。
このプログラムは、Aキーを押したときにaの音が鳴り、Bキーを押したときにbの音が鳴るプログラムになっています。
以下の画像のようなプログラムになっていればOKです。
ここまで書けましたら、ゲームを実行してみましょう。
実行しましたら、AキーかBキーを押してみてください。
どうでしょうか、それぞれ割り当てられた音が再生されたと思います!
なかなか感動的に感じる方もいらっしゃると思います。僕もその一人です笑。
これであなたも効果音を駆使することができるようになりました。
オーディオソース宣言の補足
前の項で、スクリプト中にAudioSourceを宣言したと思いますが、実はこのAudioSourceは複数宣言することができます。
といいますのも、AudioSourceというのはスピーカーのような役割だと少し前に説明しましたが、このスピーカー(オーディオソース)を自分好みに作って再生させることができるのです。
まず、AudioSource を宣言した後、インスペクターにAudioSourceコンポーネントを追加して当てはめたと思います。
その時、AudioSourceの項では様々な設定ができました。↑
例えば、音の大きさの設定や、周囲にどのくらいの距離まで音が届くかの設定を行うことができます。
このAudioSourceを再生させたい音に合わせてセッティングすることが可能なのです。
そして、複数の音を再生させる場合、それぞれの音にあったスピーカー(オーディオソース)が欲しくなってくると思いますので、そういったときに、それぞれカスタマイズしたオーディオソースを宣言する必要があるのです。
それから、その宣言したオーディオソースの数だけインスペクターにオーディオソースコンポーネントを追加する必要があります。(それぞれカスタマイズする必要があるので当たり前ですね笑。)
先ほどの例で行けば、以下のようなコードになります。(aとbをそれぞれ別のオーディオソースで再生する場合)
↓宣言するとき
public AudioSource aud1;
public AudioSource aud2;
public AudioClip a;
public AudioClip b;
↓音を再生するとき
aud1.PlayOneShot(a);
aud2.PlayOneShot(b);
このようにする場合、publicで新しく宣言したAudioSourceに、新しいコンポーネントを当てはめることを忘れないようにしましょう。
終わりに
この記事を書きながら思ったのですが、やはりゲーム作りにおける音というのは、奥が深いなと感じましたね。
実をいうと、今回書いた内容のものだけで、ゲームにおける音の実装についてはほぼ事足ります。
それでも、この記事に書けませんでしたが、まだまだ魅力的で面白い機能は存在します。
今回学んだことだけに固執せずに、これからさらに知識やスキルを深めていってくださいね。
それではまた。