Object Lifecycle Events
These are the object lifecycle events which can run blocks.
All object-specific events use the On.* prefix.
The table shows how they map to object lifecycle events in the most popular game engines:
| LunyScript | Unity | Godot | Unreal |
|---|---|---|---|
On.Created |
Awake |
_init |
InitializeComponent |
On.Ready |
Start |
_ready |
BeginPlay |
On.Enabled |
OnEnable |
_enter_tree |
OnComponentActivated |
On.Disabled |
OnDisable |
_exit_tree |
OnComponentDeactivated |
On.Heartbeat |
FixedUpdate |
_physics_process |
TickComponent |
On.FrameUpdate |
Update |
_process |
TickComponent |
On.FrameLateUpdate |
LateUpdate |
N/A | TickComponent |
On.Destroyed |
OnDestroy |
N/A | UninitializeComponent |
On.Collision(2D).Started |
OnCollisionEnter(2D) |
body_entered |
OnComponentHit |
On.Collision(2D).Touching |
OnCollisionStay(2D) |
N/A | N/A |
On.Collision(2D).Ended |
OnCollisionExit(2D) |
body_exited |
N/A |
On.Trigger(2D).Entered |
OnTriggerEnter(2D) |
area_entered |
OnComponentBeginOverlap |
On.Trigger(2D).Overlapping |
OnTriggerStay(2D) |
N/A | N/A |
On.Trigger(2D).Exited |
OnTriggerExit(2D) |
area_exited |
OnComponentEndOverlap |
Notable exceptions using nouns/adjectives instead of following the past tense -ed and participle -ing rules:
- Frame events:
On.Heartbeat,On.FrameUpdate - The once-only event:
On.Ready
This is because On.Heartbeating, On.FrameUpdating and On.Readied seemed rather odd.
Note
Why "heartbeat"? I find that's where every engine has issues: FixedUpdate .. uh, what is 'fixed' here? Is Update() broken?? And _physics_process is too narrow: it's not (just) about physics.
The concept of a heartbeat is simple and relatable: It happens at a steady rate, most of the time. But it can also "skip a beat" (may not run every frame), or have an "extra beat" or even "race" (run multiple times per frame to catch up).