Q. Timelineを使ってキャラクターの攻撃シーンを作っています。Timelineの再生バーを動かしている間、炎パーティクルの再生タイミングが合わなかったり、巻き戻した時にエフェクトが消えずにずっと吹き出し続けたりします。どうすればTimelineと時間をピッタリ同期できますか?
A. パーティクルをTimelineと同期させるには、オブジェクトの有効/無効だけを切り替える「Activation Track」ではなく、パーティクルのシミュレーション時間をTimeline側から強制駆動する「Control Track」を使用する必要があります。
不具合の症状とTimeline連携時のズレ問題
Unityのカットシーン制作ツールである「Timeline」を用いて、演出やイベントシーンを構築する際、エフェクトのタイミング合わせは重要です。しかし、多くの開発者が標準の「Activation Track」を使用してパーティクル(Particle System)を管理しようとすると、以下の同期ズレや表示バグに遭遇します。
- Timelineの再生ヘッドを手動でドラッグ(シーク)したとき、パーティクルが一時停止したり巻き戻ったりせず、勝手に前へ進んで吹き出し続ける。
- Timelineを巻き戻して再生し直した際に、前回再生されたパーティクルの残骸が画面内に残って漂ったままになる。
- 実行時のゲーム中の再生と、エディタ上のTimelineでのプレビューとで、パーティクルが発生・消滅するタイミングがズレてしまう。
初心者向けの例え話:オルゴールの出し入れとゼンマイの連動
この同期問題を、音楽を奏でる「ネジ式のオルゴール(Particle System)」と、「映画のフィルム映写機(Timeline)」に例えて説明します。
Activation Trackを使っている状態は、いわば「再生中のオルゴールを、指定の時間になったら机の上にポンと置き(アクティブ化)、時間が来たら引き出しにしまう(非アクティブ化)」という動作をしています。机の上に置かれたオルゴールは、自身のゼンマイの力で勝手に音楽を奏で始めます。ここで映写機のフィルムを巻き戻したり、コマ送りしたりしても、机の上のオルゴールはフィルムの動きとは関係なく、自分のテンポで鳴り続けます。これでは、フィルムの映像とオルゴールの曲がピッタリ合うはずがありません。
一方、Control Track(コントロールトラック) を使うということは、「オルゴールの主ゼンマイを外し、映写機のフィルムを送る歯車と、オルゴールの駆動ギアを直接シャフトでカチッと連結すること」を意味します。フィルムを1コマ進めればオルゴールも1拍進み、フィルムを逆回転させて巻き戻せば、オルゴールの曲も逆再生されて元の静かな状態に戻ります。このように、Timelineの時間軸の進み具合(再生ヘッドの位置)と、パーティクルがシミュレーションを進めるための内部時計をガッチリと結合させることが、完全同期の正体です。
想定される主な原因
Timelineとパーティクルの動作が一致しない主な原因は以下の通りです。
- Activation Trackの選択: Activation Trackは単にゲームオブジェクトのActive/Inactiveを制御するだけなので、シミュレーション時間そのものをTimelineの再生ヘッドの位置に同期させる力はありません。
- Particle Systemの「Play On Awake」設定の干渉: オブジェクトが有効化した瞬間に自動再生される設定などが残っていると、Timelineの制御指示と競合して二重に再生が走ったり、タイミングが狂ったりします。
- ランダムシード(Random Seed)の不固定: パーティクルの飛び散り方が再生ごとにランダムに変化するため、映像表現を狙う際に毎回見た目が変わってしまいます。
具体的な解決方法と同期手順
Timelineの再生ヘッドとパーティクルシステムを完全に同期させるための正しい手順です。
手順1:Control Track(コントロールトラック)の作成
Timelineウィンドウの左側のトラックリストの空いているスペースを右クリックし、コンテキストメニューから **`Control Track`** を追加します。
手順2:パーティクルオブジェクトのドラッグ&ドロップ
ヒエラルキーウィンドウから、同期させたい `Particle System` がアタッチされているゲームオブジェクトを選択し、新しく作成した `Control Track` の上へ直接ドラッグ&ドロップします。自動的に `Control Playable Asset` クリップが生成されます。
手順3:クリップの範囲調整とパーティクル側のクリーンアップ
- トラック上に配置されたクリップの左端と右端をドラッグして、エフェクトを発生させたい時間帯に合わせます。
- パーティクルオブジェクトのインスペクターを開き、`Particle System` の **`Play On Awake`** のチェックを外します。
- 同じく `Particle System` の **`Looping`** (ループ再生)のチェックを外します。Timeline側でループや再生期間を管理するため、パーティクル単体でのループは不要になります。
- 必要に応じて、インスペクターの最下部付近にある **`Resimulate`** にチェックが入っていることを確認します。これによりエディタ上でのシーク同期が有効になります。
以下は、Timelineのシーク操作に合わせて、プログラムから手動でParticle Systemの時間を同期制御するためのC#スクリプトです。
using UnityEngine;
[ExecuteInEditMode]
public class ManualParticleDirector : MonoBehaviour
{
[SerializeField] private ParticleSystem targetParticleSystem;
[Range(0f, 10f)]
[SerializeField] private float currentNormalizedTime = 0f;
private float lastTime = -1f;
void Update()
{
if (targetParticleSystem == null) return;
if (!Mathf.Approximately(currentNormalizedTime, lastTime))
{
targetParticleSystem.Simulate(currentNormalizedTime, true, true);
lastTime = currentNormalizedTime;
}
}
}
この手順を踏んで Control Track を活用することで、映像作品としてのこだわりや、ゲーム中の操作フィードバックに合わせた寸分の狂いもない正確なエフェクトアニメーションを実現できます。ユーザーのゲーム没入感を高めるために、Timelineとパーティクルの完全同期は不可欠な手法です。