Quick answer: Bindings to objects outside the prefab hierarchy become null on instantiation. Use PlayableDirector.SetGenericBinding(track, sceneObject) at runtime to rebind each track. Bindings to objects inside the same prefab survive.

Here is how to fix Unity Timeline binding lost after prefab. You build a cutscene: camera track, character animation track, light intensity track. It plays perfectly in the scene. You make it a prefab. Instantiate it in another scene. All bindings are null — the camera track has no camera, the animation track has no animator, the light track has no light. Timeline works in-scene but prefabs break cross-object references.

The Symptom

A PlayableDirector on an instantiated prefab shows “None” for all track bindings in the Inspector. Playing the timeline produces no visible effect. Internal bindings (tracks targeting objects within the same prefab) may work; external ones do not.

What Causes This

Scene references do not serialize into prefabs. A binding from a PlayableDirector to a scene camera is a scene-specific reference. Prefab serialization can only store references to objects within the prefab hierarchy. Anything outside becomes null.

ExposedReferences lose context. Timeline uses ExposedReference<T> internally for some bindings. These resolve via the PlayableDirector’s resolver table, which is per-instance. Prefab instances start with an empty table.

The Fix

Step 1: Rebind at runtime.

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class TimelineRebinder : MonoBehaviour
{
    [SerializeField] private PlayableDirector director;
    [SerializeField] private Animator characterAnimator;
    [SerializeField] private Camera cutsceneCamera;
    [SerializeField] private Light keyLight;

    void Awake()
    {
        TimelineAsset timeline = director.playableAsset as TimelineAsset;
        foreach (TrackAsset track in timeline.GetOutputTracks())
        {
            if (track is AnimationTrack)
                director.SetGenericBinding(track, characterAnimator);
            else if (track is CinemachineTrack || track.name.Contains("Camera"))
                director.SetGenericBinding(track, cutsceneCamera);
            else if (track is LightControlTrack)
                director.SetGenericBinding(track, keyLight);
        }
    }
}

Expose scene references as serialized fields on the rebinder script. On Awake, iterate tracks and bind. The TimelineRebinder lives on the same prefab; scene references are set per-instance in the Inspector after placing the prefab.

Step 2: Keep self-contained tracks inside the prefab. If the timeline only needs objects within its own hierarchy (child animator, child particles), those bindings survive prefab instantiation. Restructure to include cutscene actors as prefab children where possible.

Step 3: Use track names for matching. Instead of checking track type, match by name for more flexibility:

foreach (TrackAsset track in timeline.GetOutputTracks())
{
    switch (track.name)
    {
        case "PlayerAnimation":
            director.SetGenericBinding(track, playerAnimator);
            break;
        case "MainCamera":
            director.SetGenericBinding(track, Camera.main);
            break;
    }
}

Name-based matching lets you add tracks without updating the rebinder code for type checks.

Step 4: Call Play after binding. Binding is instant, but ensure all bindings are set before calling director.Play(). Playing with null bindings produces no errors but affected tracks do nothing.

Signal Emitters and Markers

Signal Emitters on Timeline also need receivers in the scene. If your cutscene fires signals (e.g. “shake camera”), the Signal Receiver component must exist on a scene object and be connected to the director. Re-wire signal receivers in the rebinder alongside track bindings.

“Timeline is a director that needs actors. Prefabbing the director does not prefab the actors. Cast them at runtime.”

Related Issues

For Sequencer binding in Unreal, see Unreal Sequencer Keyframe Not Evaluating. For Timeline signal issues, Timeline Signal Not Firing in Build.

SetGenericBinding per track in Awake. Name-match for flexibility. Play after all bindings set.