次に、「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」をコメントアウトする(1行目)。これをコメントアウトしていないと、実行時に、ParticleSystemのenabledでコンパイルエラーが表示される。必ずコメントアウトして、コンパイルエラーを出さないようにする。VB.NETの「Option Strict On」のようなものなのだろう。
まず、「myObj」「myObj1」「myObj2」のGameObject型の変数を宣言し(2〜4行目)、「myAudioClip」「myAudioClip1」「myAudioClip2」のAudioClip型の変数を宣言する(5〜7行目)。
Start関数内で、Findを使って「Cube」「Cube 1」「Cube 2」にアクセスし、変数「myObj」「myObj1」「myObj2」で参照する(9〜13行目)。
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でマウスの左クリックしたオブジェクトの名前が取得できる。
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サンプル」という名前で保存しておこう。
今回はこれで終わりだ。「Audio Mixer」を使用すると、ゲームの場面場面で、音楽を切り替えることができ、ゲームにも幅が出るのではないだろうか。
次回は、これもUnity 5で無料になったFreeLookCameraRigとMultipurposeCameraRigの使い方について解説する。カメラの視点の変え方が多彩になるので、楽しみにしてほしい。
薬師寺国安事務所代表。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ストア)
ディープだが覚えておきたいUnityゲーム開発の小テク16選まとめ
ハッカソン、デバイス、海外展開、人材育成――ゲーム開発で私たちは今何をすべきか
ゲーム嫌いも知っておきたい3D CG/VRのエンタープライズ活用事例〜Unity Solution Conference 2014まとめ
累計100万DLの人気ゲームに見るUnity 4.3のWindowsストア対応の実際
Oculus Rift、Unity、Openframeworks...感覚器官フル稼働の仮想空間を実現するCopyright © ITmedia, Inc. All Rights Reserved.