レッスン 5

目次

SwitchをWwise-Typeで設定する(Setting a Switch using a Wwise-Type)

[注釈]

このセクションに入る前に、レッスン 4 - Eventをスクリプトからポストするを終わらせてください。

Adventurerの足が地面を踏む瞬間に、フットステップをポストするところまではできましたが、まだサーフェスタイプ(表面の種類)の変化を考慮していません。

今、フットステップは毎回同じような音になっていますが、これは、同じサーフェスマテリアル(表面の素材)、つまりデフォルトのdirt(土)のフットステップ音をランダムに使っているからです。もっと自然なフットステップ音にするには、プレイヤーの足元にあるサーフェスタイプに合わせて、再生する音を変えればいいのです。すでに レッスン 4 でPostWwiseEventというスクリプトを書き、Adventurerの足がPlayer_SprintというAnimationクリップの中で地面を踏むたびに、Eventをポストするようにできました。このセクションで、ゲームの様々な地面に応じるファンクションを、スクリプトに追加します。フットステップ音が、必ず正しいサーフェスマテリアルを使うようにするには、フットステップのEventをポストする前に、その都度サーフェスマテリアルを設定するのが、簡単な方法です。

Player_FootstepのEventをポストすると、Eventのコールは、2つのSwitchと1つのRandom Containerを経由し、フットステップのオーディオファイルを1つ、選択して再生します。

最初に、Footstep_SurfaceのSwitch Containerを使いサーフェスタイプを判断し、次に、Playerの移動スピードからwalk(歩き)とrun(走り)のどちらのフットステップを再生するのかを判断します。Surface_TypeのSwitch Groupが、Footstep_SurfaceのSwitch Containerにアサインされています。そこでPlayer_FootstepのEventをポストする前にこのSwitchを設定しておけば、Footstep_SurfaceのSwitch Containerは、このコールを適切なフットステップサウンドに向けることができます。

