Thank you for your interest in contributing. This document covers the process for submitting changes.
- Check existing issues to avoid duplicate work.
- For large changes (new features, architectural refactors), open an issue first to discuss the approach.
- Clone the repo into your UE project's
Plugins/folder. - Build third-party libraries:
cd third_party && .\build_all.ps1 - Regenerate project files and build.
- Verify the plugin loads in the Unreal Editor.
-
Fork the repository and create a branch from
main. -
Make your changes. Follow existing code style:
- UPROPERTYs use PascalCase (
Options,SimSpeedPercent) - Non-UPROPERTY private members use
m_prefix (m_model,m_data) - All
.hand.cppfiles must have the Apache 2.0 license header
- UPROPERTYs use PascalCase (
-
Build and verify compilation succeeds, then run the URLab automation suite. The
Scripts/build_and_test.{sh,ps1}helpers do both in one shot and print a summary block you paste straight into the PR template — with a UTC timestamp, your git HEAD, build status,passed / totalcounts, and a SHA-256 of the full test log. Close the Unreal editor first — live-coding holds the build mutex and the test runner silently returns an empty log against a locked project.Git-bash / WSL:
./Scripts/build_and_test.sh \ --engine "/c/Program Files/Epic Games/UE_5.7" \ --project "C:/path/to/your.uproject"PowerShell:
.\Scripts\build_and_test.ps1 ` -Engine 'C:\Program Files\Epic Games\UE_5.7' ` -Project 'C:\path\to\your.uproject'
Prefer that flow. If you only need to re-run a single step you can invoke
UnrealEditor-Cmd.exeorUnrealBuildTool.exedirectly — see the script source for the canonical flags. You can also run individual tests from the Session Frontend inside the editor. -
Test your changes in PIE (Play in Editor).
- Push to your fork and open a PR against
main. - Fill in the PR template. It asks for a summary, motivation, linked issue, and the build+test summary block produced by
Scripts/build_and_test.{sh,ps1}(see step 3 above). That block is the primary gate. - We spot-check every PR in the editor before merging, but because Unreal Engine projects can't use standard CI the pasted build + test output is the primary gate. A PR without them will bounce back for that evidence.
- Keep comments concise. The code should explain itself. Use comments only for non-obvious decisions.
- No TODO/FIXME comments — open an issue instead.
- New MJCF attributes should follow the pattern in
/add-mjcf-attribute(header property, ImportFromXml, ExportTo, test). - New component types should follow the existing pattern: subclass
UMjComponent, implementRegisterToSpec,ExportTo,ImportFromXml,Bind.
Use the issue templates to file a bug or a feature request. They collect the environment, reproduction steps, and logs we need upfront — filling them in properly is the fastest path to a fix.
By contributing, you agree that your contributions will be licensed under the Apache License 2.0.