この記事シリーズでは、Unity公式が配布しているゲーム「2D Character」にWwiseでサウンドを組み込む方法を綴っています。
※当ブログではMacOS環境で作業を進めています。他OSを使用している場合は表示や操作方法に差異がある可能性があります。
はじめに
前回の記事ではインタラクティブミュージックの仕組みをWwiseで制作しました。
今回はUnityでプログラムして、上の階層に昇るごとにキーが上がっていくインタラクティブミュージックを実装したいと思います。。
※この記事では「Unity2019.3.2f1」を使用しています。お使いのバージョンによっては操作方法が異なる場合があります。
※Unityの用語や操作をある程度理解している方向けです。
1.Wwiseコンポーネントを追加しサウンドを再生させる
UnityでWwiseのサウンドを鳴らす方法
UnityでWwiseからのサウンドを制御する方法は2つあります。
1つは、C#言語で直接プログラムを書き込む方法。
もう1つは、コンポーネントを追加する方法です。
前者は細かくタイミングをコントロールすることができますが、文字列を書き込まなくてはならないのでめんどくさいです。(SEなどのサウンド制御にはこちらのほうが向いていると思います)
今回は「ゲーム起動時にBGMを開始させる」という単純な構造ですので、後者の方法をとりたいと思います。
「AkEvent」Componentを追加する
Hierarchyウインドウから「WwiseGlobal」オブジェクトを選択します。(WwiseGlobalオブジェクトはWwiseをUnityに読み込んだ時に自動で作成されます)
InspectorウインドウでAdd Componentから「AkEvent」コンポーネントを追加します。
追加した「AkEvent」Componentを展開すると、トリガーのタイミングとEventの種類を選択する項目があります。
トリガーを「Start」とし、Nameの欄で前回の記事で作成した「Music_Start」Eventを選択します。
これでゲームの起動と同時に「Music_Start」Eventが起動し、BGMが再生されます。
「AkSwitch」Componentを追加する
今回作成したBGMはSwitchで制御する構造にしたので、SwitchもEventと同時に起動させます。
再びAdd Componentをクリックし、今度は「AkSwitch」を追加します。
ここでも「AkEvent」の項目と同じように 、トリガーのタイミングとSwitchの種類を設定します。
これで起動時に「_00」Switchが選択され、「BGM+0」が再生されます。
2.Switchを切り替える仕組みを作る
今回実装するサウンド演出では、「主人公が移動する階層ごとにSwitchを切り替える」という仕組みが必要となります。
まずは、主人公が範囲内に入るとSwitchを切り替えるオブジェクトをプロジェクトに追加します。
Box Collider 2Dで探知範囲を設定する
Hierarchyウインドウを右クリックし、「Create Empty」オブジェクトを追加します。
名前を「00」とし、Add Componentから「Box Collider 2D」を追加します。
Is Triggerにチェックを入れると主人公を検知することができるようになります。
次にステージの一番下の階層が範囲内におさまるように大きさをいい感じに調整します。
筆者はこんな感じになりました。
探知するとSwitchを切り替えるスクリプトを追加する
次にSwitchを切り替えるスクリプトを新規に追加します。
「00」オブジェクトに新規スクリプトを追加し、以下のコードを書き込みます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WwiseSwitchScript : MonoBehaviour
{
public GameObject SwitchGameobject;
public string SwitchName="_00";
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player")
{
AkSoundEngine.SetSwitch("Level",SwitchName,SwitchGameobject);
}
}
}
一番下のコードがif構文で「Player」タグを持っているものの進入を検知し、Switchを切り替えるシステムです。
private void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player")
{
AkSoundEngine.SetSwitch("Level",SwitchName,SwitchGameobject);
}
}
AkSoundEngine.SetSwitch(“Level”,SwitchName,SwitchGameobject)
カッコ内の最初の文字列はSwitch Groupを指定する場所なので、前回の記事で作成した「Level」を入力。
次の文字列では、「Level」内のSwitchを文字列で指定すればいいのですが、これと同じシステムの範囲検知オブジェクトをあと2つ作成するので、Publicで文字列を入力できるようにしました。
最後の文字列では、「Music_Start」Eventを制御している「WwiseGlobal」オブジェクトを当てはめるのですが、Inspecter上で当てはめるほうが分かりやすいので、これもPublicで入れ込むようにしました。
Unity上のInspectorで「Switch Gameobject」欄に「WwiseGlobal」オブジェクトをドラッグし、「Switch Name」欄に「_00」と入力します。
これで侵入を検知し「_00」Switchを設定するオブジェクトができました。
同様の手順で「01」、「02」という範囲検知オブジェクトを作成し大きさと位置を調整、それぞれに「_01」、「_02」Switchを割り当てましょう。
3.できた?
これで完成です。
実際にプレイしてみた動画がこちらです。
なお動画上では分かりやすいように検知範囲を着色し、文字も入れてます。
こんな感じになりました。
Wwiseでのダッキング設定とか書き忘れたこともあるのですが、また今度にしようと思います。
ここまで読んでいただきありがとうございました。
次の記事でお会いしましょう。