「Unity」 GUI・スクリプトでBGM・SE (効果音) を再生させる

music

ゲームといったらBGMや効果音ですよね。無音でゲームをやる機会の方が圧倒的に少ないと思われます。

プレイヤーが走る時、ジャンプする時の音。バックで流れているBGMの音・。敵キャラにダメージを与えた音・・。ゲーム内ではありとあらゆる場面で音が使われています。今回はその音をUnityで再生させるためのお話です。

SPONSORED LINK

▼この記事の目次

  1. ゲームと音楽
  2. ゲームと音声フォーマット
  3. BGMを再生する -GUI-
  4. SEを再生する -スクリプト-
  5. この記事のまとめ

ゲームと音楽

ゲームの面白さってグラフィックの部分・ゲーム性の部分はもちろんですが、BGM・効果音って結構大事な要素だと思います。

筆者は最近AndroidゲームをやったりYouTubeのゲーム実況を見ていますが、ゲームユーザー側の視点から見てゲームによってはBGM・効果音がゲームの何割かを占めているのではないかと思ってしまいます。
ゲームをやる時に無音でプレーするのと音をしっかり出してプレーするのとではまた違ってきますし、ゲームの名曲を集めたアルバムや動画もある位ですから。

「Unity」BGM・効果音

ではUnityでこのBGM・効果音を付けるにはどのようにしたらいいのか?と思ってしまいますよね。今回の紹介するのはそんな内容です。

Unityで音を出すための仕組みは初心者でも簡単にできるように提供されています。

  1. Audio Clip 「音源 / CD・DVD」
  2. Audio Sourcesで「音を出す / スピーカー」
  3. Audio Listenerで「音を聞く / マイク」

という仕組みです。ただ単にBGMを用意して設定して流すという仕組みではなくて、Unityの3D空間で「音を出す」(Audio Sources/スピーカー)・「音を聞く」(Audio Listener/マイク) この2つの独立した機能の組み合わせによって1つのBGMとして機能を実現できているんだという事が把握できていれば基本的な機能は理解できたといってもいいでしょう。

GUIを操作する方法と、スクリプトから実行する方法がありますが今回はGUIで操作する方法です。

「Unity」アセットストア

ゲームで音を鳴らすためにまず必要となるのは「音源となるファイルを用意する」という事です。用意するといってもゲームを作って効果音も録音して自作して・・

というのは面倒ですし時間が足りませんよね。フリーの音源を探してきてそういった所のものを利用するのもいいでしょう。ただ気を付けておきたいのがフリーの音声素材といっても全ての著作権を放棄しているというわけではないという事です。

利用するフリー素材には必ずといっていいほど「利用規約」がありますから、そこによく目を通すとその事について書いてあります。

気を付けたいのが・・

  • ライセンス表記がフリーの条件
  • ライセンス表記なしでフリーでOK。しかし配布は駄目

この2つのパターンが一般的ではないかと思われます。フリーの画像素材にも言える事ですがブログの素材としてなら問題なく使えたのが配布となると駄目という所がかなり多い気がします。
その配布という壁の問題が解消するのがUnityのアセットストアです。配布を前提とした形のライセンスだからです。だからといってアセットストア完全自由ですよというわけではありません。

アセットによっては個々にライセンスがある場合や改変は駄目だとかのライセンスがあります。まだ細かい所までライセンスを見ていませんが。

Unityのアセットストアを覗くと「音楽」「環境音」「効果音」などとなかなか充実しています。「SOUNDCLOUD」でサンプル再生する事もできます。

ゲームと音声フォーマット

音声ファイルのフォーマットには「.wav .mp3 .oga」等色々と種類があります。

となるとやはり・・
「どんなフォーマットを使えばいいの? 違いは?」という疑問が出てきます。

MP3

MP3にはライセンスがあります。普及してからライセンスフリーではないという事が発覚したとも言われている音声フォーマットです。

5000作以上のゲームを販売しているとMP3のライセンスが発生するというのです。

music3
ライセンス実施料 | mp3licensing.jp

「という事は5000作以内の公開・販売ならOKという事?」

という感じですよね。筆者は5000作もゲーム制作する予定はないですが、やはり安心できる方がいいですよね。そうした理由からかゲーム制作の場では慎重になって一般的にMP3はあまり積極的に使われていないようです。また国内に限らず海外においてもMP3ライセンスが発生します。

mp3licensing.jpというサイトを見る限りはゲームだけに限らずソフトウェアにも適用されるみたいですね。このようにMP3はフリーライセンスではないのです。

Unityでは以下の拡張子の音声フォーマットなどが利用できるようですが・・

music4

オーディオファイル | Unityマニュアル

この中から以下のフォーマット形式について見てみる事にしましょう。

  • 「.aif」
  • 「.wav」
  • 「.ogg」

AIFF

アップルによって開発された音声フォーマットです。拡張子は「.aif」「.aiff」「.aifc」「.afc」、アイフとも呼ばれています。主にMacで利用されているようです。

WAV

マイクロソフトとIBMによって開発された音声フォーマットです。拡張子は「.wav」

圧縮がされないため音質は劣化せず良いとされていますが、容量が多くなってしまいます。

Ogg Vorbis

MP3のライセンスの話題をきっかけにライセンスフリーの音声フォーマットとして開発されたのがOgg Vorbis (オッグボルビス) です。拡張子は「.ogg」、オッグとも呼ばれています。

Oggの特徴は、非可逆音声圧縮フォーマット (不可逆圧縮)でライセンスフリーというところです。Oggは一般的にあまり知られていない印象ですがライセンスフリーという事があってアプリやゲーム制作の場ではよく使われるようです。

BGMを再生する -GUI-

[YouTube] Unity オフィシャルチュートリアル – 日本語訳入り

さて、ここから今回の本題となります。UnityにてBGM・そして効果音の音声を再生モードで鳴らすという作業をしていきます。「BGM→GUI」・「SE→C#」

▼まずはメニューから「GameObject」→「Audio」→「Audio Source」と選択します。どうやらAudio Sourceはオブジェクトにもなるしコンポーネントにもなるようです。

music6

音楽ファイルをプロジェクトにインポート、またはフォルダから直接ドラッグ&ドロップします。

するとInspectorにAududio Sourceコンポーネントが現れシーン内のオブジェクトがスピーカーの形になりました。再生モードにすると音楽が流れました。一応これだけで音楽ファイルからBGMを再生する事が出来ます。

複数「Audio Source」も可能

試しに2台目、3台目とAudio Sourceを置いてそれぞれ別々の音源を入れて確認したら同時に違うBGMが流れました。

music

設定は・・

今回は音を出すのが目的なので細かい設定をしません。ざっとでも覚えておきたい設定項目だけ下に並べてみました。

Audio Source

  • 「AudioCrip」… 使用される音声フォーマットのデータ
  • 「Mute」… 再生されている状態で音量ゼロ
  • 「Play On Awake」… 開始直後に自動再生
  • 「Loop」… 繰り返しのループ
  • 「Priority」…  優先度 0が最大
  • 「Volume」… 音量調整
  • 「Pitch」… 音声スピード調整

Audio Listener / オーディオリスナー

Audio Sourceがスピーカーの役割を果たすなら、Audio Listenerはマイクの役割をします。Audio Listenerはいたってシンプルで設定項目はありません。Inspectorから機能の有効・無効の選択肢のみです。もちろん無効にすると音を拾う事が出来ません。

デフォルトではMainカメラにこの機能がくっついています。基本一つのシーンに一つのAudio Listenerです。

Audio Listenerはコンポーネントなのでメニューから「Component」→「Audio」→「Audio Listener」から追加する事ができます。

ゲーム内ではプレイヤーが動きまわるという場合がわりと多いと思われるのでプレイヤーの耳として機能するようにプレイヤー自身にAudio Listenerを付ける場合もあるようです。
試しにAudio Listenerをオブジェクトに追加しようとすると「この機能はMainカメラで使用されているので追加できません」みたいなダイアログが表示されてしまいました。この場合は、MainカメラのAudio Listenerを無効にしてからだとオブジェクトにこの機能を付ける事ができます。

music2

SEを再生する -スクリプト-

C#を使ってSE (Sound Effect/効果音) を鳴らすという事をしたいと思います。
と・・

その前に筆者はJavaを学習中の身なのでC#を知りません。C#がどのようなプログラミング言語なのかざっくり見てみましょう。

プログラミング言語・C#

C# (シーシャープ) は2000年にマイクロソフトが発表したプログラミング言語です。C++の拡張版でC++++ からの→ C#という表記になったと言われています。

C++の影響を受けながらJavaの影響を受けているのでもちろんオブジェクト指向プログラミング言語です。筆者が最初C#を見た時はJavaにそっくりだという印象が強かったです。

この2つの言語の違う部分の話は今回置いといて、クラス名や変数名の違う部分をまとめてみました。

C# Java
クラス名 PascalCase PascalCase
ローカル変数名 CamelCase CamelCase
メンバ変数名 CamelCase PascalCase
  • 「CamelCase/ キャメルケース」… 複数単語の先頭を小文字にする 例… testHoge
  • 「PascalCase/パスカルケース」… 複数単語の先頭を大文字にする 例… TestHoge
  • 「SnakeCase/スネークケース」… 全ての文字列を大文字にする/複数単語の間に「_」を入れる 例… TEST_HOGE

他にも違う箇所はありそうですが使いながら覚えていくというスタンスでいいでしょう。

「Unity」スクリプトを使う

それではUnityに戻りましてC#を使ってみましょう。Unityでスクリプトを使うにはメニューから「Assets」→「Create」→「C# Scrips」(またはJavascript) を選択します。Unityでスクリプトファイルはアセットの扱いになるようです。

▼ファイル名はエディタを開く前にすぐ決めておきます。Projectタブ内にC#のファイルが出来ました。

music3

Hogeファイルを選択した状態だとInspectorからスクリプトの内容が確認できます。このファイルをダブルクリックすると別画面にエディタが起動します。

using UnityEngine;
using System.collections;

public class Hoge : MonoBehaviour {
    void Start () {

    }

    void Update (){

    }
}

上のコードがデフォルトの雛型になります。MonoBehaviourというのはUnityにおいて全てのスクリプトのスーパークラスに位置します。Unityと連携するために用意されている存在です。

using UnityEngine;
using System.Collections;

public class TestClick : MonoBehaviour {
    public AudioClip se;

    void OnMouseEnter() {
        GetComponent<AudioSource>().PlayOneShot(se);
    }
}
【オブジェクトの準備】

スクリプトが出来上がりました。ではこのスクリプトをオブジェクトに関連付けしましょう。処理対象のオブジェクトをシーン内に用意します。さらにスクリプトファイルをHierarchy内のオブジェクトにドラッグ&ドロップ。

でもこれだけではこの処理の場合機能しません。対象オブジェクトのInspector内に持ってきたScriptに音声ファイルを入れます。

▼これでOK!再生するとSEが処理されます。
music4

用意されているメソッドである「OnMouse」を利用しました。上記コードの「OnMouseEnter」では、例えば「キュィィン!」という効果音を用意したとするならばカーソルをコライダーの効いたオブジェクト上に合わせる度に「キュィィン!」と音が鳴るという処理です。鳴るのは一回ですがカーソルを合わせる度に何度も処理します。

「OnMouse」にはこれ以外にも色々な種類があります。一覧にしてみましょう。

OnMouseEnter オブジェクトにカーソルを合わせると一回実行される
OnMouseOver オブジェクトにカーソルを合わせると繰り返し何度も実行される
OnMouseDown 左クリックすると一回実行される
OnMouseDrag 左クリックを押したままだと繰り返し何度も実行される
OnMouseUp 左クリックすると一回実行される & 左クリックを押したままオブジェクト外でボタンを離した時に一回実行される
OnMouseUpAsButton 左クリックすると一回実行される & 左クリックを押したままオブジェクト外でボタンを離した場合は実行されない
OnMouseExit オブジェクト内では実行されない & オブジェクト内からオブジェクト外に移動すると一回実行される

これだけ効果音のバリエーションがあれば色々なゲーム内で活用できそうな感じです。

この記事のまとめ

Unityはノープログラミングでもゲームが作れるとも言われているので、Unityで自由度が高いゲームを色々作りたいというならばスクリプトも使えるようになった方がいいかもです。

関連記事




この記事が気に入ったら
いいね!しよう

最新情報をお届けします

Twitterでめちゃログをフォローしよう!