
# Objective `Entity::PLACEHOLDER` acts as a magic number that will *probably* never really exist, but it certainly could. And, `Entity` has a niche, so the only reason to use `PLACEHOLDER` is as an alternative to `MaybeUninit` that trades safety risks for logic risks. As a result, bevy has generally advised against using `PLACEHOLDER`, but we still use if for a lot internally. This pr starts removing internal uses of it, starting from observers. ## Solution Change all trigger target related types from `Entity` to `Option<Entity>` Small migration guide to come. ## Testing CI ## Future Work This turned a lot of code from ```rust trigger.target() ``` to ```rust trigger.target().unwrap() ``` The extra panic is no worse than before; it's just earlier than panicking after passing the placeholder to something else. But this is kinda annoying. I would like to add a `TriggerMode` or something to `Event` that would restrict what kinds of targets can be used for that event. Many events like `Removed` etc, are always triggered with a target. We can make those have a way to assume Some, etc. But I wanted to save that for a future pr.
651 B
651 B
title | pull_requests | |
---|---|---|
Observer Triggers |
|
Observers may be triggered on particular entities or globally.
Previously, a global trigger would claim to trigger on a particular Entity
, Entity::PLACEHOLDER
.
For correctness and transparency, triggers have been changed to Option<Entity>
.
Trigger::target
now returns Option<Entity>
and ObserverTrigger::target
is now of type Option<Entity>
.
If you were checking for Entity::PLACEHOLDER
, migrate to handling the None
case.
If you were not checking for Entity::PLACEHOLDER
, migrate to unwrapping, as Entity::PLACEHOLDER
would have caused a panic before, at a later point.