この記事は前回の記事の続きとなっていますの前回の記事を内容を把握してから読んでいただきますようお願いします。動画はこちらから↓
前回の記事のおさらいからします。タイムラインウィンドウを開いたうえでヒエラルキー上にタイムラインを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というスクリプトがあるのが確認できます。ようはこのオブジェクトをプレイヤーが操作するためのコンポーネントです。通常タイムラインを再生中はオブジェクトをプレイヤーが操作できるといろいろと都合が悪いです。このコンポーネントがタイムラインでつくった動作を邪魔しています。なのでこのコンポーネントのチェックボタンをオフにしてもう一回ゲームをスタートしてみると問題なく動きます。もしまだ動作が安定しない場合は他のコンポーネントやオブジェクトが邪魔していると思うのでそれを探してみてください。タイムラインが始まったときにオブジェクトが動作するのを邪魔するコンポーネントやオブジェクトをオフにして、タイムラインが終わったらオンにするようにすれば問題は解決します。
前回作ったTimelineフォルダ上で右クリック→Create→Timeline→Signalをクリックしてください。Timelineフォルダ上じゃなくてくもいいですが、どこにつくったか後でわかるようにしてください。このシグナルをタイムライン上に配置することで任意のスクリプトを呼び出すことが出来ます。コンポーネント、オブジェクトをを無効化するシグナルと有効化するシグナルが必要となるため、シグナルを二つ作ってONとOFFというようなわかりやすい任意の名前をつけてください。

次にヒエラルキー上で空オブジェクトを作って、そのオブジェクトのInspectorウィンドウでAdd Componentボタンを押してSignal Receiverと検索して追加してください。作った空オブジェクトの名前はTimeLineScriptとします。

次にプロジェクトウィンドウで任意のスクリプトフォルダに右クリック→Create→Scripting→empty scriptで空のスクリプトをつくってこのスクリプトをコピペしてください。スクリプトの名前はクラス名と同じComponentoff.csとなるように注意してください。
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;
}
}
}
上記のコードはご自分の環境に合わせて書き換えなければいけません。少しコードの解説をします。
publicを付けることで明示的にオブジェクトを指定できます。先ほどDrag and Dropしたのがそれです。
public GameObject FPSController;
public GameObject InputManager;
下記のコードは受けとったFPSControllerのなかのCharacter Controllerというコンポーネントを指定して無効化させてます。falseをtrueに変えたら有効化できます。
FPSController.GetComponent<CharacterController>().enabled = false;
こちらのコードもFPSControllerの中のFirstPersonControllerというスクリプトを無効化しています。UnityStandardAssets.Characters.FirstPerson.FirstPersonControllerというようにいろいろと前についているのは名前空間です。
FPSController.GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().enabled = false;
こちらは明示的に受け取ったInputManagerというオブジェクトをオブジェクトごと無効化させてます。これもfalseをtrueに変えたら有効化できます。
InputManager.SetActive(false);
これらのコードをOff()という関数にまとめて、さらにfalseをtrueに書き換えてOn()という関数も作ります。
上記のコードを参考にして不要なコンポーネントとオブジェクトを無効化する関数と有効化する関数をつくってください。
このスクリプトを先ほど作ったTimelineScriptオブジェクトのInspectorにDrag and Dropしてください。
FPS Controllerという欄とInput Managerという欄があると思います。FPS Controllerには先ほどCharacter ControllerやFirst Person Controllerスクリプトがふくまれていたプレイヤーが操作するオブジェクトをDrag and Dropしてください。

次にSignal ReceiverのAdd Reactionボタンをクリックしてください。

そしたらNoneというところをクリックして先ほどつくったシグナルの名前を指定してください。シグナルは二つあるのでまたAdd ReactionボタンをクリックしてReactionを二つつくってください。

List is Emptyとなっていると思うので+ボタンを押してください。そしたら画像のようにComponentOffスクリプトをDrag and Dropしてください。もう一つのReactionにも同じようにComponentOffスクリプトをDrag and Dropしてください。
No Functionとなっていると思うのでNo Function→ComponentOff→Off()とクリックしてください。もう一つのReactionはNo Function→ComponentOff→On()とクリックしてください。このOff()やOn()は先ほどのスクリプトで作った関数です。

次にTimelineウィンドウを開いてください。左上の+ボタンをクリックしてSignal Trackをクリックしてください。

Noneという欄があるのでさきほどのTimeLineScript(Signal Receiverコンポーネントを持っているオブジェクト)をそこにDrag and Dropします。

次にプロジェクトウィンドウでTimelineフォルダをひらきます。Timelineウィンドウ上にさきほどつくったOffのシグナルを一番最初に、Onのシグナルを一番最後にDrag and Dropしてください。

これで完成です。ゲームをスタートするとFPSControllerオブジェクトのCharacter ControllerコンポーネントとFirstPersonControllerスクリプトが無効化されて安定してオブジェクトが動作していることが確認できます。タイムラインが終わったら無効化されたものが有効化に戻ることも確認できます。
ゲーム中にタイムラインが始まるときは座標がおかしくなる場合があります。ゲーム中の座標をタイムラインで使う場合は画像のように右クリック→Track Offset→Apply Scene Offsetをクリックしてください。

今回の記事はここまでです。次回はタイムラインの使い方後編となります。今回の内容はプレイヤーが操作するオブジェクトをタイムラインで動かす方法をやりましたが、次回はそうでないオブジェクトの動かし方をします。