レッスン 8

目次

ゲームパラメータを使い多様性をつくり出す(Creating Diversity Using Game Parameters)

音楽条件の間の切り換え、例えばリージョンの変更などに、StateやSwitchを使えますが、音楽の中の細かい点で、例えばWaterfallに近づくにづれ大きくなるハープのパートなどには、Game Parameterも利用できます。ゲーム内のほとんどすべての機能に関してGame Parameterにマッピングすることが可能で、それに影響を受けるMusic TrackやEffectを、選択できます。

すでにWwiseにDistance to player(プレイヤーまでの距離)などの組み込みGame Parameterがいくつかありますが、これはどちらかというとダイエジェティック音(空間に配置されたもの)に向いている一方、音楽はノンダイエジェティック(ゲーム空間の外のもの)であることが多いです。環境エレメントにGame Parameterを直接インテグレートする方法の1つが、カスタムスクリプトを作成し、ゲームの機能に対してGame Parameterをマッピングすることです。ゲーム内のオブジェクトのポジション情報を使い、ほかのゲームオブジェクト上にある、ポジションを持たない音に情報提供することができます。

これから、スクリプトを作成してWaterfallに追加する方法を説明します。このスクリプトでは、Wwise-Type RTPCプロパティを作成し、PlayerからWaterfallまでの距離をそれに渡します。次にこのGame ParameterをWoodlandsテーマの中のハープのMusic Trackにアサインし、距離に基づいて、そのボリュームを増減させます。

[注釈]

なお、Distance_to_PlayerというGame ParameterがWwiseにありますが、Music_RegionのEventはWaterfall_UpCloseゲームオブジェクトにポストされないので、このGame ParameterはWoodlands 1_HarpのMusic Trackに使わないでください。

  1. Unityのメニューで、 Audiokinetic > Certification > 301 > Lesson 8 を選択し、 Creating Diversity using Game Parameters を選択します。

    Waterfallゲームオブジェクトは比較的大きく、その支点は歩き回れるマップの外の、かなり距離が離れた場所にあるので、実際のWaterfallからPlayerまでの距離を測定しても、グッドプラクティスではありません。

    代わりに子ゲームオブジェクトを作成し、Waterfallの池の真横に配置してあるので(Waterfall Up Close)、これを使えば距離の測定点を細かくコントロールできます。

    [ヒント]

    Transformコンポーネントから簡単に取得できるポジションなので、Pivot Point(ゲームオブジェクト中心)からPlayerまでの距離を計算します。

  2. Hierarchyで Waterfall ゲームオブジェクトを展開し、 Waterfall_UpClose ゲームオブジェクトを選択します。

  3. Inspectorで Add Component をクリックし、 New script を選択して名前を SetRTPCToDistance に変更し、 Create and Add を選択してスクリプトを開きます。

    最初にスクリプトを整理してください。Game Parameterを何度も設定し、Start()ファンクションは使わないため、削除します。

  4. Start(){} ファンクションと、その上の // Use this for initialization というコメントを、削除します。

     using System.Collections;
     using System.Collections.Generic;
     using UnityEngine;
    
    public class SetRTPCToDistance : MonoBehaviour {
    
        // Update is called once per frame.
        void Update () {
    
        }
    }

    最初にpublicのWwise-Type RTPCプロパティを作成し、GameParameterという名前にします。

  5. SetRTPCToDistanceクラスの中に、 public AK.Wwise.RTPC GameParameter;と入力します。

     using System.Collections;
     using System.Collections.Generic;
     using UnityEngine;
    
    public class SetRTPCToDistance : MonoBehaviour {
        public AK.Wwise.RTPC GameParameter;
    
        // Update is called once per frame.
        void Update () {
    
        }
    }

    このゲームオブジェクトまでの距離をどこからか計算する前に、ほかのゲームオブジェクトのTransformコンポーネントを参照先にする必要があります。今までのレッスンでも見てきたように、Transformコンポーネントにゲームオブジェクトのポジション、スケール(倍率)、ローテーション(回転)の情報が入っているので、Unityは、すべてのゲームオブジェクトを、Sceneの中心点との位置関係に基づいて、正しいサイズや方向で配置できるようになっています。ポジションのトラッキング用にTransformコンポーネントにPositionという Vector3 のプロパティがあり、これを使ってPlayerとWaterfallの間の距離をモニタリングします。

    [注釈]

    Vector3は小数点以下の桁がある数字の入ったプロパティタイプです。Vector3はポジショニングをXYZ座標で表現します。

    グッドプラクティスとしてスクリプトはできるだけ汎用性のあるものにし、ほかのスクリプトを書くより、再利用を心がけます。以上を念頭に、Transformタイプのpublicのプロパティを作成します。このスクリプトはWaterfall_UpCloseゲームオブジェクトの上で稼働するので、距離を計算するときは、プロパティの中のPlayerゲームオブジェクトを参照にします。また、例えばOtherTransformのように、内容が分かるような名前にします。

  6. public Transform OtherTransform; と入力します。

    public class SetRTPCToDistance : MonoBehaviour {
        public AK.Wwise.RTPC GameParameter;
        public Transform OtherTransform;

    RTPCとTransformのプロパティを使い、Playerと、Waterfall_UpCloseの、2つのTransformの間の距離を計算し、その距離にGame Parameterを設定します。

    TransformのPositionプロパティを2つの異なるゲームオブジェクトから使うことで、Distance()ファンクションを使い、両者の間の距離を計算できます。このコールをUpdate()ファンクションの中に設定し、常に距離がアップデートされるようにします。

  7. Update()ファンクションに、 Vector3.Distance(); と入力します。

    // Update is called once per frame.
    void Update () {
        Vector3.Distance();
    }

    Vector3.Distance()ファンクションは、各ゲームオブジェクトのTransformのポジションを必要とします。Vector3のPositionプロパティを取得するために、Transformコンポーネントをコールします。

  8. Vector3.Distance()ファンクションの括弧内に、 OtherTransform.position と入力します。

    void Update () {
        Vector3.Distance(OtherTransform.position);
    }

    ここで、Waterfall_UpCloseゲームオブジェクトのTransformを参照する必要があります。このファンクションに別のVector3プロパティを送り込むには、コンマ( , )を追加し、次のプロパティを書くだけです。

  9. OtherTransform.positionのあとに コンマ(,) を追加し、 transform.position と入力します。

    Vector3.Distance(OtherTransform.position, transform.position); 
     

    これで距離の計算が出来ますが、まだ結果を保存していません。保存するには、float変数に設定する必要があります。float変数タイプを使うことが重要で、これで小数点付きの数値を格納でき、滑らかなRTPCの移行を確保できますが、intやunitのような変数タイプでは、小数点のない数値しか格納できません。Vector3.Distance()ファンクションから返された結果を、名前("distance")、equality 演算子(=)、そしてVector3.Distance()ファンクションを書くことで、float変数として保存できます。

  10. Vector3.Distance() ファンクションの前に float distance = と入力します。

    float distance = Vector3.Distance(OtherTransform.position, transform.position); 
     

    [ヒント]

    このスクリプトをさらに最適化するには、あなたが作成した変数 'float distance' をUpdateファンクションの外に移し、Updateには距離変数だけを設定することができます。この変数をUpdateファンクションより前に宣言すれば、フレームごとに新しい変数を作成しなくて済みます。

    次に、ゲームパラメータをDistance値にマッピングしておきます。別のゲームオブジェクトに対しポストされる音楽に影響を与えるには、.SetGlobalValue()ファンクションを使います。

  11. フロートディスタンス変数のあとに新しい行を追加し、 GameParameter.SetGlobalValue(distance); と入力します。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class SetRTPCToDistance : MonoBehaviour {
        public AK.Wwise.RTPC GameParameter;
        public Transform OtherTransform;
    
        // Update is called once per frame.
        void Update () {
            float distance = Vector3.Distance(OtherTransform.position, transform.position);
            GameParameter.SetGlobalValue(distance);
        }
    }

    以上で、必要なコードをすべて書けました。次にInspectorでプロパティをアサインします。

  12. HierarchyでWaterfall_UpClose ゲームオブジェクトが選択されていることを確認します。

  13. UnityのInspectorでSetRTPCToDistanceのGame Parameterプロパティを選択し、 Game Parameters > Gameplay を展開し、 Music_WoodlandsHarp を選択します。

    OtherTransformプロパティに、スクリプトが距離を計算するのに使うゲームオブジェクトのTransformコンポーネントを追加できます。ここで使うのは、Playerゲームオブジェクトです。

  14. Hierarchyの Player ゲームオブジェクトを OtherTransform プロパティまでドラッグします。

    Playモードに入る前に、Game Parameterを観察できるようにGame Object Profilerを設定してから、ゲームに接続してください。

  15. WwiseでLayouts を選択し、 Game Object Profiler を選択します。

  16. Game Sync Monitorで Add… をクリックします。

  17. Project Explorer - BrowserでGameplayを展開し、 Music_WoodlandsHarp をダブルクリックします。

    Game Parameterを選択できたので、ゲームオブジェクトを追加してください。Music_WoodlandsHarpはWaterfall_Up_Closeゲームオブジェクトでしか使われないので、このGame ParameterはGlobalスコープで観察します。

  18. Game Object ExplorerのWatchesタブで、Selectorを開き、 Global Game Object を選択します。

    Game Object Profilerの準備ができました。

  19. ゲームに接続し、Playモードに入ります。WoodlandsのWaterfallまで走っていきます。

    Waterfallに近づくにつれ、Woodlandsテーマのハープに注目してください。これで、Playモードを終了してもいいです。

Woodlandsテーマのハープのボリュームが、近づけば近づくほど大きくなったのに気づきましたか?それでは、Wwiseの中を覗いてみます。

Game Sync Monitor を見ると、Waterfall_UpCloseゲームオブジェクトにあるMusic_WoodlandsHarpというGame Parameterの値が減少するのが分かります。この値は距離を示し、Waterfallに近づくときに予想される動作が見られます。このようにしてたった数行のコードで、プレイヤーの動きにあなたの楽曲構成を適応させることができ、さらに、スクリプトを再利用することを考慮して書けば、Sceneのほかのオブジェクトに簡単に追加することができます。

[ヒント]

すでに気づいたかもしれませんが、ミュージックトラックをコントロールするためにGame Parameterを活用するもう1つの方法が、このレッスンの最初に説明したEnemyミュージックです。Enemyの種類ごとにGame Parameterがあり、距離によって、該当するミュージックレイヤのボリュームが大きくなったり小さくなったりします。EnemyミュージックのGame Parametersシステムはもっと複雑で、GameManagerスクリプトに直接インテグレートされていますが、見てみたければProjectビューで 'GameManager' を検索し、GameManager.csスクリプトを開き、DistanceToEnemies()というコルーチンファンクションを探してください。