レッスン 4

目次

Eventをアニメーションからポストする(Posting Events from Animations)

[注釈]

このセクションに入る前に、直前のセクションの Posting Events using Wwise-Typesを終わらせてください。

Unityでアニメーションを扱うには、Animationクリップを使います。Animationクリップは、Mayaや3Ds Maxなどの外部プログラムで作成したアニメーションであったり、単純にUnityのオブジェクトを編集しただけであったりします。それでは、Adventurer(冒険家)をどうやって作成したのか、みていきます。

彼女のモデルはMayaで作成し、彼女がMove(動く)やAttack(攻撃する)などできるように、彼女のゲームオブジェクトに複数のスクリプトをアタッチしました。ただし本当に生き生きとさせるには、敵をアタックするときに腕を振り、前進のボタンを押したときに脚が前進するようにしなければなりません。

そして、音はどうしますか?Wwisに、高品質のフットステップ音を集めたRandom Containerがありますが、このサウンドを、Adventurerの足がちょうど地面を踏むときに合わせて再生させるのには、どうすればよいでしょう?Animation Eventを作成しますが、これはアニメーションの流れの1点を、スクリプト内のファンクションに接続してくれる、Unityの機能です。最初にAnimation中の特定の時間を選び、次にスクリプト内に1つのファンクションを指定し、その中でEventをポストします。今から、すでに作成したPostWwiseEventを変更して、プレイヤーのフットステップ音をポストして、Startファンクションを編集してAnimationのEventでコールさせる手順を説明します。次にAnimation Editorに目を向け、私たちのファンクションをAnimation Eventから直接コールしてみます。

  1. Unityで Audiokinetic > Certification > 301 > Lesson 4 を選択し、 Posting Events from Animations を選択します。

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

    それではPlayerゲームオブジェクトに、前セクションで作成し、レッスン5でも使う予定の、PostWwiseEventスクリプトを追加してください。

  3. Inspectorで Add Component をクリックし、 PostWwiseEvent を選択します。

    もしこのスクリプトがプロジェクトになければ、前セクション Wwise-Type Eventプロパティを作成する に戻ってください。

  4. MyEvent というproperty drawerをクリックし、 Player_Footstep というEvent を選択します。

  5. PostWwiseEvent をダブルクリックし、スクリプトを開きます。

    Visual Studio(またはあなたのデフォルトコードエディタ)が開き、すでに作成したPostWwiseEventスクリプトが表示され、このスクリプトのMyEvent.Post() ファンクションコールが、MyEventプロパティで選択したEventを、プレイモードに入ってからコールします。

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

    今、MyEvent.Post() のファンクションコールは、Start()ファンクションに入っているので、MyEventプロパティで選択したEventはゲームスタート時にポストされます。今回は、Animation Eventからファンクションをコールしたいので、ファンクションにカスタマイズした名前を付け、ゲームを実行した際にUnityがこれを自動的にコールしないようにします。

    [注釈]

    ファンクション名は、レッスン中の手順を追うために重要ですが、UnityでAnimation Eventを使う上で、特に重要ではありません。別のファンクション名、例えば 'PostFootstepEvent' のような名前を付けても構いませんが、もしこの名前がUnity APIで使われる別のファンクションと全く同じであれば、別のプロセスによっても、コールされる可能性があります。

  6. StartPlayFootstepSound に変更します。

    public class PostWwiseEvent : MonoBehaviour {
        public AK.Wwise.Event MyEvent;
        // Use this for initialization.
        void PlayFootstepSound() {
            MyEvent.Post(gameObject);
        }

    前はスクリプトのStart()ファンクションが、Playモードに入った時点でコールされましたが、名前を変更したので、Sceneがロードされても、Unityがファンクション内のものを自動的にコールしなくなりました。AnimationのEventをみる前に、名前を新しくしたこのファンクションがUnityに見えるように、 public のアクセス修飾子を、ファンクションを宣言する前に入れる必要があります。

  7. publicvoid PlayFootstepSound() の前に挿入します。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
        
    public class PostWwiseEvent : MonoBehaviour {
        public AK.Wwise.Event MyEvent;
        // Use this for initialization.
        public void PlayFootstepSound() {
            MyEvent.Post(gameObject);
        }
    }

    これでPlayFootstepSound()ファンクションを公開できたので、スクリプトが完成しました。

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

    それではUnityに戻り、Animation Eventを作成します。PlayerにAnimationのEventを追加する必要があるので、まず最初にPlayerゲームオブジェクトを選択してください。

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

    AnimationのEventを追加するには、Animationウィンドウを開きます。

  10. Unityのメニューで、 Window を選択し、 Animation を選択します。

    Animationウィンドウが表示されるので、ここでアニメーションの設定を変更できます。このウィンドウを開くのが初めてであれば、別のウィンドウとして表示されるかもしれません。中身を詳しく見る前に、まずこのウィンドウを、レイアウトにはめ込んでください。

  11. Animationウィンドウを、タブ部分を使ってドラッグし、UnityのProjectビューの右側まで動かします。

    HierarchyでPlayerゲームオブジェクトを選択しているので、Animationウィンドウに、Player_Idle_wHammerのAnimation Clipが表示されます。

    Animation clip とは、変化するプロパティのシーケンスを保存する方法です。すべてのプロパティが、ウィンドウの左ペインに表示されます。右側に、プロパティが変化するポイントが、それぞれあります。これらのポイントをkeyframe(キーフレーム)と呼びます。キーフレームの表示と、その上のTimeline(タイムライン、時間の単位がある最上部のバー)の間に、Eventラインがありますが、ここでAnimation Eventを追加していきます。白いタイムカーソルがAnimationのEventまでくると、アサインされているファンクションがコールされるので、Animationクリップの指定した時間に、アクションがコールされるようにします。これから、Playerの足が地面に着いた瞬間にPlayFootstepSound()ファンクションがコールされるようにしたいので、試しにPlayer_SprintというAnimationクリップを使ってみます。

  12. Playerに使うAnimationクリップをすべて見るために、左上のリストメニューを開きます。

    ここにあるのがPlayerのアニメーションシステムに使うすべてのAnimationクリップで、Animatorコンポーネントで管理されます。

  13. 左上のリストで Player_Sprint を選択します。

    左に、アニメーション中にどのコンポーネントが変化しているのかが表示され、右に、Timelineと、その下のEventラインがあります。

    Timelineの一番左にある白いタイムカーソルは、上から下まで線が通っています。この線はAnimation内の現在の時間を表しているので、Timeline上でドラッグ、またはクリックして、移動させると、Adventurerのアニメーションもその時間に対応するので、Sceneビューの中のアニメーションクリップが変化します。

    Adventurerは今、Player_SprintのAnimationに設定されています。タイムカーソルを左右に動かすことで、Adventurerの左足と右足が、交互に地面を踏みしめます。

  14. Timeline上でTimelineカーソルを前後にドラッグします。

    もしあなたのビューが、多様な記号やテキストでゴチャゴチャしている場合は、 SceneビューのGizmos タブで設定を変え、ほとんどを非表示にできますn

  15. Sceneビューで、Gizmosタブを開き、 3D Icons を無効にします。

    次に、音を再生し始める正確な位置を、アニメーションの中で決めます。

  16. Adventurerが自分の右足で地面を踏むところ(0:05)まで、 Timeline Cursor をドラッグします。

    ここでAnimationのEventを追加し、あとでこのEventをPlayFootstepSound()ファンクションにアサインします。

  17. EventラインのTime Cursor (0:05) を右クリックし、Add Animation Event を選択します。

    Eventラインに表示された新しいAnimation Eventマーカーに、注目してください。

    タイミングが正確でないと、Sceneビューに見えるものとずれてしまうので、Animation Eventマーカーがちょうど0:05にあることを再確認してください。次に、Inspectorを見ます。

    ここで、タイムライン上で選択したポイントでコールするファンクションを追加します。それを可能にするのが、このセクションの最初に追加した、publicというアクセス修飾子です。

    [ヒント]

    Animation Eventを接続できるのは、Animatorコンポーネントと同じゲームオブジェクトにあるファンクションだけです。もしほかのゲームオブジェクトのスクリプトと接続させたい場合は、ファンクションコールを転送するための追加スクリプトを書く必要があります。

  18. Function のproperty drawerをクリックし、 PlayFootstepSound() というファンクションを選択します。

    このファンクションをAnimation Eventマーカーにリンクできたので、あなたのサウンドをテストする準備が整いました。

    [ヒント]

    Functionリストの範囲は広いですが、探しているファンクションの1文字目を入力するとファンクション名にジャンプできるので、例えばこの場合は 'P' と入力します。

  19. レッスン 1 の説明とおりに Playモードに入りShift を押しながら W を押し、ダッシュします。

    右足を追加できました。次に左足を追加します。 Playモードを終了 し、Animationウィンドウに戻ります。

  20. 左足が地面に下りるのが見える(0:15)まで、 Time Cursor をドラッグします。

  21. Event ラインの中を右クリックし、 Add Animation Event を選択します。

    [ヒント]

    別の方法として、Eventラインの左にあるAdd EventボタンをクリックしてAnimation Eventsを追加することもできます。これでAnimation EventがTimelineカーソルの指定位置に追加されます。

  22. Inspectorで PlayFootstepSound() というファンクションを選択します。

  23. Play をクリックし、シーン内を走り回ってみます。

    Training Areaの中を走り回り、フットステップ音を聞いてみてください。フットステップ音は、Playerのアニメーションにぴったり合っています。音をアニメーションに直接つなげることで、Footstepsが、Playerが該当するアニメーションを行っているときだけに再生されるようにしたのです。この演習と同じ手順で、ほかにも、歩くアニメーションやアタックするときのアニメーションなどにフットステップ音を組み込めます。

    次に変更点をPlayerというPrefabに保存し、レッスン5でも使えるようにしておきます。

  24. ESC を押してWAGメニューを開き、 Play をもう一度クリックしてPlayモードを終了させます。

  25. Playerゲームオブジェクトを選択したまま、Inspectorの Apply をクリックします。

    これでプロジェクトのすべてのPlayerゲームオブジェクトに、Animationにリンクした同じフットステップ音の動作を設定できました。