MOBA-Style Game Client

Disclaimer

This project was built as a close study of an existing commercial game, so out of respect for their IP, no images or videos will be shown publicly.

About

Full-featured MOBA-style game client prototype with custom client-server networking, real-time chat system, friends list, profile customization, custom rooms, complete playable character ban/pick phase with polished UI. Solo 3-month project pre-industry and first time using Unity.

History

I love playing PC MOBA games and daydreamed about tossing in characters from anime or other games with unique abilities. Planned a full MOBA with custom characters, then my friend showed me Unity (perfect for prototyping). Realized every MOBA starts with that lobby hub (news, store, chat, queues), so I dove into building the client first.

SubTasks

  • Network
  • Chat System
  • Profile and Friends
  • UI Prefabs with Audio and VFX
  • Persistent Settings
  • Animation Control
  • Custom Game Rooms with State Machine
  • Game Modes

Challenges

Networking & Client-Server Architecture

Needed a full client-server flow with an authoritative server so multiple clients could interact through a single MOBA-style game client, built as a solo project before any industry experience.

Approach

  • Created a dedicated server project instead of compiling client and server from one solution with macros, and factored shared message definitions into common modules to keep networking code consistent across both.
  • Evaluated Unity's low-level and high-level networking APIs and chose the UnityEngine.Networking HLAPI to ship faster while learning core networking patterns.
  • Implemented a configurable server host (user-specified port, displayed IPv4) so clients could connect using that address, making it easy to relocate or restart the server without code changes.

Lessons & Future Improvements

  • Initial implementation sent messages immediately on events without explicit replication strategy; if revisiting this today, I would introduce separate replication instances for chat, profile/status, custom game room search, and ban/pick.
  • Ban/pick would run on a high frequency, authoritative channel to guarantee consistency, while lower priority systems (chat, profile, room search) would use less frequent replication to reduce traffic and simplify debugging.

Lobby / Custom Room System Design

Needed a custom room system that supported multiple game modes (Blind Pick, Draft Pick with ban/pick phase, All Random) with room metadata (name, password, mode, team/spectator sizes, owner) and live state sync for bans, picks, swaps, and chat between clients and an authoritative server.

Approach

  • Implemented a CustomRoom type to represent a single room and a CustomRoomDatabase manager attached to a Unity object to own all active rooms, route server messages, and drive state transitions (lobby → ban → pick → ready).
  • Encoded per-mode rules inside the room logic (e.g., no duplicate champions per team in Blind, structured ban/pick turn order in Draft, automatic random assignment in All Random), and exposed room searches over name/mode so players could find and join the right match.

Lessons & Future Improvements

  • Current design packs all modes into one room class, making new modes hard to add. Next iteration would introduce a base Room with create/join/destroy and per-mode subclasses to handle ban/pick and flow rules, following an OO strategy style.
  • Group chat handling lives inside the room; this should be pushed into a dedicated chat system with a clean API, so the room only triggers chat events.
  • Several values (like timers) are hard-coded. These should be moved into data tables/config to let designers tweak timings without code changes.

Client UI & Platform Polish

Needed a non-blurry, modern UI for a desktop MOBA-style client, with custom controls, persistent settings, and a borderless window that behaved like a real game launcher instead of a stock Unity window.

Approach

  • Replaced legacy UnityEngine.UI text with TextMesh Pro as the primary text system to improve sharpness and styling, and built custom UI prefabs (buttons, dropdowns, toggles, radio buttons) plus a small UI animation controller for tab selection and hover/press feedback using particles and Unity's video API for the login animation.
  • Implemented persistent settings and “remember my username” by caching a config file in the user's Documents folder (resolution, audio, username, disable login animation/music) and loading it on startup.
  • Created a Windows-specific bootstrap class that calls into OS APIs to create a borderless window and fully support runtime resolution changes from the in-client options menu.

Lessons & Future Improvements

  • Current approach requires manual replacement of assets like login music/animation. A next step would be to add a lightweight patch/update pipeline where the client checks for updated assets on startup and downloads them into a local cache, avoiding manual file edits.
  • Prefab variants and more data-driven UI (e.g., JSON or ScriptableObjects for control themes and animations) would make it easier to maintain multiple visual styles and tweak UX without code changes.

Project information

  • Environment Unity 2018.2.11f1 and C#
  • Project date 17 Sept - 26 Nov, 2019
  • Game Designer
    & Programmer
    & QA
    CJ Kim
  • Inspired by MOBA games