Unity & Engine
- GameObject architecture
- DOTS / ECS
- Jobs + Burst
- Addressables used in: Cargo Simulator chunk streaming
- Profiling
Senior Unity Engineer — Systems · Multiplayer · VR
I build game systems that ship and scale.
drag · scroll · arrow keys — click a card for the case study
No levels, no percentages. Where it matters, a node points at the shipped work that proves it.
Experience, newest first.
[2025–2026]
[2023–2025]
[2021–2023]
[2021]
[2019]
[2017]
Open to: Senior/Lead Unity roles — multiplayer, systems, VR. Remote (based in Ankara, TR).
media: AAA-trailer placeholder — real capture pending
An open-world cargo simulation game for PC, founded, built, and shipped solo on Steam under NocturnForge. A grid-based streaming world with procedural roads, where the delivery loop — packages, inventory, vehicles, characters — runs on fully data-driven systems.
Problem. An open world breaks two assumptions Unity makes: that positions are world-space floats (precision degrades with distance from the origin) and that a gameplay entity is a loaded GameObject (streaming means most of the world isn’t loaded at any given moment).
Constraint. Team size: one. There was no budget to fight the engine — every system had to work with Unity’s lifecycle, not against it, and still ship.
Solution. The ID-based entity system separates simulation state from the loaded representation. Entities exist as data whether or not their chunk is resident; GameObjects become disposable views that attach when a chunk streams in via Addressables and detach when it unloads, with precision handled at the chunking layer instead of raw world-space floats.
Result. The game shipped on Steam, built end-to-end by one engineer. The ambient scene on this site — routes, streaming, deliveries — is a toy version of these exact systems.
media: AAA-trailer placeholder — real capture pending
A released multiplayer VR/PC project where players grab, equip, and fight with physics-simulated objects over the network. I owned physics-driven interaction and combat as Senior Unity Engineer (Jul 2023 – Sep 2025, remote).
Problem. A handheld object in networked VR is fought over by three authorities: the local player’s hand, the physics engine, and the network state. With latency in the loop, default physics makes held objects visibly jitter — and in VR, jitter on something in your own hand is instantly nauseating and breaks the entire illusion.
Constraint. The fix couldn’t just be smoothing: combat needs held objects to respond crisply, and multiplayer needs both players to agree about hits.
Solution. Custom joint and constraint handling for held objects, replacing the default physics behavior so the hand-object relationship resolves locally and stays stable while network corrections are absorbed where the player can’t perceive them.
Result. Latency-induced jitter on handheld objects was eliminated, keeping VR combat physical and believable over the network on a live, shipped title.
media: AAA-trailer placeholder — real capture pending
A reusable Unity idle-arcade framework plus HG Builder, a Python-based CI/CD tool — together they carried 10+ arcade/idle games to production or soft launch at Hero Games (Nov 2021 – Jun 2023, remote).
Problem. One framework had to serve 10+ games that were each different on purpose — different mechanics, different economies, different art. Too rigid and every new game fights the framework; too loose and it’s not a framework at all, just a folder of snippets.
Constraint. Games kept shipping while the framework evolved underneath them — breaking changes had a real cost multiplied across every live title.
Solution. A composition-first architecture: small, replaceable systems behind stable interfaces with config-driven balancing. Games override behavior by swapping parts, not by patching shared code — and HG Builder made releasing the whole portfolio a push-button operation.
Result. 10+ titles reached production or soft launch on the framework, and the build automation saved the team 2+ hours every day.
media: AAA-trailer placeholder — real capture pending
An asynchronous multiplayer idle game played entirely inside Telegram, built solo while still a university student. It reached 400K+ registered users with 1K+ active players.
Problem. 400K+ registered users and 1K+ active players hitting a game that had no game servers in any traditional sense — just PHP, MySQL, cron jobs, and webhooks.
Constraint. One student, a student’s budget, and a stack chosen for being cheap to run rather than easy to scale.
Solution. Lean on the idle genre’s shape: state changes are either explicit player actions (webhooks, cheap to process one at a time) or time-based progression (computed in scheduled batches by cron instead of simulated continuously). The database does the multiplayer; nothing needs a persistent connection.
Result. The game served 400K+ registered users as a solo, pre-graduation project — and taught the systems thinking the rest of this portfolio is built on.