mcpField
B
bevy-porting

bevy-porting

github.com/chrisgliddonDevelopment2674 installsUpdated 9w ago
Repository

About bevy-porting

bevy-porting is a porting guide for developers moving games from other engines to Bevy 0.19. It combines engine-specific references with scripts that inventory and extract source project data without installing the source engine.

Key features

  1. 01Guidance for ten source engines
  2. 02Unity subsystem porting references
  3. 03Python asset and scene inventory scripts
  4. 04Bevy ECS and timestep porting principles
  5. 05Build pipeline migration guidance

Use cases

  1. 01Assessing whether an engine feature has a Bevy equivalent
  2. 02Planning a game port around a playable slice
  3. 03Extracting source project assets and scene data
  4. 04Replacing engine build settings with Cargo configuration

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/chrisgliddon/bevy-skills --skill bevy-porting

After installing, type/bevy-portingin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
cocos.md
defold.md
flash-swf.md
gamemaker.md
godot.md
javascript.md
phaser.md
roblox.md
unity-animation.md
unity-architecture.md
unity-assets.md
unity-audio.md
unity-build.md
unity-input.md
unity-scenes-gltf.md
unity-ui.md
unreal.md
scripts/flash/
swf_assets.py
scripts/gamemaker/
gms2_inventory.py
scripts/godot/
tscn_inventory.py
scripts/roblox/
rbxlx_inventory.py
scripts/unity/
animation_extractor.py
asset_audit.py
prefab_inspector.py
scene_inventory.py
scripts/unreal/
ue5_python_export.py

Details

From the project README

Bevy 0.19 — Porting from other engines

When to use this skill

  • Starting a port of an existing game from Unity, Unreal, Godot, Cocos, vanilla JavaScript / Phaser, Flash/SWF, Defold, Roblox, or GameMaker into Bevy 0.19.
  • Evaluating feasibility — does my engine's feature X have a Bevy 0.19 equivalent?
  • Deciding which subsystem to port first (we recommend: rendering + a single playable slice).
  • Extracting asset and scene data from the source engine's project tree without needing the source engine installed — see the scripts/ policy below.
  • Replacing engine-specific build pipelines (Unity Build Settings, Unreal Build Configuration, etc.) with cargo + Cargo.toml features.

Engine coverage

EngineCoverageScripts
UnityDeep (8 subsystem refs) — see § Unity below4 Python extractors in scripts/unity/
Unreal Engine 5references/unreal.md — Actor/Component → ECS, UMG → bevy_ui, Niagara/animation gapsscripts/unreal/ue5_python_export.py (drops into UE5 editor)
Godot 4references/godot.md — node-tree → ECS, .tscn text format, GDScript → Rustscripts/godot/tscn_inventory.py (stdlib, no Godot needed)
Cocos Creator 3references/cocos.md — TypeScript node-tree → ECS, JSON .scene/.prefabinline Python recipe in the reference
Vanilla JavaScript / Canvas / HTML5references/javascript.md — class+rAF loops → ECS systems, Canvas 2D → Sprite— (port is a rewrite, not extraction)
Phaser 3references/phaser.md — Scene/preload/update → systems, Arcade physics, tweens—
Flash / SWFreferences/flash-swf.md — ffdec-based extraction, AS3 → Rust rewritescripts/flash/swf_assets.py (requires ffdec on PATH)
Defoldreferences/defold.md — message-passing → Bevy Messages, Lua → Rust, 2D-firstinline Python recipe in the reference
Robloxreferences/roblox.md — Instance tree → ECS, asset-ID extraction, Luau → Rustscripts/roblox/rbxlx_inventory.py (XML .rbxlx only)
GameMaker Studio 2references/gamemaker.md — Object events → systems, JSON project filesscripts/gamemaker/gms2_inventory.py (stdlib, walks .yyp)

Unity (priority)

Unity is the deepest-covered engine. The eight subsystem references and four extraction scripts together cover an end-to-end port:

SubsystemReferenceBevy primitives
Architecture (GameObject, MonoBehaviour, ScriptableObject, coroutines)references/unity-architecture.mdEntity + ChildOf, Component + System, Asset/Resource, async tasks
Asset pipeline (Prefab, Material, Addressables, GUIDs)references/unity-assets.mdBundle/spawn fn, StandardMaterial, AssetServer + Handle<T>
Scene → glTF extractionreferences/unity-scenes-gltf.mdbevy_gltf, WorldAssetRoot, glTFast / Blender bridge
Animator / Mecanimreferences/unity-animation.mdAnimationGraph, AnimationTransitions::play, #[derive(AnimationEvent)]
Input Systemreferences/unity-input.mdButtonInput, Axis, Touches, Gamepad*
UGUI / UI Toolkitreferences/unity-ui.mdNode, BackgroundColor, BorderColor, Taffy/flex
Audio (AudioSource, AudioListener, mixers)references/unity-audio.mdAudioPlayer, SpatialListener, bevy_audio
Build / deploy (Build Settings, IL2CPP, WebGL)references/unity-build.mdcargo build --target, Cargo.toml features, WASM

Extraction scripts (all stdlib-Python, no Unity install required):

ScriptWhat it does
scripts/unity/scene_inventory.pyParse .unity YAML → JSON inventory of GameObjects + transforms + components
scripts/unity/prefab_inspector.pyParse .prefab YAML → component graph per prefab
scripts/unity/animation_extractor.pyParse .anim YAML → keyframe JSON, formatted for AnimatableKeyframeCurve::new([...])
scripts/unity/asset_audit.pyWalk Assets/ → inventory by type, size, GUID, and (optionally) dependency graph

Run each script with --help to see all flags. Each script's docstring points to the matching reference.

General porting principles

These show up regardless of source engine:

  1. The ECS shift. Engines other than Bevy mostly use a scene-graph + scripts model (one class = data + behaviour on one node). Bevy is data-oriented: data lives in Components, behaviour in free fn Systems. Don't try to recreate MonoBehaviour / Actor / Node as one Rust struct; split it.
  2. Port the smallest playable slice first. A single character moving in a single scene with one input + one animation. Once that compiles and runs, the rest is iteration. Avoid trying to "port everything in parallel."
  3. Asset pipelines are the long pole. Code ports faster than assets. Schedule asset extraction first; have a content pipeline producing glTF + KTX2 + audio formats before you start writing gameplay code.
  4. Fixed-timestep mindset. Most engines hide the variable-vs-fixed timestep choice. Bevy makes it explicit: deterministic simulation belongs in FixedUpdate, frame-driven main-world presentation belongs in Update, and renderer work belongs in render schedules. Interpolate with Time<Fixed>. Decide early which systems live where — see bevy-core-concepts and bevy-animation/references/procedural-animation.md.
  5. Coordinate-system flips. Unity is left-handed Y-up; Unreal is left-handed Z-up; Godot is right-handed Y-up; Bevy is right-handed Y-up (matches glTF). Most exporters handle the flip; spot-check by importing a scene with a known-asymmetric directional asset and confirming it isn't mirrored.

Scripts policy

scripts/<engine>/ contains runnable, single-file Python helpers that extract data from the source engine's project tree. The convention for this collection:

  • Stdlib-only when possible. Unity's YAML is parsed with re not pyyaml — easier to install.
  • No source engine required. All Unity scripts read text-format .unity/.prefab/.anim/.meta files directly. Engines whose files are binary (Roblox .rbxl, parts of GMS2) get a recipe in their reference instead.
  • Inventory + extraction, not auto-conversion. None of these scripts produce a Bevy project. They give you JSON so you (or a downstream tool) know what to port. Treat them as tree + file + stat for game projects.
  • Reference-backed. Each script names its matching reference in its top-of-file docstring.

Gotchas

  • One-shot ports don't work. Allocate time proportional to your project's content size, not its code size.
  • Prefab semantics don't transfer. Unity's "Prefab + Variant + Nested Prefab" inheritance has no direct Bevy equivalent. Bake to glTF for visual prefabs; write spawn functions for data prefabs.
  • Animation retargeting is engine-specific. Mecanim Humanoid retargeting in particular has no out-of-the-box Bevy equivalent — see references/unity-animation.md.
  • Coordinate-system flips silent-fail. Most exporters handle them, but always spot-check.
  • Editor scripts are out of scope. Unity [CustomEditor], Unreal Blueprints' editor tooling, Godot tool scripts — none translate. Bevy's editor story is in flux; for porting, runtime-only.
  • Don't replicate engine-internal IDs. Unity GUIDs, Unreal FNames, Godot RIDs, Roblox InstanceIDs — these are sidecar metadata only useful during extraction. Bevy uses path-based handles and ECS entity IDs.
  • Pin physics integrations to Bevy 0.19. Current compatible lines are bevy_rapier2d/bevy_rapier3d 0.36 and avian2d/avian3d 0.7. Physics is separate from rendering; see bevy-rendering before choosing headless or debug-render features.

See also

  • bevy — router; pins Bevy 0.19 and indexes every sibling skill.
  • bevy-animation — AnimationGraph, AnimationTransitions, #[derive(AnimationEvent)]. Cross-linked from unity-animation.md.
  • bevy-ui — Node + Taffy/flex model. Cross-linked from unity-ui.md.
  • bevy-cargo-features — replaces Unity Build Settings / PlayerSettings.
  • bevy-wasm-webgpu — Unity WebGL → wasm32 / WebGPU port story.
  • bevy-cameras — RenderTarget components and camera modes; close to Unity's Camera component.
  • bevy-rendering — renderer selection and the physics/rendering boundary.
  • bevy-physics — Rapier bodies, colliders, controllers, queries, and fixed-step integration.
  • bevy-migration-0-17-to-0-18 — useful if you find a tutorial pinned to a pre-0.18 release.

Comments

Markdown supported