UnityのAudio Mixerの再生やボリュームを制御するには:Unity 5で無料になった機能の使い方(2)(3/3 ページ)
ゲーム開発環境Unity 5の「Personal Edition」では、Unity 4.6以前では有料だった機能が無料で使えるようになった。本連載では、Unity 5で無料になった機能の使い方について解説していく。今回は、音楽ファイルの音量を上げ下げしたり、音を消したり、さまざまな音声エフェクトを追加して音色を変えたりするミキサーをゲームから使う方法について。
音楽を再生するスクリプトの追加
次に、「Scene」上の各Cubeをクリックして、パーティクルを表示させ、そのCubeに関連付いている音楽を再生するスクリプトを記述する。
「Hierarchy」から「Cube」「Cube 1」「Cube 2」を選択して、「Inspector」の「Add Component」から「New Script」を選択する。「Name」に「MouseClick」、「Language」に「Java Script」を選択して、「Create and Add」ボタンをクリックする。
「Inspector」に「Mouse Click」の項目が追加されるので、「Script」の「MouseClick」をダブルクリックして、表示される「MonoDevelop」にリスト1のコードを記述する。
今回のスクリプトのコードは長く、見た目は複雑そうに見えるが、よく見ると、同じ処理を、オブジェクトの名前別に記述しているだけで、実際は簡単なコードだ。
//#pragma strict private var myObj:GameObject; private var myObj1:GameObject; private var myObj2:GameObject; private var myAudioClip:AudioClip; private var myAudioClip1:AudioClip; private var myAudioClip2:AudioClip; function Start () { myObj=GameObject.Find("Cube"); myObj1=GameObject.Find("Cube 1"); myObj2=GameObject.Find("Cube 2"); } function Update () { if(Input.GetMouseButtonDown(0)) { var unityRay:Ray; unityRay=Camera.main.ScreenPointToRay(Input.mousePosition); var unityHit:RaycastHit=new RaycastHit(); if(Physics.Raycast(unityRay,unityHit)) { var Obj:GameObject=unityHit.collider.gameObject; switch(Obj.name){ case "Cube": myObj1.GetComponent(AudioSource).Stop(); myObj2.GetComponent(AudioSource).Stop(); myObj.GetComponent(AudioSource).loop=true; myObj.GetComponent(AudioSource).PlayOneShot(myAudioClip); myObj.GetComponent(AudioSource).Play(); (myObj1.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=false; (myObj2.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=false; (myObj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=true; (myObj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play(); (myObj1.gameObject.GetComponent("ParticleSystem") as ParticleSystem).enabled=false; (myObj2.gameObject.GetComponent("ParticleSystem") as ParticleSystem).enabled=false; break; case "Cube 1": myObj.GetComponent(AudioSource).Stop(); myObj2.GetComponent(AudioSource).Stop(); myObj1.GetComponent(AudioSource).loop=true; myObj1.GetComponent(AudioSource).PlayOneShot(myAudioClip1); myObj1.GetComponent(AudioSource).Play(); (myObj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=false; (myObj2.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=false; (myObj1.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=true; (myObj1.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play(); (myObj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).enabled=false; (myObj2.gameObject.GetComponent("ParticleSystem") as ParticleSystem).enabled=false; break; case "Cube 2": myObj.GetComponent(AudioSource).Stop(); myObj1.GetComponent(AudioSource).Stop(); myObj2.GetComponent(AudioSource).loop=true; myObj2.GetComponent(AudioSource).PlayOneShot(myAudioClip2); myObj2.GetComponent(AudioSource).Play(); (myObj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=false; (myObj1.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=false; (myObj2.gameObject.GetComponent("ParticleSystem") as ParticleSystem).loop=true; (myObj2.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play(); (myObj1.gameObject.GetComponent("ParticleSystem") as ParticleSystem).enabled=false; (myObj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).enabled=false; break; } } } }
「#pragma strict」をコメントアウト
今回は、先頭の「#pragma strict」をコメントアウトする(1行目)。これをコメントアウトしていないと、実行時に、ParticleSystemのenabledでコンパイルエラーが表示される。必ずコメントアウトして、コンパイルエラーを出さないようにする。VB.NETの「Option Strict On」のようなものなのだろう。
GameObject型とAudioClip型の変数を宣言
まず、「myObj」「myObj1」「myObj2」のGameObject型の変数を宣言し(2〜4行目)、「myAudioClip」「myAudioClip1」「myAudioClip2」のAudioClip型の変数を宣言する(5〜7行目)。
Start関数内の処理
Start関数内で、Findを使って「Cube」「Cube 1」「Cube 2」にアクセスし、変数「myObj」「myObj1」「myObj2」で参照する(9〜13行目)。
Ray型パーティクルの設定
15〜68行目のUpdate関数内では以下の処理を行う。
17〜67行目では、マウスの左ボタンがクリックされたときの処理を記述する。
Ray型の変数unityRayを宣言する(19行目)。Ray(レイ)とは「光線」の意味で、設定した方向に光線を飛ばすことが可能だ。そして、下記コードのようにスクリーン座標を介して、マウス位置のカメラにレイを飛ばす(20行目)。
Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit型の変数unityHitを宣言し、RaycastHitの新しいインスタンスを作成する(21行目)。RaycastHitは、レイを飛ばした際に、衝突したオブジェクトの情報を取得するために使用する(22〜66行目)。
GameObject型のObj変数を宣言し、レイを飛ばして衝突したオブジェクトの情報を変数Objで参照する(24行目)。Obj.nameでマウスの左クリックしたオブジェクトの名前が取得できる。
「Cube」「Cube 1」「Cube 2」それぞれの処理
25〜65行目では、Switch文を使って、取得したオブジェクトの名前で条件分岐を行う。
取得した名前が「Cube」であった場合は、26〜38行目の処理を行う。
まず「Cube 1」と「Cube 2」の再生を停止する(27〜28行目)。「Cube」に関連付いているオーディオの再生には「PlayOneShot」を使用して、引数に「Inspector」で指定した「AudioClip」を指定し(30行目)、Playで再生を実行する(31行目)。
次に、「Cube 1」「Cube 2」のパーティクルのloopにfalseを指定し、パーティクルの再生を停止する(32〜33行目)。「Cube」のパーティクルの再生は実行する(34〜35行目)。
「Cube 1」と「Cube 2」のパーティクルのenabledにfalseを指定して、パーティクルの使用を不可とする(36〜37行目)。
オブジェクトの名前が「Cube 1」であった場合(39〜51行目)は、「Cube 1」に関連付いている音楽を再生し、パーティクルを表示する。その他のCubeの音楽再生は停止し、パーティクルも使用不可とする。
オブジェクトの名前が「Cube 2」であった場合(52〜64行目)は、「Cube 2」に関連付いている音楽を再生し、パーティクルを表示する。その他のCubeの音楽再生は停止し、パーティクルも使用不可とする。
実行結果
それでは、実行してみよう。だが、その前に必ずビルドすることを忘れないでほしい。
実行すると、動画3のようになる。実行時は、「Cube」に関連付いている音楽が再生され、パーティクルも表示されるが、間もなくパーティクルも消滅する。その時点で、各Cubeをクリックしてみてほしい。各Cubeに関連付いた音楽が再生される。
Cube | Cube 1 | Cube 2 | |
---|---|---|---|
色 | 赤色(動画では右) | 青色(動画では中央) | 黄色(動画では左) |
Audio Mixer | 1(動画ではミキサー左から2番目) | 2(動画ではミキサー左から3番目) | Audio Mixer3(動画ではミキサー左から4番目) |
音楽ファイル「With love from Vertex Studio」の番号 | 30 | 5 | 10 |
この場合は、「Audio Mixer」の「S」「M」「B」ボタンは、どれも押された状態ではないことを確認して実行する必要がある。
最後に、Unity5メニューの「File」→「Save Scene as」から「Audio Mixerサンプル」という名前で保存しておこう。
次回は、カメラの視点の変え方が多彩になるFreeLookCameraRigとMultipurposeCameraRig
今回はこれで終わりだ。「Audio Mixer」を使用すると、ゲームの場面場面で、音楽を切り替えることができ、ゲームにも幅が出るのではないだろうか。
次回は、これもUnity 5で無料になったFreeLookCameraRigとMultipurposeCameraRigの使い方について解説する。カメラの視点の変え方が多彩になるので、楽しみにしてほしい。
- Unity 4.6以前はPro版でしか使えなかった無料のアセットでクジラを泳がせる
- Unity 5における地形の作り方&画面にさまざまな特殊効果を与えるImage Effectの使い方
- UnityでテクスチャにレンダリングできるRender Textureとオブジェクトに反射光を当てるGlobal Illumination、Light Probe
- Unityで回転、追従、ズームなどカメラの視点の切り替え方や表現を多彩にする4つのプレハブ
- UnityのAudio Mixerの再生やボリュームを制御するには
- UnityでWebカメラの画像をリアルタイムで複数テクスチャとして表示する&Kinectセンサーと連動させる
著者紹介
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
主な著書
『Unity4.x アセット活用術: Asset Storeから落としたAssetを自分の作品の中で使用する方法』(Kindleストア)
『Unity4.xプログラミングTips集: Asset StoreからインポートしたAssetの使い方を徹底解説』(Kindleストア)
『Unity Scriptの基本+Unity Script Tisp集』(Kindleストア)
『Unity初めの一歩: 超初心者のためのUnity入門』(Kindleストア)
『Unity4.x入門+プログラミングTips集: 初心者から中級者対応。Assetの使い方を徹底解説』(Kindleストア)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ディープだが覚えておきたいUnityゲーム開発の小テク16選まとめ
2015年2月24日、「日本Androidの会 Unity部」の主催による「Visual Studio Tools for Unity」の勉強会が開催された。日本マイクロソフトのエバンジェリストによるVSTUの紹介やQ&Aに加え、UnityやVisual Studioを使いこなすプロのゲーム開発者によるライトニングトークも行われ、盛り上がりを見せた。 - ハッカソン、デバイス、海外展開、人材育成――ゲーム開発で私たちは今何をすべきか
2015年1月23〜25日、世界中で同時に行われた48時間にわたるゲーム開発ハッカソンの模様と、ゲーム開発がテーマのトークセッションをいくつかダイジェストでお届けする。 - ゲーム嫌いも知っておきたい3D CG/VRのエンタープライズ活用事例〜Unity Solution Conference 2014まとめ
ゲーム開発で有名なUnity。医療や建築、ヘルスケア、観光などゲーム以外の活用事例をイベントリポートでお届けする。 - 累計100万DLの人気ゲームに見るUnity 4.3のWindowsストア対応の実際
累計100万ダウンロードの人気ゲーム「サムライディフェンダー」について、iOS/Androidからの移植対応や独自機能実装などを担当者に聞いた。 - Oculus Rift、Unity、Openframeworks...感覚器官フル稼働の仮想空間を実現する
学生のアイデアを具現化するツールの進化・普及と、感覚器官をフルに使う人工現実感。表現とインターフェースについての学生の挑戦から「思い付き」を実現する環境のいまを知ろう。