Hi!

I’ve been learning Bevy and LOVING IT, there’s only one thing confusing me. Many components appear to be created magically even if not specified in the Bundle passed to commants.spawn.

For example, when I spawn just a Sprite component, the entity seems to automatically get a Transform component, even if I didn’t give it one.

Similarly, this example spawns a Screenshot component, which apparently results in a Capturing component that can be queried later.

Are these “implicit” components documented somewhere? I took a short look at the TransformPlugin for example but I can’t seem to figure out where these components come from.

Thanks y’all!

  • LuciferMorningWood@lemm.ee
    link
    fedilink
    arrow-up
    7
    ·
    edit-2
    11 days ago

    It’s a feature called required components. Basically, you can use #require(components list here) attribute to say that when a component is inserted, also insert required components. I don’t know if there’s a documentation for it, or specifically what component requires what, personally when I’m looking for required components I’m looking at component’s source and they’ll be listed there (Sprite, for example https://docs.rs/bevy_sprite/0.16.0/src/bevy_sprite/sprite.rs.html#20)

    Note that required components work recursively: when component requires a component that has it’s own requirements, they’ll also be inserted

    • TehPers@beehaw.org
      link
      fedilink
      English
      arrow-up
      2
      ·
      10 days ago

      The required components are documented in the component impl block. Scroll down in docs.rs until you find impl Component and they’ll show up there.

      Apparently there were issues getting required components to show up at the top of the page (from my understanding anyway), so for now they live there.

    • PotatoesFall@discuss.tchncs.deOP
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      11 days ago

      Ah, that’s it! Thank you so much.

      I was digging through the systems functions, totally forgot to just look at the attributes. Not that experienced with rust yet :P

  • CodexArcanum@lemmy.dbzer0.com
    link
    fedilink
    English
    arrow-up
    3
    ·
    11 days ago

    I’m not a bevy user but I’m writing a game in Rust so maybe I can help…

    Looking at the docs for Screenshots in particular, it definitely looks like that system uses a few “marker” components to track state while making the screen capture.

    Digging deeper into the source for the Screenshot component struct we can see what method it uses to attach these markers, and a little further into the function it uses the markers to find the screenshot entity and remove it.

    I’m not sure about Sprite but probably something in the rendering system looks for and maybe applies a Transform when components are nested or added to world space? I also don’t know if Bevy has a formal component hierarchy but something like that may be in play here with Sprite being a child or implementor of Transform, but that’s just speculation on my part.

    Hope that helps, maybe seeing how Screenshot does it will help you search in the source for Sprite to see where the Transforms are injected?

    • PotatoesFall@discuss.tchncs.deOP
      link
      fedilink
      arrow-up
      2
      ·
      11 days ago

      Thanks so much!

      I just managed to find the place where the Capturing component gets added, it’s part of the extract_screenshots system in the ScreenshotPlugin.

      For Sprite, another user found where this originates from, it’s the require attribute.

      • CodexArcanum@lemmy.dbzer0.com
        link
        fedilink
        English
        arrow-up
        3
        ·
        11 days ago

        Nice! Glad you worked it out!

        I got so excited to see a Bevy post (in the Bevy community even!) I really want to see the gamedev community here pick up and exceed reddit, SO, and other company-owned gaming forums.