これから、Player_FootstepのEventをポストする前に、Surface_TypeのSwitch Groupを設定する方法を説明します。

  1. Unityで Audiokinetic > Certification > 301 > Lesson 5 を選択し、 Setting a Switch using a Wwise-Type を選択します。

    まず最初に、PostWwiseEventスクリプトがPlayerゲームオブジェクトにまだアタッチされていることを確認してください。

  2. Hierarchyで Player ゲームオブジェクトを選択します。

    Playeゲームオブジェクトは Prefab であり、 Lesson 4 - Eventをアニメーションからポストする でApplyを押した時点で、その変更内容が、すべてのSceneにおける、Playerゲームオブジェクトのすべてのインスタンスに適用されたはずです。Inspectorを見てください。万が一ここにPostWwiseEventというスクリプトが表示されていなければ、 レッスン 4 - Eventをアニメーションからポストする に戻ってすべての手順を終わらせてください。表示されていれば、そのまま次に進んでください。

    サーフェスタイプを検知できなかった場合の問題を見るために、Profilerを使い接続してみてください。

  3. WwiseでLayouts を選択し、 Profiler を選択します。

  4. Remote... をクリックし、EditorでWAGゲームを選択してから Connect をクリックします。

  5. Unityで Play をクリックします。

    Playerのアタック行為によってCapture Logが、1つのSurface_TypeのSwitch Groupでうまってしまわないように、何もアタックしないでAdventurerを動かします。

  6. 土の上から草の上に走っていき、また土に戻ります。

  7. Playモードを終了 し、WwiseのCapture Logで Filter... ボタンをクリックします。

    Capture Logに沢山の情報があります。Switchの切り換えを全体的に見るために、Switch以外を、フィルターで非表示にしてください。

  8. Switches以外のすべての Types を無効にし、 OK をクリックします。

    あなたが土の上から草の上に走っていったときに、本来はSurface_Typeが草に設定されるべきで、そうするとPlayer_Footstepsのコールが、別サウンドに送られるはずです。ここでCapture Logを見て、Description列とWwise Object列に注目してください。

    今、Surface_TypeのSwitchが設定されていないので、Switchのデフォルト値(dirt)を、Footstep_SurfaceのSwitch Containerが使い続けます。Switchの設定に入る前に、Wwise Adventure Gameのサーフェスタイプの仕組みを少し理解しておく必要があります。そのあとにSwitchを設定して、 レッスン 4 で作成したPostWwiseEventスクリプトのEventをポストしてみます。

    次の手順に入る前に、Moveを選択しておいてください。

  9. UnityのSceneビューで、Adventurerの足元にある茶色の Road Space (道)ゲームオブジェクトを選択します。

    もし地面にアウトラインが表示されなければ、SceneビューのGizmosタブで、Selection Outlineのボックスをチェックしてください。

  10. Inspectorで、Wwise Adventure Game用に特別に開発したカスタム設定の SoundMaterial (サウンド素材)スクリプトを開きます。

    SoundMaterialのスクリプトはシンプルで短いスクリプトですが、便利です。中にmaterialというWwise-Typeプロパティが1つ入っていて、Wwise-TypeのSwitchを使えばゲームオブジェクトに直接、ラベル付けができるので、このプロパティを通して、フットステップやウェポンアタックなど様々な仕組みに対てし当たったサーフェスの種類を伝えられます。WAGでは、すべてのSoundMaterialスクリプトが、環境モデルを担当するデザイナーによって、該当するSwitch(この場合はDirt)にアサインされています。あなたはこのスクリプトを変更しませんが、あなたがPostWwiseEventスクリプトから参照するWwise-TypeというSwitchのproperty drawerがあるのは、このスクリプトであることを覚えておいてください。

    あなたはこのスクリプトを変更しませんが、これからPostWwiseEventスクリプトでマテリアルのプロパティを参照にするので、そのマテリアルプロパティがここに入っていることを、覚えておいてください。

  11. Hierarchyで Player ゲームオブジェクトを選択します。

  12. Inspectorで PostWwiseEvent スクリプトを開きます。

    PlayFootstepSound()ファンクションの上にあるファンクションディスクリプションは、もう適切でないので、まずこれを削除してください。

  13. // Use this for initialization とある行全体を、削除します。

        
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
        
    public class PostWwiseEvent : MonoBehaviour {
        public AK.Wwise.Event MyEvent;
        public void PlayFootstepSound(){
            MyEvent.Post(gameObject);
        }
        
        // Update is called once per frame.
        void Update () {
        
        }
    }

  14. "MyEvent.Post(gameObject)" と書かれたファンクションコールの上を、1行あけます。

    public AK.Wwise.Event MyEvent;
    public void PlayFootstepSound(){
    
        MyEvent.Post(gameObject);
    }

    Playerの足元のサーフェスタイプ(マテリアル)を検知するために、カスタム作成したMaterialCheckerというスクリプトが、Playerの2つのtoe(足指)というゲームオブジェクトに、1つずつ追加されています。詳しく理解する必要はありませんが、このスクリプトは、Playerの左または右の足の下を確認し、そのサーフェスのゲームオブジェクトをみつけ、それに付随するSoundMaterialを調べ、マテリアルのプロパティのSwitch値を取得してくれます。

    さて、MaterialCheckerスクリプトはどこにあるのでしょうか?Playerのステータスや関連ゲームオブジェクトなどを簡単に管理できるように、PlayerManagerのカスタムスクリプトを作成してあるので、そこにPlayerの足があります。それではまず、MaterialCheckerの GetMaterial() ファンクションまでのパスを書きます。

  15. MyEvent.Post(gameobject);の行の上の空欄に、 PlayerManager.foot_L.GetMaterial() と入力します。

    public void PlayFootstepSound(){
        PlayerManager.foot_L.GetMaterial()
        MyEvent.Post(gameObject);
    }

    この GetMaterial() ファンクションが、Playerの足( foot_R と foot_L )の下を見て、SoundMaterialの現在のSwitch値を返してくれます。次に .SetValue() ファンクションを使い、Eventをポストする前にSwitchを定義します。

    [ヒント]

    Stateの設定はSwitchの設定に似て、.SetValue()ファンクションを使います。Statesの設定について詳しくは、 レッスン 8 で学びます。

  16. PlayerManager.foot_L.GetMaterial()のあとに .SetValue(); と入力します。

    public void PlayFootstepSound(){
        PlayerManager.foot_L.GetMaterial().SetValue();
        MyEvent.Post(gameObject);
    }

    ここでSetValue()ファンクションが赤字ですが、SetValueの括弧内にゲームオブジェクトを指定する必要があるからです。グローバルスケールで適用されるStateとは異なり(ゲーム全体を通して、Stateは常に1つだけ)、Switchはゲームオブジェクトごとに適用されます。つまり、Switchを変更しても、その影響を受けるのは、同じゲームオブジェクトにポストされたEventだけです。今のシーンでは、PostWwiseEventがPlayerゲームオブジェクト上にあります。そこで、新しいSwitchをPlayer_FootstepのEventに設定するには、Player_FootstepのEventがポストされている、同じゲームオブジェクトを参照する必要があります。

    [注釈]

    Unityで、スクリプトを追加したゲームオブジェクトを知るには、 gameObjectと入力します。

  17. SetValue() の括弧内に、 gameObject と入力します。

        
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
            
    public class PostWwiseEvent : MonoBehaviour {
        public AK.Wwise.Event MyEvent;
        public void PlayFootstepSound(){
            PlayerManager.foot_L.GetMaterial().SetValue(gameObject);
            MyEvent.Post(gameObject);
        }
    
        // Update is called once per frame.
        void Update () {
        
        }
    }

    それでは、まとめます。Player_SprintというAnimation Clipによって、PlayFootstepSound()ファンクションにリンクするAnimation Eventがトリガーされます。このファンクションには2つの目的があります。PlayerManager経由でCheckMaterialのGetMaterial()ファンクションを参照にし、これを使って、Playerの足指の下にあるマテリアルを取得します。マテリアルに関するプロパティは、Wwise-TypeのSwitchなので、.SetValue()ファンクションを使い、Playerゲームオブジェクトに対してSwitchを(左足の親指の下のサーフェスから)設定できます。Playerに正しいSwitchが設定されたところで、Player_FootstepのEventを同じゲームオブジェクトにポストすることができます。繰り返しですが、スクリプトの変更は必ず保存し、Unityで適用されるようにしてください。

  18. Windowsでは CTRL+S 、Macでは CMD+S を押し、 スクリプトを保存 します。

    次に、もう一度テストを行います。

  19. Unityに Remote Connect で接続し、シーンを Play し、1つのサーフェスから別のサーフェスへと、何回も走らせてください。

  20. Playモードを終了 し、WwiseでCapture Logの Description 列と Wwise Object 列を確認します。今度は、DirtとGrassの両Switchが設定されたことに注目してください。

ゲーム内のサーフェスに、Wwise-TypeのSwitchを使いラベルを付けることで、フットステップ音を、Playerの下のサーフェスに合わせ、ダイナミックに変化させることができました。このシステムをいったん設定してしまえば、ほかのリージョンを構築したときに、サーフェスがどのような音を出すのかが分かるようなラベルを付けるだけで、このシステムを維持し活用できます。

[ヒント]

以上の作業で、左足の下のSoundMaterialを取得できましたが、理想的には、左右の足の下にあるSoundMaterialを、交互に取得したいところです。そのようなシステムの設定方法を学びたければ、AdventuressAnimationEventHandlerというスクリプトの、TakeFootstep()ファンクションを調べてみてください。