次に、「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ストア)
Copyright © ITmedia, Inc. All Rights Reserved.