Unity & Engine
- GameObject architecture
- DOTS / ECS
- Jobs + Burst
- Addressables used in: Cargo Simulator chunk streaming
- Profiling
Senior / Lead Unity Engineer · Architecture · Full-stack generalist · VR multiplayer
Building games since 13. I ship whatever a game needs, plus the architecture to scale it.
drag · scroll · arrow keys · click a card for the case study
Idle Fisher Personal · built solo as a student UnityFSMNavMesh
Ant Hilton Idle Hero Games · Sole programmer UnityIdleMobile
Fashion Arcade Idle Hero Games · Gameplay engineer UnityIdleMobile
Hide and Seek Hero Games · Sole programmer UnityFSMMobile
Escape Hero Games · Sole programmer UnityHypercasualAI No skill-level bars. These are the areas I actually build in, and where it matters, each one points to a project that used it.
How I design systems, written down. I keep it as a file inside my codebases so the next developer, or an AI agent, works from the same playbook I do.
Complexity is earned, not designed.
I never sit down and design the complicated thing directly. I build small concrete pieces, each owning one job, with hard boundaries between them, and I stack those pieces. The capable behavior comes out of how they combine; I do not build it in up front.
Every meaningful piece owns one responsibility and one scope. A piece doing two jobs is two pieces wearing one name.
Player is a role on top of character. Backpack is a role on top of item. The base never knows what got layered on it.
Systems lean on each other all the time; that is normal. What stays strict is the direction. A base never reaches up into a role built on top of it, so character never depends on player and dependencies never loop back.
A root owns what a thing is, a service owns its live state, a controller owns the flow, a repository owns how it is saved. The point is that no single rule can be changed from four different places.
An interface or a base class is a dependency too. A bad one spreads through the whole codebase and gets expensive to change, while a bit of repeated code stays in one place and is cheap to delete.
I add it only when it removes duplication I have actually hit, makes ownership clearer, or matches a pattern already in the code. If it does none of those yet, it waits.
Experience, newest first.
[2025–2026]
[2023–2025]
[2021–2023]
[2021]
[2019]
[2017]
Open to Senior / Lead Unity roles in architecture, multiplayer, and VR. Remote, based in Ankara, TR · EN / AR / TR.
An open-world delivery simulation for PC, published by No King Interactive. I founded NocturnForge and did all of the development solo, every system from low-level engine foundations up through gameplay, on a layered composition-based architecture meant to stay cheap to maintain and fast to extend as it grows. The original game design came from the publisher; I extended it heavily on top. It’s in Steam Early Access with 4,000+ wishlists: deliberately open-ended and still deep in development. Pipeline: Unity, URP.
Service.Resolve<T>(), a much stronger alternative to singletons, so it is
an IoC / service locator and deliberately not a full auto-injecting DI container.
Registration stays centralized in installers, and every service follows one lifecycle
contract: constructor assigns dependencies, Initialize() subscribes and starts work,
Deinitialize() tears it back down.id → item, id → package, id → backpack), so any system operates on an object by
ID alone.Problem. An open world breaks two of Unity’s assumptions: world-space float coordinates lose precision far from the origin, and physics assumes a single shared scene, which fights any plan to run multiplayer physics later.
Constraint. Solo founder, shipping to Early Access. Every system had to work with Unity’s lifecycle, not against it, and leave room for multiplayer without a rewrite.
Solution. Two cooperating systems. Chunks give the world an integer coordinate frame: objects are placed by chunk-int coordinate plus a small local offset, so precision never degrades with distance (origin shifting is only a secondary aid). Each chunk is its own physics scene, and Tiles, the static geometry, stream in and out of those chunks via Addressables. Because objects in separate physics scenes can’t collide, entities at chunk borders are replicated across neighboring scenes so they interact seamlessly across boundaries.
Result. A streaming open world that holds precision anywhere on the map and is already structured for multiplayer physics, in Steam Early Access at 4,000+ wishlists, built end to end by one engineer. The ambient scene on this site (routes, streaming, deliveries) is a toy echo of these exact systems.
Highstreet Calamity is a class-based multiplayer VR roguelike brawler: play solo or in co-op, fighting through procedurally generated waves and bosses to build your character. It runs on Meta Quest, PC VR, and in the browser via WebGL. It’s the second game from Highstreet Market, a ~50-person studio (~8 engineers); I worked on both of the studio’s games as Senior Unity Engineer (Jul 2023 to Sep 2025, remote) and owned the physics-driven combat on Calamity, the deeper engineering, which I highlight here.
(The studio’s other title, Highstreet Market, is a social VR game, an apparel store selling mainly watches, built on physics-based grabbing and full-body IK wearing, where a worn watch transforms into a sword to fight.)
Problem. A weapon or shield held in a VR player’s hand has to feel physical, but default physics joints react a frame late, so anything you hold visibly shakes. In VR, jitter on something in your own hand is instantly wrong and breaks the whole illusion.
Constraint. Combat also had to stay flexible, with many weapon types built without bespoke code each time, and hold up in a networked, server-authoritative game.
Solution. Two moves. Weapons are composed from small single-responsibility components (each sword edge or shield facet its own damage/behavior part), so the armory is data-shaped rather than hand-coded and a new weapon is an arrangement of parts. And the shaking is killed with custom joint physics that account for the player’s own motion, replacing the late-reacting default joints so held items stay stable and responsive.
Result. Smooth, believable handheld weapon and shield physics, and a combat system where new weapons are assembled from parts, shipped in a live, class-based VR roguelike on Quest, PC VR, and WebGL.
A top-down idle fishing simulation for mobile. You pilot a boat around the map, hold position over a shoal to fish automatically, and sell the catch for gold, which you reinvest into a growing fleet that fishes for you. Built solo in 2019 on a fully ScriptableObject-driven architecture. Released on Android and iOS long ago; since delisted.
Problem. “Idle” means the game keeps playing itself: hired boats and fishers have to roam, path, and fish believably whether or not you’re watching, and enemy boats have to threaten your ship without any babysitting.
Solution. Each boat/fisher is modeled as an FSM over NavMesh, so behavior is autonomous and composable, and the whole economy is tuned from ScriptableObject data rather than code.
Result. A complete idle game with an autonomous AI fleet and a tunable passive-income economy, the 2019 groundwork for the arcade-idle systems I later built at Hero Games.
A mobile idle mining game. Ant colonies dig through areas, extracting blocks that convert into gold. Gold funds upgrades (more ants, faster movement, and a better block-to-gold conversion rate) with sub-upgrades that stack to raise the gold each mined block yields. Clear an area and it’s replaced with an empty room you can fill with decorations; each decoration generates steady passive income scaled to its level, upgradeable up to a cap. At Hero Games I was the sole programmer, working alongside a game designer and an artist.
As the sole programmer, I built all of the game’s systems:
Problem. An idle economy has to stay rewarding across wildly different time scales, the first minute and the hundredth hour, without stalling early or trivializing later. Two income sources (active mining plus passive decoration income) and compounding upgrade tiers make the numbers grow fast.
Solution. A data-driven economy where mining yield, conversion, and decoration income scale on tuned curves, and offline progression is computed from elapsed time rather than simulated, so returns feel fair whether the player was gone a minute or a day.
Result. A complete, released idle title, with all of its systems coded by one engineer.
An asynchronous multiplayer idle game played entirely inside Telegram, built solo as a hobby while still in high school. It reached 400K+ registered users with 1K+ active players and, though a hobby, it was a genuinely commercial product.
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 hobby project built in high school, and taught the systems thinking the rest of this portfolio is built on.
An idle dessert-shop tycoon: build an ice-cream empire, hire and automate staff (chefs, cashiers, waiters, baristas), unlock new products, and keep earning idle gold while you’re offline. Originally built at Hero Games; it’s currently live on the Play Store, relaunched under Leap Games. I worked on it as a gameplay engineer.
As a gameplay engineer on the team, I worked across:
An idle fashion-store tycoon. You run a clothing store: collect fabric, turn it into clothing, sell it, and reinvest, buying more racks to serve more customers and expanding the shop. Hire cashiers and fabric technicians to automate production and sales, and upgrade their speed as you scale. Built at Hero Games.
I built the game’s core fabric-weaving mechanic and its supporting systems:
Problem. The fabric-weaving mechanic had to feel physical and satisfying, with fabric visibly rolling into clothing as you move over it, but run on mobile, where rebuilding mesh geometry every frame is exactly the kind of thing that tanks the frame rate.
Solution. Dynamic mesh manipulation that deforms and rolls the fabric mesh in real time as the player moves across it, kept cheap enough to stay smooth on the mobile target.
Result. A tactile signature mechanic, the core of how the game feels, running on phones.
A mobile arcade-idle infiltration game. You feed starter blocks into a machine that converts them into pickaxes, then deliver the pickaxes to a camp. Miners queue up, each grabs a pickaxe and moves to a ready zone; you collect the ready miners and lead them to the target zone. There, fields of unmined blocks sit under the gaze of patrolling guards, so you paint each miner the right color to blend in, mine a path to the gate, and once every block is cleared the miners open it. Past the gate they regroup, charge, and take out the remaining enemies. At Hero Games I was the sole programmer, working alongside a game designer and an artist.
As the sole programmer, I built every gameplay system:
Problem. The game is really a pipeline of dependent stages (convert, deliver, queue, collect, escort, disguise, mine, breach, fight) where each stage feeds the next. If any stage stalls or desyncs (a miner with no pickaxe, a wrong-colored miner spotted), the whole loop jams.
Solution. Miners are modeled as small state machines moving through an explicit queue, with each stage gated on the resource it needs, so throughput scales smoothly as the player upgrades and the pipeline never deadlocks.
Result. A complete arcade-idle title with a deep multi-stage loop, all of it coded by one engineer.
A hypercasual escape game. A vending machine dispenses batteries; you collect them and carry them to power stations, filling each until they’re all powered and the exit gate unlocks, then on to the next level. A killer patrols the level the whole time, but can’t detect you while you’re hiding in a vent. At Hero Games I was the sole programmer, working alongside a game designer and an artist.
As the sole programmer, I built the full game’s code:
Problem. Hypercasual tension lives or dies on the chase. The killer has to feel dangerous without being unfair, and hiding has to feel like a real escape, not a loophole.
Solution. A patrol-and-detect AI with clear, readable states (patrol → alert → chase) and a hard stealth rule, where vents fully break detection, so the player always understands why they were caught and how to get away.
Result. A tight, readable hypercasual loop, coded end to end by one engineer.