Operations Overview
m00m world is a mobile video game that is free to play, always available, and ever-evolving. It is based on a mixture of the latest technologies, highlighted below.
Connection Flow
Upon opening the m00m world app, a connection is established with Firebase. This includes an authorization status listener, and when authorized, begins listeners for tracking user inventory, unlocks, and more.
Clients open the m00m world app and pick a destination (Open World, Interior, etc). These are defined by Scriptable Objects of type ServerScene, which declare a hosting type to use. For example, Interior scenes typically utilize a Shared Mode setting, putting Fusion 2 into a peer-to-peer mode, while Open World scenes use a Dedicated Mode setting, which connects to a dedicated server hosted on Unity Game Services (UGS).
Clients then initiate a connection via Fusion 2, which coordinates room creation and connection between Proxies & Server or all Distributed Authorities.
Game Engine
m00m world is built using the Unity game engine, which allows us to create a rich, interactive 3D environment that runs smoothly on mobile devices. Unity's flexibility enables us to rapidly prototype and iterate on gameplay features.
Our Unity workspace has been enhanced with a number of Tools and Keybinds to streamline development and improve productivity.
Services & Platforms
Live Service Support
m00m world is built on a combination of cloud services, including:
- Firebase: For real-time Firestore database, authentication, and cloud functions.
- Unity Game Services (UGS): For game backend services, including centralized server hosting, server orchestration, and analytics. Also known as Multiplay Hosting.
- GitHub: For version control and collaboration on the codebase, including the Art Project submodule.
- Photon Fusion 2: For real-time multiplayer networking, enabling players to interact in a shared environment. Networking layer inside of Unity
- Vivox Voice: For in-game voice chat, allowing players to communicate seamlessly during gameplay.
Editor Tooling
m00m world utilizes a combination of industry standard and in-house tools to enhance the development experience:
- Unity Editor: The primary development environment for creating and managing game assets, scenes, and logic. Extended with custom editor tools to improve workflow.
- Odin Inspector: A powerful Unity plugin that enhances the editor with advanced serialization, custom inspectors, and improved workflow for managing complex data structures.
- Addressable Assets: A Unity system for managing and optimizing game assets, allowing for efficient loading and memory management.
- Rider: A cross-platform IDE for Unity development, providing advanced code editing, debugging, and refactoring capabilities.
- XCode and Android Studio: For building and deploying the game to iOS and Android devices, respectively.
- Webstorm, React (Vite), and Tailwind: For web development, including the m00m.world website and any web-based tools or dashboards.
Architecture & Structure
Two Project Structure
m00m world has a two-project structure, an Art Project (AP) and a Game Project (GP). The Art Project is where all the assets are imported, optimized, managed, and versioned. The Game Project is where the game logic, mechanics, and interactions are implemented.
If it affects how it looks, work in the Art Project. If it affects how it works, work in the Game Project.
Accessing the Art Project Files:
GameProject Github/ ├── m00m/ │ ├── Assets/ │ │ ├── ArtProject/ ← Art Project submodule │ │ │ ├── Assets/_m00m_/ │ │ │ │ ├── Assets/ ← Raw imported assets. FBX are not to be used directly. │ │ │ │ └── Prefabs/ ← Game-ready prefabs │ │ ├── m00m/ ← Game Project assets │ │ │ ├── Scenes/ ← Game scenes │ │ │ ├── Scripts/ ← Game logic and mechanics │ │ │ └── Prefabs/ ← Game prefabs └── .gitmodules ← References the Art Project as a submodule
The Art Project is embedded into the Game Project as a Git submodule, allowing us to independently version and iterate on both art and gameplay assets, preventing teams from stepping on each other's toes.
Always create a Prefab Variant of a GameObject that uses an asset from the Art Project, then alter and use that Prefab Variant instead.
Using the Art Project assets inside the Game Project is a ONE WAY STREET. Do not alter assets inside the Art Project structure from within the Game Project, as your changes will be overridden.
Updating the Art Project (in the Game Project)
To update the Art Project in the Game Project, run git submodule update --remote --force in the Game Project Github root directory (not /m00m/Assets/etc). This will pull the latest changes from the Art Project. Yes, you must use force.