連載
» 2015年05月08日 05時00分 公開

Unity 5で無料になった機能の使い方(2):UnityのAudio Mixerの再生やボリュームを制御するには (3/3)

[薬師寺国安,PROJECT KySS]
前のページへ 1|2|3       

音楽を再生するスクリプトの追加

 次に、「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; 
      }
    }
  }
}
リスト1 各「Cube」クリックでパーティクルを発生させ、該当する音楽を再生するコード(MouseClick.js)

「#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に関連付いた音楽が再生される。

動画3(※再生すると音楽が流れるので注意!)
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の使い方について解説する。カメラの視点の変え方が多彩になるので、楽しみにしてほしい。

著者紹介

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。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ストア)


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。