レッスン 7

目次

Wwise-Type Eventのコールバック(Callbacks on a Wwise-Type Event)

コールバックをAkEventやAkAmbientコンポーネントで有効にできますが、Wwise-Type Eventにも、コールバックを追加できます。処理に必要な情報の種類は同じ(Callback Function、Callback Flag)ですが、カスタムスクリプトでコールバックを設定することで、特定のゲーム動作やオブジェクトタイプに合わせてコールバックを設定でき、ゲームオブジェクトの、特定のインスタンスに限定されることがありません。カスタムスクリプトを使えば、例えば参照先のゲームオブジェクトが、Wwise Adventure GameのEnvironment Sceneによってアンロードされてしまい、利用できないような事態になても、対応策などを設定できるのです。前のセクションで、Music_RegionのEventの、MusicSyncBarからのコールバックを使い、RhythmActionsスクリプトをコールし、木を拡大縮小させました。AkEventコンポーネントを使ってコールバックを設定すると、スクリプトを書く必要がなくドラッグするだけなので、ゲームオブジェクトの数が少ないときには便利です。ただアセット数がそれなりに増えてくると、コールバックの要件に合ったカスタムスクリプトを書いた方が、AkEventコンポーネントにコールバック項目のリストを長々と入力するよりも有利です。これから、コールバック通知で複数の環境ゲームオブジェクトのスケールを変更する方法を説明します。最初に、Wwise-Type Eventプロパティを使い、スクリプトからMusic_RegionのEventをポストします。次に、スクリプトを拡張しCallbackファンクションを入れ、そこからScene内の様々なゲームオブジェクトを、RhythmActionsスクリプトを使ってコールします。

  1. Unityのメニューで、 Audiokinetic > Certification > 301 > Lesson 7 を選択し、 Callbacks on a Wwise-Type Event を選択します。

    まずスクリプトを作成してから、Wwise-Type Eventプロパティを作成します。

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

  3. Inspectorで Add Component をクリックし、 PostMusic を検索して New Script を選択し、 Create and Add をクリックします。

  4. PostMusic スクリプトをダブルクリックして開きます。

    最初に、Wwise-Type Eventクラスを使い、Eventを作成してポストします。

  5. PostMusic スクリプトの中の、ファンクション以外の場所で、publicなWwise-Type Eventを宣言するために、 public Ak.Wwise.Event と書きます。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
        
    public class PostMusic : MonoBehaviour {
      public AK.Wwise.Event
        // Use this for initialization
        void Start () {
        
        }
        // Update is called once per frame.
        void Update () {
        
        }
    }

  6. AK.Wwise.Eventのあとにスペースを1つ追加し、プロパティの名前を MusicEvent とし、行の終わりにセミコロン( ; )を入れます。

    public class PostMusic : MonoBehaviour {
      public AK.Wwise.Event MusicEvent;
    

    Wwise-Type Eventプロパティを作成できたので、Start時にEventをポストし、ゲームが初期化されたらすぐにEventがポストされるようにします。

  7. Start()ファンクションに、" MusicEvent.Post(gameObject); "と入力します。

    public class PostMusic : MonoBehaviour {
      public AK.Wwise.Event MusicEvent;
        // Use this for initialization.
        void Start () {
            MusicEvent.Post(gameObject);
        }
    

    コンポーネントの場合と同様に、Eventのコールバックを設定するにはコールバック情報(Callback Flag、Callback Function)を、Eventのポストと一緒に提供する必要があります。Callback Flagは2つ目の引数で(1つ目の引数はゲームオブジェクト)、AkCallbackTypeクラスを通して可能です。Post()でも、Callback Flagを追加すればよく、まずコンマ(,)を入力し、次にStart()ファンクションにプロパティ名を入力します。

    [注釈]

    すべてのCallback Flagが、すべてのWwise Objectタイプと互換性があるわけではないので、注意してください。例えばDestruction_VolcanicBoulder_ImpactsのEventが終了したときにコールバックが欲しければ、AK_EndOfEventというCallbackFlagを使えますが、EventがMusic Segmentを再生しているわけではないので、AK_MusicSyncBarはコールされません。

  8. gameObjectのあとに、コンマ(,)1つとスペース1つを追加し、 AkCallbackType.AK_MusicSyncBar; と入力します。

    void Start () {
        MusicEvent.Post(gameObject, AkCallbackType.AK_MusicSyncBar);
    }

    AkCallbackTypeクラスの中を見てAK_MusicSyncBarというFlagを探し、それを、ポストするEventに追加します。Postファンクションに限って、AK_MusicSyncBarをユニットプロパティタイプとして送信する必要があります。

    [注釈]

    本技能検定で使うプログラミングランゲージのC#では、小数点なしの数字を、integer (int)というプロパティタイプに格納できます。このプロパティタイプに正の数も負の数も格納できます(-2,147,483,648から、2,147,483,647までの数値)が、すべての数字が確実に正の数になるように、符号なしのプレフィックス'u'を追加し、符号なしのintにして、uintとして書くことができます(0から、4,294,967,295までの数値)。

    プロパティを変換するには、新しいプロパティタイプを括弧内に、CallbackTypeプロパティの前に、追加します。

    [ヒント]

    あるプロパティを、別のタイプに変換することを、タイプキャスティング(型変換)と呼びます。

  9. (uint) を、AkCallbackType.AK_MusicSyncBarの前に挿入します。

    MusicEvent.Post(gameObject, (uint)AkCallbackType.AK_MusicSyncBar);

    Postファンクションの下に短い赤線があるのに、気づきましたか?

    WwiseがUnityにコールバックしたときに、どのファンクションをコールすべきなのかを、あなたがまだ宣言していないので、下線があるのです。Unityからコールされないように、Update()ファンクションの名前を、Callbackファンクションに変更します。

  10. 名前を変更し、 Update()CallbackFunction() にします。

        // Update is called once per frame.
        void CallbackFunction(){
        
        }

    混乱を避けるために、上のUpdate()ファンクションに関するコメントも削除してください。

  11. // Update is called once per frame というコメントを、削除します。

    void CallbackFunction(){
        
    }

    そして、Post()ファンクションに、ファンクション名を追加します。

  12. 続いて MusicEvent.Post(gameObject, (uint)CallbackType で、 CallbackFunction と入力し、CallbackFunctionを引数として含めます。

    MusicEvent.Post(gameObject, (uint)AkCallbackType.AK_MusicSyncBar, CallbackFunction);

    CallbackFunctionの下に、赤線が表示されました。

    Post()ファンクションにコールバックファンクションを追加したので、Wwiseサウンドエンジンは、選択されているCallback Typesの1つに遭遇した場合に、コールバックファンクションをコールします。あなたはCallback TypeのAK_MusicSyncBarを選択したので、Wwiseサウンドエンジンは、音楽のバーに遭遇するたびに、コールバックファンクションをコールします。

    ただしWwiseサウンドエンジンは、コールバックファンクションで、コールバックノティフィケーションに関する情報も受け取れると期待するので、CallbackFunctionでその情報を受け取れるようにする必要があります。つまり、あなたがすべて必要か全く不要かに関わらず、ファンクションの括弧内に、いくつかの変数を宣言する必要があります。

  13. CallbackFunction() の括弧内に object in_cookie, AkCallbackType in_type, object in_info と入力します。

    void CallbackFunction(object in_cookie, AkCallbackType in_type, object in_info){
        
    }

    これで、Callback Typeなど、コールバックに関する情報を取得できます。今回はコールバックを1つだけ、つまりMusicSyncBarというものだけを、受け取るので、これらのパラメータは不要です。

    [ヒント]

    このようにCallbackファンクションでインプットするプロパティについて、詳しくは Wwise SDKドキュメンテーション を参照してください。

    コールバックの設定が完了しましたが、まだCallbackFunction()が空なので、何もできません。ゆくゆくはゲームのすべてのRhythmActionsコンポーネントをコールする必要があるので、試しにすべてのRhythmActionsコンポーネントが認識できるファンクションを、GameManagerに作成しました。GameManagerスクリプトはシングルトンなので、1つしか存在していなく、ゲームプレイ中に破壊されることはないので、いつでもあるファンクションです。

    RhythmActionsスクリプトがランタイムにインスタンス化されると、GameManagerへのリンクが自動的に作成されるので、それらをすべてGameManager経由でコールできるようになります。

  14. CallbackFunction()ファンクションに、 GameManager.PushRhythmAction(); と入力します。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PostMusic : MonoBehaviour {
                          public AK.Wwise.Event MusicEvent;
        // Use this for initialization.
        void Start () {
            MusicEvent.Post(gameObject, (uint)AkCallbackType.AK_MusicSyncBar, CallbackFunction);
        }
        void CallbackFunction(object in_cookie, AkCallbackType in_type, object in_info){
            GameManager.PushRhythmAction();
        }
    }

    がんばりました!このセクションのスクリプト関連の手順を完了したので、 スクリプトを保存 します。次に、Wwise-Type Eventプロパティを、Music_RegionのEventにアサインします。

  15. MusicEvent プロパティで、 Events > Music > General を展開し、 Music_Region をダブルクリックします。

    これでRhythmActionsスクリプトを、Sceneのゲームオブジェクトに配信することができ、許可すれば、それらが動きます。

    [注釈]

    ワールド環境全体で使う一部のゲームオブジェクト(DesertやForestなど)は、設定がstatic(静的)です。ゲームオブジェクトがstaticであれば、それをランタイムに動かせません。どのゲームオブジェクトでも、Inspector上部でstatic状態を解除できます。

  16. Hierarchyで TrainingArea_ で始まるゲームオブジェクトをすべて選択します。

    これらのゲームオブジェクトをすべて選択してからAdd Componentを選択することで、このコンポーネントを、選択中のすべてのオブジェクトに対して同時に追加できます。

  17. Inspectorで Add Component をクリックし、 RhythmActions を検索して選択します。

    これで、複数のゲームオブジェクトにRhythmActionsスクリプトを追加でき、カスタムスクリプトを使ってゲームのコア部分にコールバックを組み込めました。それでは、試してみてください。

  18. Playモードに入り 、あなたが選択したオブジェクトがすべて、音楽のテンポに合わせて動くのを見てください。

    ゲームオブジェクトの倍率を自由に調整したり、SceneのほかのゲームオブジェクトにさらにRhythmActionsスクリプトを追加したりしてみてください。

コールバックシステムの準備が完了し順調に動きます。Region_MusicのEventが、Music Segmentのバーに到達すると、RhythmActionsスクリプトのあるゲームオブジェクトがすべて、コールされます。これを可能にするのが、PostMusicスクリプトのCallback設定で、GameManagerのPushRhythmAction()ファンクションをコールしてくれます。前セクションに対し、ここではコードでコールバックを設定する方法を紹介しましたが、オブジェクトのアンロードに対応したいときや、多数のオブジェクトに効率的にコールバックを追加したいときに、採用できる方法です。