Extension for Unity Timeline Signals, supporting manual Evaluate triggering, reverse playback, and pure C# signal logic without MonoBehaviour.
- Evaluate Support: Signals can be triggered even when manually evaluating the Timeline (not just during playback).
- Reverse Playback: Supports triggering signals when the timeline is played in reverse.
- Pure C# Logic: Supports
ISignalExecutableinterface for logic that doesn't need to inherit fromMonoBehaviour(Executable Mode). - No SignalAsset Required: Simplifies workflow by removing the need for
SignalAsset. - Binding Support: Easy binding to
MonoBehaviourevents using Signal Names.
This mode allows you to execute custom C# logic directly from the Timeline without needing a MonoBehaviour receiver for every signal.
- Create an ExSignalExecutableTrack in your Timeline.
- Add an ExSignal Executable Emitter to the track.
- In the Inspector of the Emitter, you can add one or more scripts that implement
ISignalExecutable.
Example ISignalExecutable:
using UnityEngine;
using UnityEngine.Playables;
using Unifan.ExTimelineSignal;
using System;
[Serializable]
public class MyCustomSignal : ISignalExecutable
{
public void Execute(PlayableDirector director, ExSignalEmitter emitter)
{
Debug.Log($"Signal triggered at time: {emitter.time}");
}
}This mode is similar to the standard Signal Receiver but uses string-based keys (Marker Name) to bind actions, which is more flexible.
- Create an ExSignalBindingTrack in your Timeline.
- Add an ExSignal Emitter (the base emitter) to the track.
- Name the Emitter (e.g., "AttackStart"). This name is the Key.
- On the GameObject with the
PlayableDirector, add the ExSignalReceiverBinding component. - Bind the track to the GameObject (same object).
- In your code, register the action:
using UnityEngine;
using Unifan.ExTimelineSignal;
public class MyCharacter : MonoBehaviour
{
void Start()
{
var receiver = GetComponent<ExSignalReceiverBinding>();
// Bind the action to the signal named "AttackStart"
receiver.RegisterAction("AttackStart", OnAttackSignal);
}
void OnAttackSignal(ExSignalReceiverBinding receiver, ExSignalEmitter emitter)
{
Debug.Log("Attack Started!");
}
}