Unityでイベントシーンの作り方②タイムラインとの使い方【前編】


この記事は前回の記事の続きとなっていますの前回の記事を内容を把握してから読んでいただきますようお願いします。

前回の記事のおさらいからします。タイムラインウィンドウを開いたうえでヒエラルキー上にタイムラインをdrag and dropして作ったPlayable Directorが追加されたオブジェクトをクリックしてください。そうするとタイムラインウィンドウにタイムラインが表示されます。右上のカギマークがロックされていない場合はクリックしてロックしてください。

Sceneウィンドウでも作業するためタイムラインウィンドウを右に移します。ディスプレイが二つあるととても作業しやすいです。

イベントシーンで動かしたいオブジェクトをタイムラインウィンドウの左側にdrag and dropします。今回はプレイヤーが一人称で操作するオブジェクト(主人公)をdrag and dropします。ちなみにプレイヤーが操作するオブジェクトとそうでないオブジェクトでタイムラインの作り方が大きく変わってきます。詳しくは後述します。オブジェクトをdrag and dropするといろいろTrackが表示されるのでまずはAnimation Trackを選択してください。このAnimation Trackはオブジェクトを移動させたり、回転させたり、アニメーションさせたりするtrackです。

このオブジェクトを移動させてみます。赤いrecordingボタンを押してください。そうするとrecordingが始まります。

そしたらオブジェクトを移動してみてください。そうするとタイムラインの右側の部分に点がおかれると思います。移動させないとプロットされないので最初の位置にはお気を付けください。

時間を進めてみて、また移動させてください。そしたらまたプロットされます。画像では5秒後にプロットされていると思います。そしたらまた赤いrecordボタンを押してrecordを終了してください。

この状態で時間軸を動かしてみるとオブジェクトがスムーズに動いているのが確認できます。

次に回転させてみます。やり方は同じで赤いボタンを押した後にオブジェクトを回転、時間軸を動かしてまた回転させて、赤いボタンを押して、recordを終了します。キーボードのEキーを押すことで移動から回転へと切り替えられます。

タイムライン上では何も問題なくオブジェクトが動いているようですが実際にゲームをスタートしてみると変な挙動になる場合があります。その最たる原因はこのオブジェクトはプレイヤーが操作するオブジェクトだからです。そのためコンポーネントをみてみるとCharacter Controllerと自分の場合はFirst Person Controllerというスクリプトがあるのが確認できます。ようはこのオブジェクトをプレイヤーが操作するためのコンポーネントです。通常タイムラインを再生中はオブジェクトをプレイヤーが操作できるといろいろと都合が悪いです。このコンポーネントがタイムラインでつくった動作を邪魔しています。なのでこのコンポーネントのチェックボタンをオフにしてもう一回ゲームをスタートしてみると問題なく動きます。もしまだ動作が安定しない場合は他のコンポーネントやオブジェクトが邪魔していると思うのでそれを探してみてください。タイムラインが始まったときにオブジェクトが動作するのを邪魔するコンポーネントやオブジェクトをオフにして、タイムラインが終わったらオンにするようにすれば問題は解決します。

プロジェクトウィンドウで任意のスクリプトフォルダに右クリック→Create→Scripting→empty scriptで空のスクリプトをつくってこのスクリプトをコピペしてください。

using UnityEngine;
public class ComponentOff : MonoBehaviour
{  
    public GameObject FPSController;
    public GameObject InputManager;
   
    public void Off()
    {  
        if(InputManager != null){
            InputManager.SetActive(false);
        }
       
        if (FPSController != null){
            FPSController.GetComponent<CharacterController>().enabled = false;
            FPSController.GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().enabled = false;
        }
    }

    public void On()

    {  

        if(InputManager != null){

            InputManager.SetActive(true);

        }

       

        if (FPSController != null){

            FPSController.GetComponent<CharacterController>().enabled = true;

            FPSController.GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().enabled = true;

        }

    }

}