Use UnsafeWorldCell
to increase code quality for SystemParam
#8174
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Objective
The type
&World
is currently in an awkward place, since it has two meanings:This makes
&World
difficult to reason about, and surprising to see in function signatures if one does not know about the interior mutable property.The type
UnsafeWorldCell
was added in #6404, which is meant to alleviate this confusion by adding a dedicated type for interior mutable world access. However, much of the engine still treats&World
as an interior mutable-ish type. One of those places isSystemParam
.Solution
Modify
SystemParam::get_param
to acceptUnsafeWorldCell
instead of&World
. Simplify the safety invariants, since theUnsafeWorldCell
type encapsulates the concept of constrained world access.Changelog
SystemParam::get_param
now accepts anUnsafeWorldCell
instead of&World
. This type provides a high-level API for unsafe interior mutable world access.Migration Guide
For manual implementers of
SystemParam
: the functionget_item
now takesUnsafeWorldCell
instead of&World
. To access world data, use:.get_entity()
, which returns anUnsafeEntityCell
which can be used to access component data.get_resource()
and its variants, to access resource data.