Unity or Unreal → Godot 4

Your next game.
A new home in Godot.

Look up the Godot name for anything you already use, then see how Godot puts it together. Every row links to the code on both sides.

Quick answers

What is it called in Godot?

Code for every row

Core Objects

UnityUnrealGodot
GameObjectActorNode A Godot scene is a tree of typed Nodes; there is no empty container you bolt components onto.
PrefabBlueprint ClassPackedScene (.tscn) A saved scene is Godot's prefab: instance it at runtime or drop it into another scene.
Component (MonoBehaviour)Actor ComponentChild Node Composition happens by adding typed child nodes to the tree, not by attaching components to a container object.
TransformTransform / SceneComponentNode2D / Node3D position, rotation, scale Node2D and Node3D each carry position, rotation, and scale directly — there is no separate Transform component to fetch first.
Empty GameObjectEmpty Actor / Scene ComponentNode / Marker2D / Marker3D Use a bare Node for a non-visual container, or Marker2D/Marker3D when you also want the editor gizmo for a reference point.

Lifecycle

UnityUnrealGodot
Update()Event Tick_process(delta) Per-frame logic; use _physics_process for physics-step logic.
Awake()Constructor_init() _init() runs when the object is constructed, before it enters the scene tree — child nodes and @onready vars aren't ready yet.
Start()BeginPlay_ready() _ready() fires once a node and all its children have entered the scene tree — the right place for @onready-dependent setup.
FixedUpdate()Tick (substepped) / TickComponent_physics_process(delta) Runs on the fixed physics tick — put movement, collision, and RigidBody-adjacent code here instead of _process.
OnDestroy()EndPlay_exit_tree() Fires when the node is removed from the scene tree — the place to disconnect signals or release external resources.
OnEnable() / OnDisable()SetActorHiddenInGame / SetActorTickEnabledtree_entered / tree_exiting / visibility_changed There's no direct enable/disable callback pair; hook tree_entered/tree_exiting for lifecycle, or visibility_changed for show/hide-driven logic.

Scripting

UnityUnrealGodot
GetComponent<T>()FindComponentByClassget_node() / typed @onready Reference named child nodes directly instead of searching by type at runtime.
Coroutine / yield WaitForSecondsSet Timer by Eventawait / SceneTreeTimer await a signal or a scene-tree timer instead of an IEnumerator coroutine.
UnityEvent / C# eventEvent Dispatchersignal Declare a signal, emit it, and connect listeners — no manual unsubscribe needed.
MonoBehaviourAActor / UActorComponent base classA script attached to a typed Node There's no universal base behavior class — any GDScript file that extends a Node subclass becomes that node's behavior.
Instantiate()SpawnActorPackedScene.instantiate() Load or @export a PackedScene, call instantiate(), then add_child() it into the tree.
Destroy()DestroyActor / K2_DestroyActorqueue_free() queue_free() frees the node at the end of the current frame; use free() only when you need it gone immediately and know it's safe.
SendMessage()Event Dispatcher / Interface Callsignal.emit() or a direct method call SendMessage's stringly-typed broadcast has no direct match — prefer a declared signal, or call a method directly if you hold a reference.
Invoke() / InvokeRepeating()Set Timer by Function NameSceneTreeTimer / Timer node One-shot delayed calls use get_tree().create_timer(...).timeout; recurring calls use a Timer node with autostart and wait_time.
[SerializeField]UPROPERTY(EditAnywhere)@export @export exposes a typed variable to the Inspector and to scene/resource serialization.
static class (Singleton pattern)Game Instance / UGameInstanceSubsystemAutoload singleton Register a script as an Autoload (Project Settings) and it becomes a globally-accessible node singleton — no static-field workaround needed.

Physics

