概要
「カットシーンを作りたい…」「ボス登場演出を作りたい…」「映画のようなカメラワークを実現したい…」
ゲーム開発では、このような演出の課題に直面することがあります。Timeline は、ゲーム内のアニメーション、オーディオ、カメラの動きなどを時間軸に沿って編集・管理できる機能です。映像編集ソフトのタイムラインと同じ概念で、コードを書かずに視覚的にイベントシーケンスを作成できます。
構成要素
Timelineは以下の要素で構成されています。
| 要素 | 説明 |
|---|---|
| Timeline Asset | タイムラインの設定を保存するアセットファイル |
| Playable Director | GameObjectにアタッチして、Timelineを再生するコンポーネント |
| Track | 特定の要素(アニメーション、オーディオなど)を制御する時間軸 |
| Clip | トラック上に配置される個別の要素 |
主要なトラックの種類
Activation Track
GameObjectのアクティブ/非アクティブを時間軸で制御します。敵の出現、UIの表示切り替えなどに使用します。
Animation Track
既存のアニメーションクリップを再生したり、Timeline内で直接キーフレームアニメーションを記録できます。キャラクターの動き、オブジェクトの移動・回転などを制御します。
Audio Track
BGMや効果音を時間軸に配置します。複数の音声を同期させて再生したり、ボリュームやピッチの調整も可能です。
Control Track
Prefabやネストされたタイムライン、Particleシステムを制御します。
主な使用例:
- ネストされたTimeline: 別のTimelineを再生(複雑な演出を分割管理)
- Particle System: エフェクトの再生タイミングを制御
- Prefabのインスタンス化: 特定タイミングでPrefabを生成・破棄
Signal Track
特定のタイミングでイベントを発火します。Signal Receiverと組み合わせて、外部システムと通信できます。カスタムロジックの実行、UIの更新、ゲーム状態の変更などに使用します。
Cinemachine Track
Cinemachineの仮想カメラを制御します。複数のカメラビューを切り替え、映画的なカメラワークを実現します。
Cinemachine 3.xの主な変更点:
CinemachineVirtualCamera→CinemachineCameraCinemachineBrainの設定がカメラコンポーネントに統合CinemachineComposer→CinemachineRotationComposerCinemachineTransposer→CinemachineFollowCinemachineOrbitalTransposer→CinemachineOrbitalFollow使用しているCinemachineのバージョンを確認し、適切なコンポーネント名を使用してください。
基本的な使い方
セットアップ手順
1. Timelineアセットの作成
- Projectウィンドウで右クリック → Create → Timeline
- または、Window → Sequencing → Timeline でウィンドウを開き、Createボタンをクリック
2. Playable Directorの設定
- 空のGameObjectを作成
- TimelineアセットをHierarchyのGameObjectにドラッグ&ドロップ
- 自動的にPlayable Directorコンポーネントが追加される
3. トラックの追加
- Timelineウィンドウで「+」ボタンまたは右クリック
- 追加したいトラックの種類を選択
- または、GameObjectをTimelineウィンドウにドラッグ&ドロップ
4. クリップの配置
- トラックにアニメーションクリップやオーディオクリップをドラッグ
- または、Recordingモードで直接キーフレームを記録
Recording(記録)モード
- トラックの赤い丸ボタンをクリックして記録開始
- タイムラインの時間を移動しな がら、オブジェクトのTransformやプロパティを変更
- 変更内容が自動的にキーフレームとして記録される
- 記録モードを終了すると、アニメーションクリップが生成される
Recorded Clip: 生成されたクリップはTimelineアセット内に Recorded Clip として埋め込まれます。後から通常のAnimationClipに差し替えたり、Projectウィンドウに抽出して再利用することも可能です。
Cinemachineとの連携
CinemachineはUnityの高度なカメラシステムで、仮想カメラを使ってプロ品質のカメラワークを実現します。
連携手順
1. Cinemachine Trackの追加
Timelineに「Cinemachine Track」を追加し、シーン内のCinemachine Brainを持つカメラをバインドします。
2. Virtual Cameraの配置
シーン内に複数のCinemachine Virtual Cameraを配置し、各カメラで異なるアングル、フォロー対象を設定します。
3. カメラショットの作成
Cinemachine TrackにVirtual Cameraをドラッグ&ドロップします。クリップの長さでカメラの表示時間を調整し、クリップを並べることでカメラの切り替えを実現します。
4. ブレンドの調整
クリップ間のブレンド時間を調整して、スムーズなカメラ遷移やカットのような切り替えを設定します。
実践的な使用例
カットシーンの作成
- ストーリーの流れを 計画
- 必要なカメラアングルを決定
- キャラクターのアニメーションを配置
- セリフやBGMを追加
- カメラワークを調整
- エフェクトやUIを追加
ゲーム開始演出
| トラック | 内容 |
|---|---|
| Activation Track | タイトルロゴの表示 |
| Cinemachine Track | カメラのズームイン |
| Audio Track | BGMの再生 |
| Animation Track | UIのフェードイン |
| Signal Track | ゲームプレイへの移行 |
ボス登場演出
| トラック | 内容 |
|---|---|
| Signal Track | プレイヤーの移動停止 |
| Cinemachine Track | カメラをボスに向ける |
| Animation Track | ボスの登場アニメーション |
| Audio Track | 効果音と音楽の再生 |
| Activation Track | ボス名の表示 |
| Signal Track | 戦闘開始 |
スクリプトからの制御
Timelineの再生制御
using UnityEngine;
using UnityEngine.Playables;
public class TimelineController : MonoBehaviour
{
PlayableDirector director;
void Start()
{
director = GetComponent<PlayableDirector>();
}
public void PlayTimeline()
{
director.Play();
}
public void PauseTimeline()
{
director.Pause();
}
public void StopTimeline()
{
director.Stop();
}
public void JumpToTime(double time)
{
director.time = time;
director.Evaluate(); // Pause中も即座に反映
}
public void SetStartTime(double time)
{
director.initialTime = time; // 再生開始位置を指定
}
// スクラブ:スライダーと連動させる場合
public void OnSliderChanged(float normalizedTime)
{
director.time = normalizedTime * director.duration;
director.Evaluate(); // プレビュー用途でも使用可能
}
void OnEnable()
{
director.played += OnTimelinePlayed;
director.paused += OnTimelinePaused;
director.stopped += OnTimelineFinished;
}
void OnDisable()
{
director.played -= OnTimelinePlayed;
director.paused -= OnTimelinePaused;
director.stopped -= OnTimelineFinished;
}
void OnTimelinePlayed(PlayableDirector pd)
{
Debug.Log("Timeline started!");
}
void OnTimelinePaused(PlayableDirector pd)
{
Debug.Log("Timeline paused!");
}
void OnTimelineFinished(PlayableDirector pd)
{
Debug.Log("Timeline finished!");
}
}
Signal Receiverの使用
- Signal Assetを作成(Project右クリック → Create → Signal)
- Signal Trackを追加し、Timelineウィンドウ左側のバインドフィールド にSignal Receiverを持つGameObjectを設定
- Signal TrackにSignal Emitterを配置
- GameObjectにSignal Receiverコンポーネントを追加
- Signalに対応するメソッドを登録
using UnityEngine;
public class CutsceneEventHandler : MonoBehaviour
{
// Signal Receiverから呼び出されるメソッド
public void OnBossAppear()
{
Debug.Log("ボスが登場しました!");
// プレイヤーの移動を停止、UIを表示など
}
public void OnBattleStart()
{
Debug.Log("戦闘開始!");
// ゲームの状態を戦闘モードに変更
}
}
Signal Receiverの設定手順:
- Signal Receiverコンポーネントを開く
- Add Reaction をクリック
- 使用するSignal Assetを選択
- 対象GameObjectとメソッドを指定
ランタイムでのバインド変更
実務で頻出するパターンとして、ランタイムでトラックのバインド先を変更できます。
// 別のキャラクターに差し替える例
foreach (var output in director.playableAsset.outputs)
{
if (output.streamName == "PlayerAnimation")
{
director.SetGenericBinding(output.sourceObject, newCharacter);
}
}
次のステップ: 独自のトラックを作成したい場合は、
TrackAsset(トラック本体)、PlayableAsset(クリップデータ)、PlayableBehaviour(実行時の振る舞い)の3クラスを継承してCustom Trackを実装できます。
よくある課題と解決策
課題1: Timelineが再生されない
- Playable DirectorのPlay On Awakeが有効か確認
- Timelineアセットが正しく設定されているか確認
- トラックにバインドされているオブジェクトが存在するか確認
課題2: アニメーションが反映されない
- Animation TrackにAnimatorコンポーネントが正しくバインドされているか確認
- Animatorの他のレイヤーやステートマシンと競合していないか確認
- Recordingモードが終了しているか確認
AnimatorとAnimation Trackの競合解決:
- Avatar Mask を使って、Timelineで制御する部位を限定する
- Track weight を調整して、Timelineの影響度を制御する
- Timeline再生中は Animatorのステートマシンを無効化 する
課題3: 再生終了後にオブジェクトが元の状態に戻る
Playable Directorの Wrap Mode を確認してください。
| Wrap Mode | 動作 |
|---|---|
| Hold | 最終フレームの状態を維持 |
| Loop | 繰り返し再生 |
| None | 再生終了後に元の状態に戻る |
よくある問題: デフォルトの
Noneでは、キャラクターの位置やプロパティが再生前の状態に戻ります。カットシーンでは通常Holdを使用します。
課題3.5: Update Methodの選択
Playable Directorの Update Method を用途に応じて選択してください。
| Update Method | 用途 |
|---|---|
| Game Time | 通常のゲームプレイ(Time.timeScaleの影響を受ける) |
| Unscaled Game Time | ポーズ中のUI演出など(Time.timeScaleの影響を受けない) |
| DSP Clock | 音声同期が重要な場合 |
| Manual | スクリプトで完全に制御する場合 |
課題4: カメラが切り替わらない
- Cinemachine Brainがメインカメラにアタッチされているか確認
- Virtual Cameraのプライオリティが正しく設定されているか確認
- Cinemachine TrackにCinemachine Brainがバインドされているか確認
課題5: Signalが発火しない
- Signal Receiverが正しいGameObjectにアタッチされているか確認
- Signal AssetがSignal Emitterに設定されているか確認
- Signal ReceiverにReactionが登録されているか確認
ベストプラクティス
命名規則
- Timelineアセット:
Timeline_CutsceneName - トラック: 役割が分かる名前(例:
Track_PlayerAnimation) - Signal Asset:
Signal_EventName
整理整頓
- 関連するTimelineアセットは専用フォルダにまとめる
- トラックは種類ごとにグループ化
- 長いTimelineはマーカーで区切る
パフォーマンス
- 不要なトラックやクリップは削除
- 高解像度のアニメーションは圧縮
- 複雑なTimelineは分割して管理
- Addressablesで必要に応じてロード/アンロード
まとめ
Timelineは、カットシーンやシネマティック演出を作成するための強力なツールです。
- Activation Track - オブジェクトの表示/非表示を制御
- Animation Track - アニメーションを時系列で管理
- Audio Track - BGMや効果音を配置
- Cinemachine Track - 映画的なカメラワークを実現
- Signal Track - イベントを発火してゲームロジックと連携
コードを書かずに視覚的に演出を作成でき、Cinemachineとの連携でプロ品質のカメラワークも実現できます。