Leonnel Hammel (back to Home)

|

SUNA

SUNA is a competitive first-person shooter game, set on a dystopian planet devastated by the ongoing war between the native population and the Corporation entity. The gameplay is highly inspired by Counter-Strike and VALORANT as they are both leaders in the genre

This project was started with the team presented later on this page as part of our 3rd year at Creajeux. It is a student project aimed at improving our skills in game development and teamwork, as well as exploring new technologies and methodologies

Considering the scope of the project, we all endorsed multiple roles and responsibilities to ensure its success.
My roles were Gameplay programmer, Online Programmer and Project Manager

Gameplay & Online Programmer

6 Programmers | 4 Artists

9 Weeks

May 2025

Unity
C#
Git
Network for Entities
DOTS
ECS
Multi-layer servers
Multiplayer
Client-Server Relation
Download SUNA
Windows
Check SUNA Github
Github

< About SUNA /> // Main features

SUNA: scalable, low-latency FPS multiplayer

SUNA (official school page) is a multiplayer architecture and codebase built with Unity's DOTS (Data-Oriented Technology Stack), and Netcode for Entities . It combines authoritative server logic, deterministic client prediction and ECS driven performance to deliver high-framerate, competitive multiplayer experiences

This was the first 3D cross-team project and first multiplayer project. I learned the theory in less than 5 months using the resources below. Not a lot of sleep, but a lot of learning and fun, programming is an amazing journey and the results have been extraordinary. The following ressources helped me a lot

Client–Server Netcode

Authoritative servers run game logic while clients predict locally. Snapshots, delta compression and jitter buffering keep gameplay smooth across variable networks

DOTS / ECS Core

Entity-Component-System architecture enables cache-friendly, multithreaded performance for many simultaneous entities and high framerate targets

Deterministic Prediction

Local input prediction with authoritative reconciliation reduces perceived latency while guaranteeing server-correct final state

Matchmaking & Loading

Asynchronous matchmaking with load confirmation and on-demand client-world instantiation so players join seamlessly when ready

Ownership & Spawn Mapping

Client-side spawn prediction with temporary local IDs remapped to server-assigned IDs and playerID routing for correct ownership

< What I worked on /> // Server β€’ Client β€’ Multiplayer

Dedicated Server

Built a fully headless authoritative Unity 6 ECS server from ground up to run Entity-based simulation and network replication for multiplayer sessions Implementation includes custom configuration (port, max players, tickrate), deterministic server-side simulation using the ECS + Jobs + Burst toolchain, snapshot-based state replication with explicit server reconciliation (lastProcessedInputSeq + tick IDs), telemetry & remote debug channels, and an automated session lifecycle with failover/restart logic all validated for deployment on a tuned virtual machine with secure remote management
Dedicated server headless run (mobile preview)

Server-authoritative ECS architecture

Authoritative simulation implemented in Unity 6 Entities (ECS) + Jobs + Burst: entity-only state on server, deterministic systems, fixed tick scheduler, and isolated world instances for session sharding

Snapshot replication & client prediction

Custom NetCode pipeline using snapshot delta compression, reliable/unreliable channel separation (UDP), and client-side prediction to mask latency while preserving server authority

Server reconciliation (rollback + replay)

Snapshots include authoritative tick IDs and lastProcessedInputSeq. Clients compare incoming snapshots and, if the divergence exceeds a threshold, restore the authoritative state and deterministically replay unacknowledged inputs (seq > lastProcessedInputSeq) via the Ghost Component System in Unity ECS to apply snapshots, perform rollback and replay. Corrections are then smoothly interpolated. Ring-buffered predicted states and inputs are used so rollback is cheap and limited to the local player

Config-driven server runtime

Runtime config layer supports CLI / JSON configs and env-vars for port, maxPlayers, tickrate, simulation scale, logging levels and snapshot frequency

Session lifecycle & auto-restart

Robust session manager with graceful shutdown, snapshot persistence, automatic restart on crash or health-check failure, and configurable session rotation for continuous availability

Remote ops & VM tooling

Deployed to a tuned VM with SSH key-based access + optional RDP/VNC for visual tasks: automated build/deploy scripts, systemd service wrapper, Docker image option, and CI integration

Telemetry, remote debug & diagnostics

Client telemetry channel for debug payloads, server-side ring-buffered logs, structured metrics export (Prometheus-compatible), and on-demand remote console for live troubleshooting and replay trace dumps

Security & performance hardening

Network hardening (UDP rate-limits, port whitelisting), VM tuning (CPU pinning, cgroups, sysctl net/core tuning), swap disabled, NIC offload config and resource limits to maintain low jitter and deterministic ticks for reliable reconciliation

Server build optimization

Editor-only pre/post-build processor that strips cameras, lights and renderers for dedicated server builds, and strips unnecessary shaders/compute kernels to reduce size and avoid graphical overhead on headless servers

Client System

Client-side replication & instantiation for Unity ECS: deterministic client interpolation, snapshot application with local prediction, playerID dispatch to local entities, and authoritative reconciliation handling. Implemented with Entities + Jobs + Burst for performance; includes client-side ghost application, spawn ownership mapping, and lightweight client-side state buffering for smooth gameplay under jitter
Client system headless run (mobile preview)

Client-side entity instantiation

Deterministic client spawn prediction + authoritative confirm path: local ghost creation, temporary local IDs, remapped to server-assigned authoritative IDs on snapshot

Client replication & prediction

Snapshot apply pipeline with delta decompression, jitter buffer, and local prediction for player-controlled entities; non-player entities interpolated with configurable smoothing windows

PlayerID dispatch & ownership

PlayerID routed to spawned entities with ownership components; input dispatch ensures local player authoritative input is reconciled with server confirmations

Client lifecycle & reconnect

Session resume, entity snapshot diff on reconnect, and reapply of unacknowledged local inputs to avoid desync after transient disconnects

Matchmaking : LoadingScreen with async confirmation

Asynchronous matchmaking and loading workflow: confirm and fill sessions automatically, wait for client loading (async/await), create a client world on load completion, and auto-fill concurrent matchmaking sessions. Includes optional private-session mode for testing. Designed to spawn and map local ghosts, dispatch player IDs, and reconcile with authoritative server snapshots when available
Matchmaking & loading preview (mobile)

Async loading & client-world creation

Client waits for asset and scene load with async confirmation hooks; upon completion we create the client ECS World and apply initial snapshot + local prediction buffers

Automatic matchmaking & session filling

Matchmaking fills sessions concurrently: join queue β†’ allocate session β†’ wait for load confirmations from players β†’ start when fill threshold or timeout is reached. Sessions are rotatable to multiple shards.

Private-session support (testing)

Private sessions with invite/PIN: testers can create private rooms that bypass public queue, still benefiting from async load confirmation and automatic world instantiation.

PlayerID dispatch & reconciliation

On join/confirm we map playerID β†’ local entity owner and keep deterministic replay buffers so server confirmations can be applied with minimal jitter.

I also worked on

Matchmaker queue service visualizer on VM

Implemented a concurrent session allocator with priority queues and configurable fill/timeout rules for automated session population, and built a VM-hosted visualizer to monitor queue progress(Note: the VM shell script used for the demo was not retained)

Deployment & multiplayer training support

Deployed the online infrastructure across multiple projects and provided hands-on training on multiplayer concepts and best practices. See the related project: Extractionz . This project reuses the same online architecture and multiplayer logic I developed

Project leadership & delivery coordination

Acted as project manager: coordinated with team leads to ensure timely feature delivery, streamlined development workflows, and made scope decisions, trimming or reprioritizing features when necessary to meet milestones

Network profiling & performance optimization

Used profiling and optimization tools to measure bandwidth usage, latency, and packet flow. Applied tuning strategies to minimize round-trip delays, reduce jitter, and maintain consistently low-latency multiplayer experiences

Continuous technical support & hands-on debugging

Provided ongoing technical support when bugs were encountered: partnered with other developers to investigate critical logic points, walked through and triaged complex issues, and in many cases handled fixes directly to keep systems stable

< What I learned /> // Suna impacted my learning and help me grow

Hard skills

Core technical abilities developed and applied across the project

  • Design and implementation of deterministic ECS client/server architectures
  • Matchmaking & session orchestration auto-fill, private rooms, shard rotation
  • Network engineering snapshot replication, client prediction & reconciliation
  • Profiling & optimization bandwidth analysis, latency tuning, jitter mitigation
  • Automation & ops VM deployment, service wrappers, and CI/CD for headless builds

Soft skills

Human skills that improved how I interacted with a team or person

  • Cross-team communication & mentorship explaining architecture to implementers
  • Project leadership prioritization, scope decisions and driving delivery with leads
  • Hands-on troubleshooting under pressure triage and quick reliable fixes
  • Adaptability switching between engineering, design and ops responsibilities
  • Constructive feedback & collaboration learning from critique and iterating fast
  • Humility recognizing others’ contributions and learning from teammates
Reflecting on the journey: this project significantly broadened my technical skillset from building deterministic ECS client/server flows and robust matchmaking systems to profiling networks and tuning latency-sensitive pathways I learned to design for resilience and scale rather than short-term feature parity

Interpersonally, the project strengthened my leadership and collaboration skills I coordinated with team leads to keep deliveries on schedule, provided hands-on debugging support when critical issues emerged, and helped translate architectural decisions into practical implementations Making scope decisions deciding when to trim features or refactor became a regular discipline

The two lessons that stuck were clear strong engineering architecture profiling reproducible debugging matters and so does the human layer communication humility teamwork Together they made the product better and helped me grow as an engineer and teammate

If I had to do it again I would do it differently with the knowledge I have now approaching challenges with sharper foresight and more deliberate prioritization

< Team /> // Amazing team of : Programmers β€’ Artists β€’ Contributors

Programmers :

Theo ARCA
Timotee BABOULIN
Adrien CLAUDE
Thomas COYNE
Aurelien REY
Leonnel HAMMEL

Artists :

Sarah BAST
Brice CARPINTEIRO
Camille GUINOT
Sebastien MENGUAL

Supporting Contributors :

Thomas CASAMENTO
Vincent PARDIGON
George Miller H.
Kylian MICHEL

Special Thanks :

Florian DELARQUE
Alexandre TERRIER
Sebastien THOMAS
Designed & hand-coded by Leonnel Hammel Β· Β© All rights reserved