UnityUnrealGodot
Rigidbody / Rigidbody2DUPrimitiveComponent (Simulate Physics)RigidBody2D / RigidBody3D Full physics-simulated bodies; apply forces/impulses instead of setting position directly.
CharacterControllerCharacter Movement ComponentCharacterBody2D / CharacterBody3D + move_and_slide() Set the velocity property, then call move_and_slide() — it reads and writes the velocity property itself.
OnCollisionEnter()OnComponentHit / NotifyHitbody_entered signal Connect the body_entered signal on the physics body instead of overriding a collision callback.
OnTriggerEnter()OnComponentBeginOverlaparea_entered / body_entered on Area2D/3D Areas are Godot's trigger volumes — connect body_entered or area_entered instead of flagging a collider IsTrigger.
LayerMaskObject/Collision Channelcollision_layer / collision_mask collision_layer declares what a body IS; collision_mask declares what it SCANS for — both are 32-bit flag sets.
Physics.Raycast()LineTraceSingleByChannelRayCast2D/3D node or PhysicsDirectSpaceState.intersect_ray() Use a RayCast node for continuous checks, or build a PhysicsRayQueryParameters and call intersect_ray() for one-off queries.
Physics.OverlapSphere() / CheckSphere()SphereOverlapActorsShapeCast2D/3D or PhysicsDirectSpaceState.intersect_shape() ShapeCast nodes sweep a shape continuously; intersect_shape() does a one-off query with a PhysicsShapeQueryParameters.

Input

UnityUnrealGodot
Input.GetAxis() / GetAxisRaw()Get Input Axis ValueInput.get_vector() get_vector() combines two axes into a single deadzone-normalized Vector2 in one call.
Input.GetButtonDown()Action Mapping (Pressed event)Input.is_action_just_pressed() True for exactly one frame — the frame the mapped action was pressed.
Input System package (Action Maps)Enhanced Input (Input Action Assets)Input Map (Project Settings) + InputMap/InputEvent Define named actions in Project Settings -> Input Map, then read them with the Input singleton — no separate asset/context system needed.

Animation

UnityUnrealGodot
Animator / Animator ControllerAnim Blueprint / State MachineAnimationTree + AnimationNodeStateMachine An AnimationTree with a state-machine root replaces the Animator Controller's states and transitions.
Blend TreeBlend SpaceAnimationNodeBlendSpace1D / 2D BlendSpace1D blends along one parameter (e.g. speed); BlendSpace2D blends across two (e.g. move direction).
Animation ClipAnimation SequenceAnimationPlayer track (Animation resource) An AnimationPlayer holds named Animation resources with keyed tracks — play them by name.
—Anim BlueprintAnimationTree An Anim Blueprint's event graph plus state machine maps to an AnimationTree paired with a regular GDScript for logic.

Assets & Resources

UnityUnrealGodot
ScriptableObjectData Asset / DataTableResource (.tres) Subclass Resource with @export vars for data-driven, savable assets.
Addressables—ResourceLoader.load_threaded_request() Background-load a resource by path, then poll status and fetch it once ready — no addressable asset groups to configure.
Resources.Load()StaticLoadObject / ConstructorHelperspreload() / load() preload() resolves at parse time (path must be a literal); load() resolves at runtime, like a dynamic Resources.Load call.
Material (Standard Shader)Material InstanceStandardMaterial3D StandardMaterial3D exposes the built-in PBR shader's parameters without writing shader code.
—Material EditorShaderMaterial + VisualShader VisualShader gives a node-graph editor like Unreal's Material Editor; ShaderMaterial is what you assign once the graph (or raw shader code) is authored.

Scenes & Loading

UnityUnrealGodot
SceneManager.LoadScene()Open Levelget_tree().change_scene_to_file() Swaps the entire current scene tree for a new one loaded from a .tscn path.
Additive Scene LoadingSub-Level StreamingInstance a PackedScene and add_child() it There's no separate additive-load API — instancing a scene and parenting it into the running tree is inherently additive.
DontDestroyOnLoad()Game Instance (persists across levels)Autoload singleton Autoload nodes live outside the current scene and survive scene changes automatically — nothing to mark persistent.
—LevelScene (.tscn) A Godot 'scene' can be an entire level, a prefab-like reusable piece, or a single node — Levels map to top-level scenes loaded via change_scene_to_file().

Audio

UnityUnrealGodot
AudioSourceAudio ComponentAudioStreamPlayer / 2D / 3D Pick the flavor by dimensionality: plain AudioStreamPlayer for UI/music, 2D or 3D for positional sound.
AudioListenerAudio Listener (on Camera)AudioListener2D/3D (falls back to the current Camera) If no AudioListener2D/3D is made current, the active Camera acts as the listener; add one explicitly to decouple hearing position from the camera.

Networking

UnityUnrealGodot
[ServerRpc]/[ClientRpc] (Netcode) / Command/ClientRpc (Mirror)—@rpc annotation Annotate a method with @rpc(...) and call it directly — the annotation configures authority, reliability, and call mode.
NetworkVariable<T> / SyncVar—MultiplayerSynchronizer List properties in a MultiplayerSynchronizer's replication config instead of wrapping each field in a NetworkVariable type.
NetworkObject.Spawn()—MultiplayerSpawner A MultiplayerSpawner watches a parent node and auto-replicates scenes instanced under it to peers.
—Replication (bReplicates / UPROPERTY(Replicated))MultiplayerSynchronizer + @rpc Combine a MultiplayerSynchronizer for property replication with @rpc-annotated methods for replicated function calls.

UI

UnityUnrealGodot
uGUI CanvasUMG WidgetControl node + Containers Build UI from Control nodes; a reusable widget is just a saved Control scene, styled with a Theme.

Misc

UnityUnrealGodot
Time.timeScaleSetGlobalTimeDilationget_tree().paused + Node.process_mode Pausing stops _process/_physics_process on pausable nodes; set a node's process_mode to PROCESS_MODE_ALWAYS to keep it running while paused.
Time.deltaTimeDeltaTime (Tick parameter)the delta parameter _process and _physics_process each receive delta as an argument instead of a global property.
Camera.main—get_viewport().get_camera_2d() / get_camera_3d() There's no global 'main camera' singleton — ask the viewport for its current camera, and it can return null.
Debug.Log()UE_LOGprint() print() writes to the Output panel/stdout; print_debug() additionally appends the calling function and line.
PlayerPrefsSaveGame (USaveGame)ConfigFile ConfigFile reads/writes simple section/key/value data to disk — a lightweight PlayerPrefs-style store for small settings and save data.
Tag / CompareTag()Actor TagsGroups (add_to_group / is_in_group) Groups are Godot's tag system — a node can belong to many groups at once, unlike Unity's single-tag-per-object default.
—GameMode / Game Mode BaseAutoload singleton There's no built-in GameMode concept; an Autoload script holding rules and state (turn order, win conditions) fills the same role.
—Enhanced Input (Input Actions / Mapping Contexts)Input Map (Project Settings) actions Godot's Input Map plays the same role as an Enhanced Input Action plus Mapping Context pair, without a separate context-priority stack.
—Cast To (Blueprint) / Cast<T>as / is `as` performs a safe downcast that returns null on failure; `is` just tests the type without casting.
—UDataTableArray of Resource instances or Dictionary Model row-based data as an array of custom Resource instances (or a Dictionary keyed by id) instead of a DataTable asset plus row struct.
How Godot works

Ten ideas, side by side

Each card draws one idea the Unity way, the Unreal way and the Godot way, then says in a sentence what changes. The links go to the article that explains it and to the code in the dictionary.

Objects are node trees

Each component becomes its own child node, and the root node’s type (here CharacterBody2D) decides what the object is.

Unity GameObject + components
  • Player (GameObject)
  • Transform
  • SpriteRenderer
  • BoxCollider2D
  • PlayerController script
Unreal Actor + components
  • BP_Player (Actor)
  • CapsuleComponent
  • SkeletalMeshComponent
  • CharacterMovementComponent
Godot A tree of typed nodes
  • Player · CharacterBody2D + player.gd
  • Sprite2D
  • CollisionShape2D

Code side by side: GameObject → NodeComponent (MonoBehaviour) → Child NodeTransform → Node2D / Node3D position, rotation, scale

One script per node

A node carries one script and the script extends that node’s type; split behaviour into child nodes instead of stacking scripts.

Unity Many MonoBehaviours
  • Player (GameObject)
  • Movement : MonoBehaviour
  • Health : MonoBehaviour
  • Shooter : MonoBehaviour
Unreal Actor and Component classes
  • BP_Player (Actor)
  • HealthComponent (Actor Component)
  • WeaponComponent (Actor Component)
Godot A script extends its node
  • Player · CharacterBody2D + player.gd
  • Health · Node + health.gd
  • Gun · Node2D + gun.gd

Code side by side: MonoBehaviour → A script attached to a typed Node[SerializeField] → @exportGetComponent<T>() → get_node() / typed @onready

The frame loop

_ready() runs once the node and its children are in the tree, and delta arrives as a parameter instead of a global.

Unity Event functions
  1. Awake()
  2. Start()
  3. Update() / FixedUpdate()
  4. OnDestroy()
Unreal Actor lifecycle
  1. Constructor
  2. BeginPlay
  3. Tick
  4. EndPlay
Godot Virtual methods
  1. _init()
  2. _ready()
  3. _process(delta) / _physics_process(delta)
  4. _exit_tree()

Code side by side: Awake() → _init()Start() → _ready()Update() → _process(delta)FixedUpdate() → _physics_process(delta)OnDestroy() → _exit_tree()

Signals connect things

Signals are built in: declare one, connect it in code or in the Node dock, and emit it; the emitter never needs to know who listens.

Unity UnityEvent / C# event
  1. Declare the event
  2. Listener subscribes
  3. Invoke()
Unreal Event Dispatcher
  1. Add an Event Dispatcher
  2. Bind an event to it
  3. Call it
Godot signal
  1. signal health_changed
  2. connect() in code or the Node dock
  3. health_changed.emit()

Code side by side: UnityEvent / C# event → signalSendMessage() → signal.emit() or a direct method call

Resources hold data

A custom Resource is the ScriptableObject: give it @export fields, save .tres files and load them like any other asset.

Unity ScriptableObject
  • ItemData : ScriptableObject
  • Saved as an .asset
  • Edited in the Inspector
Unreal Data Asset / DataTable
  • UPrimaryDataAsset or a DataTable
  • Saved in the Content Browser
  • Edited in the Details panel
Godot Custom Resource
  • class_name ItemData extends Resource
  • Saved as a .tres
  • Edited in the Inspector

Code side by side: ScriptableObject → Resource (.tres)UDataTable → Array of Resource instances or Dictionary

Autoloads are the managers

An autoload is a node Godot adds above every scene at startup, so it survives scene changes without any singleton code.

Unity Singleton manager
  • GameManager : MonoBehaviour
  • static Instance
  • DontDestroyOnLoad()
Unreal GameInstance
  • GameInstance
  • GameInstance Subsystem
  • Lives across level loads
Godot Autoload
  • game_state.gd
  • Project Settings → Globals → Autoload
  • Reached as GameState from any script

Code side by side: DontDestroyOnLoad() → Autoload singletonstatic class (Singleton pattern) → Autoload singletonGameMode / Game Mode Base → Autoload singleton

Input is named actions

Name actions once in the Input Map and bind keys and buttons there; code asks for actions, never for keys.

Unity Input System
  1. Input Actions asset
  2. Action Map: Move, Jump
  3. Read the action in code
Unreal Enhanced Input
  1. Input Action + Mapping Context
  2. Add the context for the player
  3. Bind the action
Godot Input Map
  1. Project Settings → Input Map
  2. Actions: move_left, jump
  3. Input.is_action_pressed("jump")

Code side by side: Input System package (Action Maps) → Input Map (Project Settings) + InputMap/InputEventInput.GetAxis() / GetAxisRaw() → Input.get_vector()Input.GetButtonDown() → Input.is_action_just_pressed()

Pick the body by who moves it

RigidBody for physics, CharacterBody for your own movement code, StaticBody for walls and Area for triggers, filtered by collision layers.

Unity Rigidbody, CharacterController
  • Rigidbody: physics moves it
  • CharacterController: your code moves it
  • Collider with Is Trigger
Unreal Physics and movement components
  • Simulate Physics on a component
  • Character Movement Component
  • Overlap events on a component
Godot Physics bodies
  • RigidBody2D/3D: physics moves it
  • CharacterBody2D/3D + move_and_slide()
  • Area2D/3D for triggers

Code side by side: Rigidbody / Rigidbody2D → RigidBody2D / RigidBody3DCharacterController → CharacterBody2D / CharacterBody3D + move_and_slide()OnTriggerEnter() → area_entered / body_entered on Area2D/3DLayerMask → collision_layer / collision_mask

UI is Control nodes

Anchors pin a Control to the screen, and Container nodes lay out their children for you.

Unity uGUI
  • Canvas
  • RectTransform anchors
  • Layout Group components
Unreal UMG
  • Widget Blueprint
  • Canvas Panel anchors
  • Horizontal / Vertical Box
Godot Control nodes
  • HUD · CanvasLayer
  • MarginContainer
  • HBoxContainer
  • Label, Button

Code side by side: uGUI Canvas → Control node + Containers

Read next

Migration articles

All articles
Practice

Where are you coming from?

Each path includes scene-building, code comparisons, small experiments, and steps to try in Godot.

Before you start

What moves, and what you rebuild

A migration is rarely blocked by code. It is blocked by the two or three things that turn out to have no equivalent, found in month three. This is what carries across a Unity or Unreal project, using Godot 4.7 as the target. Moves means the file itself is reusable after a re-import. Rebuilt means the concept maps cleanly but the asset is authored again. Rewritten means there is no equivalent file to bring.

AssetUnityUnrealGodot 4.7Verdict
Models and meshesFBX, OBJ, .blendFBX, static and skeletal meshesglTF 2.0 is the first-class format; FBX needs conversionMoves
Textures and audioPNG, TGA, WAV, OGGPNG, TGA, WAVPNG, WebP, JPG, WAV, OGG, MP3Moves
Animation clipsAnimator controllerAnimation BlueprintClips arrive with the model; AnimationPlayer and AnimationTree drive themRebuilt
Reusable objectsPrefabs and variantsBlueprint classesScenes (.tscn), inherited scenes for variantsRebuilt
Tuning dataScriptableObjectData Asset, Data TableResource (.tres) — the closest one-to-one conceptRebuilt
Gameplay codeC# MonoBehaviourC++ and Blueprint graphsGDScript, or C# with Godot APIsRewritten
User interfaceuGUI or UI ToolkitUMG widgetsControl nodes with anchors and containersRebuilt
ShadersShaderLab, Shader GraphMaterial graphs, HLSLGodot shading language or VisualShaderRewritten
NavigationNavMesh and agentsNav Mesh Bounds, AI controllersNavigationRegion, NavigationAgent nodesRebuilt
Store pluginsAsset Store packagesMarketplace pluginsAsset Library add-on, GDExtension, or your ownCheck first

Nothing in this table is a converter. Godot has no importer that reads a Unity or Unreal project; the parts marked Moves move because they were never engine-specific files in the first place. For term-by-term lookups, the equivalents dictionary covers 61 pairs with code on both sides.

The order that works

Six steps, cheapest failure first

Each step is ordered so that the thing most likely to end the migration is tested before you spend a month on content. If a step fails, you have lost days rather than a quarter.

  1. 1

    Check the exits first

    Confirm Godot exports to your target platforms and that every plugin you depend on has an equivalent, a replacement, or a plan. This is the only step that can end the migration, so it goes before any work.

  2. 2

    Rebuild one character

    An empty project, one CharacterBody, movement, and a collision shape. This forces you through the Input Map, the physics tick, and the scene tree in an afternoon rather than a month.

  3. 3

    Run one art asset end to end

    One model with one texture and one animation, from your DCC tool to a scene that plays it. Import settings are where schedules quietly go missing.

  4. 4

    Rebuild one interaction

    A pickup, a signal, and something on screen that changes. This is where prefab and Blueprint habits meet scenes and signals.

  5. 5

    Rebuild one screen of UI

    Anchors and containers behave differently from uGUI and UMG. Find that out on one screen, not forty.

  6. 6

    Only now move content in bulk

    By this point the pipeline, the input layer, the physics assumptions and the UI system are known quantities. Bulk work becomes repetitive instead of risky.

Week one

Three habits that change

Most of the translation is mechanical once these three change. They account for the majority of "why does this not work" moments in the first week, whichever engine you came from.

A script is its node

You wroteGetComponent<Rigidbody>() / GetOwner()

You now writeThe script extends the node it sits on. Children come from the tree: @onready var sprite: Sprite2D = $Sprite2D

There is no component lookup because there are no components to look up.

Two update functions, not one

You wroteUpdate() and FixedUpdate() / Tick

You now write_process(delta) for frame work, _physics_process(delta) for anything physical

move_and_slide() already accounts for the physics timestep, so do not multiply velocity by delta before calling it.

Signals replace events and dispatchers

You wroteC# event + listener / Event Dispatcher + binding

You now writesignal collected(value: int), connected in code or in the Node dock

A node announces what happened. Whoever cares connects to it, and nothing needs a reference to the listener.

Each of these is practised with runnable code in the C# to GDScript lab.

Moving an existing project?

Rebuild one room, one character, and one interaction first. Check your target platform and essential plugins before moving the rest.

Compare engine strengths and tradeoffs
Just need a quick translation?Open the equivalents dictionary