-
-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Assets as Entities #11266
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
For historical context, this was (mostly) originally proposed by @cart, and detailed a bit in #8624.
|
Been poking around trying to think of ways to improve I'm not really sure where we are for accomplishing this, though. It appears that a decent chunk of the mentioned issues are solved now that we have required components, but I'm not entirely sure. |
I know this isn't possible yet, but I have been thinking about this myself and wanted to quickly highlight some things that this would make feasible. They mostly center around Cart's point: "Extensible. Users can add arbitrary component data to assets." Shiny Possibility 1: For item systems and other similar systems, item data could be kept modular. Storing health, damage, price, element, model, etc in components is much much more elegant that in a monolithic asset struct. This is especially true if modders want to add their own data to an item. Shiny Possibility 2: Data could be added to assets as they are spawned/added. For example, when a new mesh is added, an AABB component could be attached to it. This could be much faster than generating AABBs when a Mesh is inserted into an entity (as I believe is done now). Many similar performance advantages may exist. |
One thing that worries me about that first idea (@ElliottjPierce) is that it really restricts what we can do with assets in async contexts. My PR #15813 would allow us to use assets in async, but having all the asset data be just directly on an entity would basically make that impossible. I don't think "monolothic" assets are bad since that's kinda how they are loaded today. I do think adding computed data to assets would be pretty cool though! |
I've written a write-up about the principles I think we should follow when doing *-as-entities refactors like this: https://hackmd.io/@bevy/SypE1qZP1l |
That is well written and I completely agree after reading it.
I hadn't thought about async implications. I think you're right that async should take priority here; that's kinda important. However, I don't love the idea of monolithic assets still. My primary concern is being able to add arbitrary data (component-like) to arbitrary assets (entity-like). For example, if item types were represented as monolithic assets, and a modder wanted to add a trading mechanic, they should be able to attach price data to assets that represent items. This would be super ergonomic with ECS, but there may be better ways of doing this. Async should be the higher priority for assets, but if this functionality could work alongside it that would be awesome. I'm no asset expert, so I trust ya'll's opinions. Just throwing it out there. |
What problem does this solve or what need does it fill?
The current asset system is stored in a single resource
Assets
. This means we need a bespoke ID system for assets, events to report changes to assets, different patterns for adding/removing assets, etc.What solution would you like?
We can unify assets more tightly with the ECS by turning assets into entities.
Asset<MyAsset>
component.Entity
s (or a wrapper aroundEntity
).AssetLifetime
component. Handles would refer to the same reference count and a system would check for assets with a ref count of 0 to despawn that entity.Possible issues
apply_deferred
(although at least we can get the entity ID immediately so this is not too bad of an issue).AssetLifetime
ref count, it doesn't matter the type. Treating the same entity as a mesh and an image would just be 2 references.Assets
resource, it's fairly hard to have unmanaged assets. Does this matter? For example, you can do weird things without the right systems with events (never clearing, for example). This would just be more of that.What alternative(s) have you considered?
Keep the system the same. The resource approach is very workable and is pretty nice to use. There are great guard rails (the types are very strong) and it's fairly hard to "break" it.
Additional context
This isn't originally my idea, I'm not sure whose it is though. I just remember hearing about this on Discord and wanted to document this.
The text was updated successfully, but these errors were encountered: