If your OnNotify method isn’t triggered as your Timeline passes through the SignalEmitter, it’s usually due to a configuration issue. Here’s a step-by-step troubleshooting and resolution guide to ensure signals properly trigger OnNotify:
Check if you have correctly attached the INotificationReceiver script to your intended receiver GameObject:
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class SignalReceiverScript : MonoBehaviour, INotificationReceiver
public void OnNotify(Playable origin, INotification notification, object context)
Debug.Log("Signal received at time: " + origin.GetTime());
Make sure this script:
- Implements
INotificationReceiver.
- Has a public, non-static
OnNotify method.
- Is attached to the GameObject that you’re targeting in the Timeline.
- Open your Timeline.
- Check that you have a Signal Track with a valid SignalEmitter clip:
- Ensure the SignalEmitter has a signal asset assigned.
- Ensure it targets a Signal Receiver component on the correct GameObject.
Correct Setup:
└── SignalEmitter (with Signal asset assigned)
└── Targets SignalReceiver component on GameObject with SignalReceiverScript attached
Unity’s Timeline signal system typically expects the built-in SignalReceiver component. If you’re directly using INotificationReceiver without the built-in component, your custom script may not trigger properly.
If you currently don’t have a built-in Unity SignalReceiver component attached:
- Select your receiver GameObject.
- Add a built-in Unity Signal Receiver component via the Inspector:
Inspector → Add Component → Signal Receiver.
Correct Setup (Unity built-in):
├── Signal Receiver (built-in Unity component)
└── SignalReceiverScript (implements INotificationReceiver)
Why: Unity’s Timeline signals usually rely on the built-in Signal Receiver component to route notifications to your script.
Instead of directly implementing INotificationReceiver, it might be simpler and clearer to use the built-in Signal Receiver component provided by Unity:
- Create a public method in your script to handle signals:
public class SignalReceiverScript : MonoBehaviour
public void HandleSignal()
Debug.Log("Signal received!");
- In the Unity Inspector, select your Signal Receiver component:
- Click ”+” → Select your Signal asset.
- Assign the method
HandleSignal() on your script as the callback.
Signals trigger only during Play mode when the Timeline is actively playing:
- Make sure you are in Play mode.
- Ensure your Timeline is playing correctly (use
PlayableDirector.Play() to start playback if needed).
✔️ Script correctly implements INotificationReceiver.
✔️ Attached to correct GameObject.
✔️ Built-in Unity SignalReceiver component also attached and configured.
✔️ SignalEmitter is properly configured in Timeline with valid Signal Asset.
✔️ Timeline is actively playing in Play Mode.
For best reliability, use Unity’s built-in SignalReceiver component:
- Attach built-in SignalReceiver component to your GameObject.
- Add your script as a callback method for signals (no need for
INotificationReceiver interface):
public class SignalReceiverScript : MonoBehaviour
public PlayableDirector playableDirector;
public void HandleSignal()
Debug.Log($"Signal received at exact Timeline time: {playableDirector.time}");
- Set this method (
HandleSignal) as the signal callback in the built-in Unity Signal Receiver component via Inspector.
If after following these steps your signals still don’t trigger, please provide additional details (screenshots or description) about your Timeline setup, GameObject hierarchy, and component configuration, and I’ll help further debug.