Skip to content

feat: AttachableBehaviour and ComponentController #3518

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

Open
wants to merge 58 commits into
base: develop-2.0.0
Choose a base branch
from

Conversation

NoelStephensUnity
Copy link
Collaborator

@NoelStephensUnity NoelStephensUnity commented Jun 24, 2025

Depends on

This PR depends upon the fix for the SendTo.NotMe fix in #3551.

AttachableBehaviour and Support Components

The purpose of this PR (feat) is to address the complexity of "picking up" or "dropping" an item in the world which can become complex when using the traditional NetworkObject parenting pattern. In this PR there are three primary components added to help reduce this complexity:

  • AttachableBehaviour: Provides "out of the box" support for attaching (i.e. parenting) a nested child GameObject that includes an AttachableBehaviour component to another nested child GameObject with an AttachableNode component that is associated with a different NetworkObject.
  • AttachableNode: This component is required by the AttachableBehaviour component in order to be able to attach (i.e. parent) to another GameObject without having to parent the entire NetworkObject component the AttachableBehaviour component is associated with.
  • ComponentController: This component provides users the ability to synchronize the enabling or disabling of any Object derived component that has an enabled property.

This PR also incorporates a new "Helpers" subfolder under the NGO components folder where additional helper components will live.

Documentation Update

New Documentation

AttachableBehaviour

Network Components Section Update

image

New Foundational Components Section

image

New Helper Components Section

image

NetworkBehaviour.OnNetworkPreDespawn

Added another virtual method to NetworkBehaviour, OnNetworkPreDespawn, that is invoked before running through the despawn sequence for the NetworkObject and all NetworkBehaviour children of the NetworkObject being despawned. This provides an opportunity to do any kind of cleanup up or last micro-second state updates prior to despawning.

Changelog

  • Added: AttachableBehaviour helper component to provide an alternate approach to parenting items without using the NetworkObject parenting.
  • Added : AttachableNode helper component that is used by AttachableBehaviour as the target node for parenting.
  • Added: ComponentController helper component that can be used to synchronize the enabling and disabling of components and can be used in conjunction with AttachableBehaviour.
  • Added: NetworkBehaviour.OnNetworkPreDespawn that is invoked before running through the despawn sequence for the NetworkObject and all NetworkBehaviour children of the NetworkObject being despawned.

Documentation

  • Includes documentation updates:
    • Added new documentation section.
    • Refactored network components section.
    • Fixed some image links.

Testing & QA

Functional Testing

Manual testing :

  • Manual testing done
    • Asteroids AttachableBehaviour manual test PR-42

Automated tests:

  • Covered by existing automated tests
  • Covered by new automated tests

Does the change require QA team to:

  • Review automated tests?
  • Execute manual tests?

If any boxes above are checked, please add QA as a PR reviewer.

Backport

This is a v2.x only feature.

Adding AttachableBehaviour and ObjectController.
Renaming ObjectController to ComponentController.
Added some additional validation checking and handling.
Updated XML API.
Adding helpers meta.
Adding an AttachableNode as the target for AttachableBehaviour.
Refactoring AttachableBehaviour.
Adding new test for attachables.
Replacing any improperly spelled "detatch" with "detach".
XML API and private methods.
Minor XML API fixes.
Simplified the nameof AttachableBehaviour.Detach to just Detach.
Refactoring the ComponentController to provide more flexibility as well as being able to have component entries that will apply the inverse of the current ComponentController's current state....which allows for switching between different sets of components depending upon the controller's state.
Made some minor adjustments while writing the base test for ComponentController.
Adding the base ComponentController test.
switching to a Light component as opposed to BoxCollider as BoxCollider requires the physics package and we are just testing the functionality of ComponentController and not specifically any one other type of component.
Removing using directive.
Updating the change log entries.
@NoelStephensUnity NoelStephensUnity marked this pull request as ready for review July 10, 2025 19:43
@NoelStephensUnity NoelStephensUnity requested a review from a team as a code owner July 10, 2025 19:43
Removing debug log info.
Work in progress adjustments for usability under various scenarios.
Using RPCs and synchronizing the property being set using NetworkBehaviour.OnSynchronize in order to assure order of operations when it comes to messages.

Updated the ComponentController to be able to stagger state updates in the event this occurs (wip and I might remove this part and not allow changes to state until any pending state is finished).
Minor adjustment to the range for delays allow it to be zero.
Fixing spelling issues.
Had to make some minor adjustments in order to assure that users could handle sending any last micro-second tasks on any spawned instances prior to them despawning.

Added NetworkBehaviour.OnNetworkPreDespawn.
Did a slight order of operations on NetworkManager.Shutdown internal in order to assure sending RPCs during despawn would still work.

Minor adjustments to the new helper components associated with this PR.
Updating the AttachableBehaviourTests to include testing that an attachable will be automatically detatched upon despawning the AttachableNode it is attached to.
Updating the core components based on some bugs discovered during testing.
Updated the AttachableBehaviourTests to validate the different types of auto-detach flag combinations.
Fixed some spelling issues with "detatch" (not sure why I got into that habit)...corrected to "detach".
Adjusting the component section from a file and folder context.
Adjusting the component section for the table of contents.
Adding foundational components and helpers sub-sections to network components section.
Moved foundational components into the foundational (components) folder and updated links and image paths.
Adding AttachableBehaviour document along with images.
Added some place holders for AttachableNode and ComponentController.
Fixing some invalid image paths.
Removing white space at the end of lines.
Removing trickier white spaces...
@sentinel-u3d sentinel-u3d bot requested a review from EmandM July 30, 2025 17:50
Adding `AttachableNode` and `ComponentController` sections.
Added "Synchronized RPC driven fields" section to networkbehaviour-synchronize.md.
Updated various areas based on the additions.
Resolving more white space issues.
Removing a single sneaky white space.
@jabbacakes
Copy link
Contributor

jabbacakes commented Aug 1, 2025

Okay I just pushed a large docs commit, hear me out:

  • The only changes that need in-depth review are those to the three new helper components, it's mostly just tweaking wording, removing 'we' and other colloquialisms that are no bueno in the docs.
  • I also did a bunch of mass changes to convert all component names into regular, non-monospace. We've been inconsistent about that for a while, and I checked the style guide and it said do it that way. So FYI but you can ignore those changes throughout the wider docs, I just kept bumping into the inconsistency and it was driving me barmy.
    • For future reference, it's regular CamelCase for component names, and monospace for methods e.g. component.method.
  • Changed from foundational components -> core components, as discussed with Noel.

All in all, I think this is a really good body of doc to launch this feature with, and we can finesse it if/when we get user feedback about it.

@NoelStephensUnity
Copy link
Collaborator Author

@jabbacakes
I am still seeing some of the tail end portions of each section getting clipped by the Unity copyright footer.
image

Is this just the doc tool when building local or is this an issue we need to resolve?

NoelStephensUnity and others added 9 commits August 5, 2025 15:53
Applying modifications suggested by Emma.
Remove whitespace
Modifications from 1:1 PR review session with Emma.
Removed some redundant logic.
Re-organized a few areas for better readability.
Renamed the `AttachableBehaviour.AttachableNode` to  `AttachableBehaviour.InternalAttachableNode`.
Removed the authority check within `AttachableNode.OnNetworkPreDespawn`.
Final suggested modifications from 1:1 with Emma during PR review.
Copy link
Collaborator

@EmandM EmandM left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:godmode: 🥇

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants