Skip to content
hikari
RenderingEditorAIToolchainDocumentation
GitHub
hikari

© 2026 Flying Rat Studio.
All rights reserved.

Explore the engineDocumentationContributorsLicenseBack to top
Documentation / Guides
Browse docs
Overview
Tutorials16
OverviewFirst game projectFirst entityAuthored user_data and the inspectorFirst mesh and materialFirst physics body and triggerFirst character controllerFirst session servicesFirst UIFirst input actionFirst messagesPlay, Edit, and scenesFirst runtime spawnFirst motionFirst skeletal animationAssets in Play (soft refs and hot reload)Dynamic editor recompile
Guides16
OverviewDevelopment guideGameplay APIChoosing component storageBuild and packagingProject filePluginsHikari Plugin APIData-driven content, JSON, and pathsScripting with KawaShader authoringTime of dayUser interfaceUI layoutUI widgetsMigration from Unity / UnrealActor and component lifecycle
Systems28
OverviewArchitectureApplication lifecycleFrontends and driversPlatforms and supportSession services and cross-scene stateScenes and gameplayActor communication (hi.actors)Game-facing refsSave / replication wire versionCoordinate space and camera conventionsRenderingRenderer architecture mapFrame governorGPU particlesVisual ZonesVolumetric mediaInputAudioPhysicsMotion KitTemporal KitAssets and ShinraPrefabsAsset residencyAsset formats (Shinra pipeline)UI and editorEditor asset hot reloadEditor Project Selector
Language reference2
OverviewAkari language referenceKawa language reference
Engine overview
Start exploring
  • No matching sections. Try fewer words or another topic.
NavigateEnter Openesc Close
Overview
Tutorials16
OverviewFirst game projectFirst entityAuthored user_data and the inspectorFirst mesh and materialFirst physics body and triggerFirst character controllerFirst session servicesFirst UIFirst input actionFirst messagesPlay, Edit, and scenesFirst runtime spawnFirst motionFirst skeletal animationAssets in Play (soft refs and hot reload)Dynamic editor recompile
Guides16
OverviewDevelopment guideGameplay APIChoosing component storageBuild and packagingProject filePluginsHikari Plugin APIData-driven content, JSON, and pathsScripting with KawaShader authoringTime of dayUser interfaceUI layoutUI widgetsMigration from Unity / UnrealActor and component lifecycle
Systems28
OverviewArchitectureApplication lifecycleFrontends and driversPlatforms and supportSession services and cross-scene stateScenes and gameplayActor communication (hi.actors)Game-facing refsSave / replication wire versionCoordinate space and camera conventionsRenderingRenderer architecture mapFrame governorGPU particlesVisual ZonesVolumetric mediaInputAudioPhysicsMotion KitTemporal KitAssets and ShinraPrefabsAsset residencyAsset formats (Shinra pipeline)UI and editorEditor asset hot reloadEditor Project Selector
Language reference2
OverviewAkari language referenceKawa language reference
Engine overview
Guides9 min read

Migration from Unity / Unreal

On this page
On this pageQuick mapEntities and componentsScripts: Zig vs Kawa vs mixGameplay featuresSession vs scene (GameInstance / DontDestroyOnLoad)Scenes and levelsPhysics and charactersMessaging and actor accessTime and routinesUIAssets and materialsProject, editor, and buildMental-model checklistWhere to go next Back to top

Concept map for teams coming from Unity or Unreal Engine. Canonical behaviour lives in the linked docs; this page only translates vocabulary and mental models.

Quick map

ConcernUnityUnrealHikari
Placeable objectGameObject + componentsActor + componentsActor (ActorRef; EntityId is an alias). Archetype + open component list + optional Kawa scripts (entity-level and/or per component)
TransformTransformRootComponent / scene componentAlways present on every entity
Mesh / materialMeshRenderer + MaterialStaticMeshComponent + Material slotshi.ComponentRender + scene components.render (mesh/material or multi-part model)
Rigid bodyRigidbody + ColliderPrimitive / Physics bodyhi.ComponentPhysics + scene components.physics
Character moveCharacterController / CharacterController2DCharacter Movement ComponentCapsule CCT flag on physics (is_character_controller)
Script on objectMonoBehaviour (C#)Actor Blueprint / C++Zig defineComponent logic and/or Kawa .kawa (may mix)
Global / cross-level stateDontDestroyOnLoad, singleton managersGameInstance, World SubsystemsGameSubsystem (session services)
LevelScene (.unity)Level / World Partition cellScene JSON (scenes/*.json)
Additive loadAdditive scene loadLevel streaming / sublevelsrequestSceneLoad(ref, .{ .mode = .additive }) / layers
Persistent free spawnDontDestroyOnLoad objectSpawn outside streaming levelLoose actor (SpawnDesc.layer = .loose)
PrefabPrefab assetBlueprint class / DataAsset.prefab.json + variants — Prefabs
Project settingsProject Settings / ScriptableObjectProject Settings / ini / DataAssetZig ProjectConfig defaults + configs/*.json overlays (hikari.project.json is identity only)
InputInput System / old Input ManagerEnhanced InputNamed actions in input_actions.json → ActionState
UI (game)uGUI / UI ToolkitUMG / Common UIImmediate-mode hi.ui() / world.ui
UI (editor)Editor IMGUI / UI ToolkitEditor Slate / UMG toolsRetained editor chrome (editor/ui/) — separate from game UI
MessagingSendMessage / UnityEvents / C# eventsGameplay Tags / Event Dispatchers / interfacesLanguage-agnostic message bus (send / emit)
Coroutines / delaysIEnumerator / async UniTaskLatent nodes / timers / async tasksTemporal Kit (Timer, Flow, …) — poll edges, no yield
TweensDOTween / LeanTweenTimeline / customMotion Kit (Tween, Spring, …)
Asset cookAssetDatabase / AddressablesUAsset cook / PakShinra → .shin* + bundles; refs are asset://
Hot reload (code)Domain reload / Enter Play Mode optionsLive Coding / Hot Reload (limited)Editor recompiles libgame and dlopens it
Editor without projectHub → open/createEpic Launcher / project browserStandalone kaji editor → project selector

Entities and components

Hikari uses an open component list on each archetype (not Unity’s free-form bag, not a full Flecs/Bevy ECS).

  • An entity is authored with defineActor: .components = .{ hi.ComponentRender, hi.ComponentPhysics, MyLogic, … } plus optional Kawa .script. A game defineComponent may carry its own .script too — one script slot per component instance, data seeded from that component's fields.
  • Engine capabilities are hi.ComponentRender, hi.ComponentPhysics, hi.ComponentCamera, hi.ComponentLight, … — not bool flags.
  • Game logic is defineComponent types listed next to capabilities. .behaviour is rejected at compile time.
  • Every entity has a transform. Scenes are com.hikari.scene version 1 documents; capability params live under "components": { "render": …, "physics": … } (open map; no parallel top-level capability fields).
  • Logic components expose lifecycle: awake, start, update, onCollision, onMessage, onChanged, onDestroy (and optional deinit).
  • Game modules never hold Entity* / World* layout. Handles are opaque EntityIds; calls go through HostApi (hi.world(), hi.render(), hi.ui(), …).
UnityUnrealHikari
AddComponent<T>() at runtimeCreateDefaultSubobject / add componentCapabilities + logic on the archetype; runtime spawn uses SpawnDesc + host APIs; instance add for columns via editor/mutation path
GetComponent<T>()FindComponentByClassTyped access via messages / user_data / host; no game-side Entity*
GameObject.SetActive / activeInHierarchySetActorHiddenInGame / tick enable (split)hi.world().setActive — one entity switch; systems AND it with component switches
Behaviour.enabled / Collider.enabledcomponent tick / collision enablehi.world().setPhysicsActive (components.physics.is_active)
Renderer.enabledSetVisibilityhi.render().setVisible (components.render.is_visible)
Serialize fields on MonoBehaviourUPROPERTY on Actor/ComponentComponent metadata.properties → inspector + JSON user_data
Prefab instance overridesBlueprint defaults + instanceScene JSON components blocks override params; Zig archetype declares the component list

Entity off + physics/render on still means no sim/draw (effective enable). Component getters return the authored switch, not the AND. Full table: Scenes and gameplay — Active / enable trio.

Details: Scenes and gameplay, First entity.

Scripts: Zig vs Kawa vs mix

RoleUnityUnrealHikari
Primary compiled gameplayC# assembliesC++ modulesZig game module (hikari_game SDK)
Designer / hot scriptsame C# (or Bolt/Visual Scripting)BlueprintsKawa (typed VM language)
Mixed actoruncommonC++ + Blueprint childFirst-class: Zig components + Kawa on the same archetype

Patterns:

text
Zig-only     defineActor(.{ .archetype = "player", .components = .{ hi.ComponentPhysics, PlayerLogic } })
Kawa-only    defineActor(.{ .archetype = "prop", .components = .{hi.ComponentRender}, .script = "asset://./scripts/….kawa" })
Hybrid       defineActor(.{ .archetype = "player", .components = .{…, PlayerLogic}, .script = "asset://./scripts/player.kawa" })
Component    defineComponent(.{ .name = "patrol", .script = "asset://./scripts/patrol", .data = struct { speed: f32 = 2 } })

Component scripts are the closest analogue to a MonoBehaviour / ActorComponent with a Blueprint body: Zig owns the typed data column, the script owns behaviour, and the same component (with its script) can sit on any archetype that lists it. Engine capability builtins and .swarm components cannot declare .script.

ConcernPrefer
Hot path, typed APIs, CCT locomotion, HostApi surfaceZig logic component
Iteration on props, simple AI, cinematic props, designer editsKawa actor script
Reusable scripted behaviour with typed inspector fields, shared across archetypesKawa component script (defineComponent.script)
Cross-scene HUD, progress, load orchestrationZig GameSubsystem and/or session Kawa script
Actor ↔ actor gameplay signalsMessage bus (works Zig↔Kawa)

Session scripts are not MonoBehaviours on a DontDestroyOnLoad object and not Level Blueprints glued to a map. Attach once from the subsystem; they survive replace unload. Actor.* is nil in session scope.

Details: Scripting with Kawa, Kawa language, Session services.

Gameplay features

Session vs scene (GameInstance / DontDestroyOnLoad)

NeedUnity habitUnreal habitHikari
HUD / progress / audio façadeDontDestroyOnLoad GameManagerGameInstance / subsystemGameSubsystem hooks (onLaunch, onTick, scene load hooks)
Level contentScene objectsLevel ActorsScene JSON entities
“Keep this across additive unload”DDOLSpawn in persistent levelhi.world().spawn with SpawnDesc.layer = .loose (host: spawnLoose)

Do not put immortal manager entities in every scene JSON.

Scenes and levels

UnityUnrealHikari
LoadScene (Single)Open level / travelrequestSceneLoad (replace)
LoadScene (Additive)Load stream levelrequestSceneLoad(ref, .{ .mode = .additive }) (layer, keyed by path)
Unload additiveUnload streamrequestSceneUnloadLayer
AsyncOperation progressLatent load %sceneLoadSnapshot + readiness stages (none → entities → assets → gpu → world all)

Show-the-scene gates on ready_stage == .all, not merely “load queue idle”. Soft-missing assets do not block readiness (error cube / pink material). GPU stage also waits for deferred texture residency + map rebind push (not only mesh create queue empty).

Physics and characters

UnityUnrealHikari
Rigidbody dynamic/kinematic/staticSimulate physics / moveBodyType: Dynamic / Kinematic / Static / Trigger
OnCollision / OnTriggerHit / Overlap eventsZig onCollision (and messaging from there)
CharacterController.MoveCMC + capsulePhysics CCT: set desired velocity; read grounded / ceiling / ground normal
Physics.RaycastLineTracehi.world().raycast (plus host overlap helpers)

Physics is a replaceable backend (Tenkai3D today); game code uses engine contracts, not middleware types.

Details: Physics, Input.

Messaging and actor access

UnityUnrealHikari
SendMessage / BroadcastMessageInterface calls / Event Dispatcherhi.actors.sendEvent / emitEvent (Zig); Actors.send / emit (Kawa)
GameObject.Find + GetComponentFindActor + component accesstryFind + target.component(Health).has() / get(.hp) (Zig); Actors.has / get_number (Kawa)
ScriptableObject event channelsGameplay Message RouterSame bus; names interned; ≤4 typed args
C# event on a known typeCast + callMessages at boundaries; same-actor Zig uses ActorContext.get
TWeakObjectPtr / null checksWeak ptr / IsValidWeak ActorRef + isAlive (never pins unload)

Deferred flush after entity updates (Zig components with onMessage, then all Kawa on_message slots). Cross-language by design.

Details: Actor communication.

Time and routines

Zig has no yield / IEnumerator. Temporal Kit is poll-based state on the entity or subsystem:

UnityUnrealHikari Temporal
WaitForSecondsDelay latent / timerTimer / Flow.wait
yield return nullnext-tick latentFlow.waitFrame
WaitUntilwait-until latentFlow.waitUntil
StartCoroutine / StopCoroutineAsync task handleflow.start() / flow.stop() / flow.goto
cooldown fieldscooldown in Ability SystemCooldown

Tick with TickContext.dt / total_time each frame. Scene-load waits use readiness snapshots, not coroutines parked on the load op.

Details: Temporal Kit. Motion/tweens: Motion Kit.

UI

ConcernUnityUnrealHikari
Game HUD / menusCanvas / UI ToolkitUMG WidgetImmediate UI from entity update or session tick via hi.ui()
LayoutRectTransform / USSAnchors / panelsvStack / hStack / flow / zStack, Length (points / percent / fill)
ThemeUSS / theme SOStyle assetsTheme + density Environment
Editor toolsEditorWindowEditor Utility / SlateRetained editor/ui/ — not the same API surface as game UI
AnimationAnimator / DOTween on UIUMG animationsMotion Kit drivers sampled into styles

Game modules get the hi.ui() widget set (stacks, text, buttons, fields, sliders, tabs, lists, grids, modals, rich text, world anchors; not trees, split panes, popups, or drag-drop). Host/editor owns the full UiContext. One flattened UI draw call at end of frame.

In the editor, Play remaps game UI into the viewport; chrome stays outside. Session HUD belongs on GameSubsystem, not on every scene actor.

Details: User interface, UI layout, UI widgets, UI and editor.

Assets and materials

UnityUnrealHikari
FBX import → Mesh + MaterialsFBX → Static Mesh + slotsglTF/GLB → Shinra → .shinmodel + .material.json + .model.json
Multi-material rendererMaterial slot array on meshMulti-part placeable: one actor, parts[], N draws
Addressables / ResourcesSoft object pointers / Pakasset://<pack>/<path> or asset://./<path>; soft refs with placeholders
AssetDatabase refreshContent Browser cookShinra watch / editor daemon; Play defers some reloads

Details: Assets and Shinra, Asset formats.

Project, editor, and build

UnityUnrealHikari
.unity project + Packages.uproject + moduleshikari.project.json + Zig ProjectConfig
Editor Play modePIEEditor Play / Edit; Stop restores document, not last play scene
Player buildPackaged projectkaji game … --package
Editor install + open projectEditor + .uprojectkaji editor (selector) or kaji editor --project=
asmdef / plugin DLLgame module DLLThin SDK + dynamic libgame in editor; optional monolithic game product

Game code in the editor always loads dynamically (recompile / dlopen). --type=monolithic|dynamic selects host/driver linkage, not “bake game into editor”.

Details: Project file, Build and packaging, Editor project selector, Frontends and drivers.

Mental-model checklist

  1. Archetypes, not free ECS — declare capabilities once; place instances in scene JSON.
  2. Session ≠ scene — cross-level state on GameSubsystem / session scripts.
  3. Opaque handles — game modules call through HostApi; no shared Entity layout with the host.
  4. Zig and Kawa are peers on the bus — prefer messages at language boundaries.
  5. Poll Temporal / Motion — no hidden coroutine stacks on the hot path.
  6. Soft assets — missing content loads with placeholders; readiness still advances.
  7. Document owns Edit — Play is a disposable world built from SceneDocument across ticks; Stop switches back to the retained editor world in one call.

Where to go next

  1. Tutorials — project → entity → session → UI → messages → Play/Edit
  2. Architecture — seams and ownership
  3. Scenes and gameplay / Session services
PreviousUI widgetsNext Actor and component lifecycle

Documentation follows the current engine checkout.

Snapshot cc148c75Source docs/guides/migration.md
On this pageQuick mapEntities and componentsScripts: Zig vs Kawa vs mixGameplay featuresSession vs scene (GameInstance / DontDestroyOnLoad)Scenes and levelsPhysics and charactersMessaging and actor accessTime and routinesUIAssets and materialsProject, editor, and buildMental-model checklistWhere to go next Back to top