【Unity 6】Timeline入門|Cubeを動かして、C#から演出を再生してみよう

広告

Unityでゲームを作っていると、「ゲーム開始時にオブジェクトを動かしたい」「ボス登場の演出を作りたい」と思うことがあります。これらの動きをすべてC#のコルーチンで書くこともできますが、決まった順番の演出を組み立てるなら、Timeline(タイムライン)が便利です。

この記事では、まずCubeを左から右に動かす短い演出を作り、その後、スペースキーを押したときにC#から再生するところまで進めます。Animatorのステート遷移やCinemachineのカメラ設定を一から学び直す記事ではありません。

この記事の進め方

  • Unity 6の3Dプロジェクトに新しいシーン(TimelinePractice)を作って進めます
  • Animatorをまだ使ったことがない人は、先にUnity Animator 学習シリーズで基本を確認しておくとスムーズです
  • 手順4ではInput Systemを使います。キー入力の受け取り方はInput Systemで「押した瞬間」を扱う記事で確認できます
  • 上から順に進めれば完成します。作る順番は「シーンの準備 → Timelineを作る → Cubeの移動を記録 → C#から再生」です。音の追加は発展課題です

今回のゴール

  • Timeline AssetとPlayable Directorの役割を説明できる
  • Cubeの位置を時間に沿って変えるAnimation Trackを作れる
  • PlayableDirector.Play()を使ってC#から演出を再生できる
  • 通常のゲーム動作と、決まった順番の演出の使い分けを考えられる

所要時間の目安:60〜90分。 音声・カメラ連携は発展課題です。

TimelineとAnimatorは何が違う?

Animatorは、たとえば「IdleからWalkへ」「WalkからAttackへ」というように、状態と条件による動きの切り替えを得意としています。一方、Timelineは「0秒に開始、2秒まで移動、3秒で効果音」というように、時間の流れに沿った演出を得意としています。

機能主な役割使いどころ
Animation Clip動きそのものを記録する移動・回転など
Animator Controller状態と遷移を管理するIdle / Walk / Attack
Timeline複数のクリップを時間軸に配置する開始演出、イベントシーン
Playable DirectorTimelineをシーンに結びつけ、再生を管理するC#からの再生・停止

Animatorの基礎を確認したい人は、先にUnity Animator 学習シリーズを見てください。

1. 新しい3Dシーンを用意する

Unity 6の3Dプロジェクトで作業します。シーンを保存し、Hierarchyで右クリックして 3D Object → Cube を追加します。

  1. Cubeの名前を DemoCube に変更する
  2. TransformのPositionを (-3, 0, 0) にする
  3. Hierarchyで Create Empty を選び、空のGameObjectを TimelineDirector と名付ける
  4. シーンを TimelinePractice として保存する

CubeがGameビューに映らない場合は、Main Cameraの位置や向きを調整してください。ここでの目的は「Cubeを画面内に見せる」ことで、カメラの正確な数値は必須ではありません。

2. Timelineを作る

  1. メニューから Window → Sequencing → Timeline を開く
  2. Hierarchyで TimelineDirector を選択する
  3. Timelineウィンドウにある Create をクリックする
  4. 保存先と名前を指定し、CubeMoveTimeline として保存する

Timeline Assetが作られ、TimelineDirector に Playable Director コンポーネントが追加されます。Inspectorの Playable 欄に CubeMoveTimeline が指定されていることを確認しましょう。

TimelineウィンドウにCreateが出ない場合は、選択中のGameObjectを確認してください。また、Timelineが見つからない場合は Window → Package Manager でTimelineパッケージが導入されているか確認します。

Timelineの用語

  • Track(トラック):アニメーションや音声などを置く行
  • Clip(クリップ):トラック内で時間の長さを持つ要素
  • Playhead(再生ヘッド):現在どの時刻を見ているか示す線
  • Binding(バインディング):トラックがどのGameObjectを操作するかの関連付け

Timeline Asset自体と、シーン中の対象GameObjectとの関連付けは別です。アセットを作っただけでCubeが自動的に動くわけではありません。

3. Cubeの移動を記録する

最初はAnimation Trackひとつだけを使います。

  1. Timelineウィンドウの Add(+)→ Animation Track を選ぶ
  2. Hierarchyの DemoCube をAnimation Trackのバインディング欄にドラッグする。必要ならCubeにAnimatorコンポーネントを追加する
  3. Animation Trackの録画(赤丸)ボタンを押し、記録モードにする
  4. 再生ヘッドを 0秒 に置き、DemoCube のPosition Xを -3 にする
  5. 再生ヘッドを 2秒 に移動し、Position Xを 3 にする
  6. 録画ボタンをもう一度押して記録を終了する
  7. 再生ヘッドを0秒に戻し、Timelineの再生ボタンで動きを確認する

これでCubeが左から右へ移動するアニメーションを作れます。最初の記録でAnimation Clipが生成される場合があります。記録方法によって、トラック上の表示はInfinite Clip(無限クリップ)になることがあります。

確認ポイント: InspectorでPositionを動かしても記録されない場合は、録画ボタンが有効か、再生ヘッドが意図した時刻にあるか、Animation TrackのBindingがDemoCubeになっているかを確認してください。

注意: 同じTransformをAnimator Controllerや別のスクリプトで同時に動かすと、どちらが位置を決めるのか分かりにくくなります。この演習では、Cubeの位置変更はTimelineだけに任せます。

4. 再生をC#から制御する

ここまでの動きはTimelineウィンドウから再生できました。次は、ゲーム中にスペースキーを押したときに演出を開始します。

まず、TimelineDirector のPlayable Directorコンポーネントで、Play On Awake のチェックを外します。起動直後に自動再生しないようにするためです。また、Wrap ModeをNone にし、最後まで再生したら停止する設定にしておきます。Noneでは、再生が終わるとCubeが再生前の位置に戻ることがあります。右端で止めたままにしたい場合は Hold を選びましょう。

Projectで TimelineStarter.cs を作成し、次のコードを入力します。今回は新Input Systemを使用します。

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Playables;

public class TimelineStarter : MonoBehaviour
{
    [SerializeField] private PlayableDirector director;

    private void Update()
    {
        if (Keyboard.current == null)
        {
            return;
        }

        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            if (director == null)
            {
                Debug.LogWarning("Playable Directorが設定されていません。");
                return;
            }

            director.Stop();
            director.time = 0;
            director.Play();
        }
    }
}

Inspectorで参照を設定する

  1. TimelineDirector に TimelineStarter を追加する
  2. TimelineStarter の Director 欄に、Hierarchyの TimelineDirector 自身をドラッグする
  3. Playモードでスペースキーを押し、Cubeが動くか確認する

PlayableDirector 型の変数を使うため、using UnityEngine.Playables; が必要です。

Stop()で直前の再生を止め、time = 0で先頭に戻し、Play()で最初から再生するようにしています。スペースキーを連打した場合も先頭からやり直す仕様です。

入力に関する注意: Keyboard.current はInput SystemパッケージのAPIです。Package ManagerでInput Systemを導入し、プロジェクトで有効にしてください。入力に関する詳しい説明は、【Unity 6】ジャンプや攻撃の入力を受け取る ― Input Systemで「押した瞬間」を扱う2つの方法を参照してください。

5. なぜC#だけで書かないの?

Cubeを2秒間で移動させるだけなら、C#で書く方が簡単な場合もあります。しかし、「Cubeの移動と同時に効果音を鳴らす」「少し遅れて別のオブジェクトを動かす」といった演出では、開始時刻と長さを見ながら調整できることがTimelineの強みです。

反対に、敵の追跡AI、プレイヤー入力、衝突判定、体力管理などはTimelineに任せるよりC#で実装するのが自然です。

  • C#: ゲームのルールや状況に応じた動作
  • Timeline: 決まった順番・タイミングで行う演出
  • Playable Director: その2つをつなぐ再生窓口

6. 発展:演出に音を追加する

効果音のAudio Clipが用意できたら、次のように追加します。

  1. TimelineDirector に Audio Source コンポーネントを追加する
  2. Timelineに Audio Track を追加する
  3. Audio TrackをAudio Sourceにバインドする
  4. Projectの音声ファイルをAudio Trackにドラッグして配置する
  5. 再生開始位置を移動し、Cubeの動きと音が合うように調整する

音声ファイルを準備していなければ、この課題は飛ばして構いません。Timelineの音声プレビューは、環境によってはPlayモードでの確認が必要です。

カメラも切り替えたい場合

Cinemachineを使うと、Timeline内でカメラのショットを並べて切り替えることもできます。ただし、Cinemachine Camera、Cinemachine Brainの設定をこの記事で重ねて説明することはしません。

すでにUnity 6入門チュートリアル:Cinemachineでゲームのカメラを自由に動かそう!の「発展:Timelineで映画のような演出を作る」に、全景→接近→追従の例があります。基本演習を終えたら、そちらに進みましょう。

7. うまく動かないとき

症状確認すること
TimelineウィンドウにCreateがないTimelineDirector が選択されているか
Cubeが移動しないAnimation TrackのBinding、Animator、記録したキーフレーム
Playモード開始時に勝手に動くPlayable DirectorのPlay On AwakeをOFF
スペースキーに反応しないInput Systemの導入と有効化、Gameビューのフォーカス
Consoleに参照警告が出るTimelineStarter のDirector欄を設定したか
Cubeの位置が予想と違うTimelineのWrap Modeや、同じTransformを制御する他の処理

8. 理解を確かめよう

  1. Timeline AssetとPlayable Directorは、それぞれ何を担当しますか?
  2. CubeのAnimation Trackを作ったのに動かないとき、Bindingを確認するのはなぜですか?
  3. director.Play()を使うと、何ができるようになりますか?
  4. 「敵の追跡」と「ボス登場時のカメラ演出」は、どちらをTimelineに任せるのがよいでしょうか? 理由も考えてみましょう。

まとめ

Timelineは、ゲーム内の複数の動きや音を時間軸で組み立てる道具です。今回の演習では、Cubeを動かすAnimation Trackを作成し、Playable Directorを通してC#から再生しました。

まずは「Timelineで演出を作る」「C#で演出を開始する」という役割分担が分かれば十分です。慣れたら音声、複数のオブジェクト、Cinemachineのカメラ演出へと発展させてみてください。

関連記事

公式資料

訪問数 6 回, 今日の訪問数 6回

広告