Samson Wu Logo Image
Samson Wu
Steam trailer for Project Dreamscape.

Project Dreamscape - Overview

Project Dreamscape is a surreal 3D hack-and-slash roguelite where you shape your dreamworld and powers while battling inner demons. Expand your dream one land at a time and unleash combos with a shape-shifting hammer to survive the night. This game was developed by the Studio Aspen team of 2024-2025, a student-led AAA simulation studio from EGD Collective.

  • Role: Programming Producer
  • Platform: PC
  • Engine: Unity
  • Team Size: 100+
  • Duration: 9 months
  • Build: Steam
  • Source: GitHub

Technologies

C#
Unity 2022
GitHub
Wwise
Blender
Agile Development

My Role

As Programming Producer, I led the technical direction of core systems architecture and ensured scalable, designer-friendly tools were in place to support gameplay and content creation. I was responsible for programming all of the base systems in the game for my team to build on top of:

  • Entity system
  • AI navigation
  • Combat system
  • World building system
  • Status effects
  • Abilities
  • UI tweens

Highlights

Entity System & Character Controller

Dreamscape entities showcase GIF
State Machines, SOLID Principles
Read more

Status Effect System

Dreamscape status effects showcase GIF
ScriptableObjects, Strategy Pattern
Read more

Entity System & Character Controller

Goal

I wanted to build a flexible system to manage players, enemies, and allies under a single framework.

Solution

I setup a powerful Entity base class to serve as the foundation for all character-like objects in the game. To manage behavior, each entity maintained its own internal state machine. I used C# Action events as interaction hooks within the Entity class. This allowed dynamic behavior to be added or extended without modifying the core entity logic. This Open-Closed approach created a modular and decoupled workflow, making the system more flexible and easier to maintain.

Entity system diagram
Class diagram of entity inheritance structure.
Entity system action
One of the actions housed inside the Entity base class. I made sure to always write system documentation compatible with intellisense for these actions, making it clear for other developers.

The Evolution of Entity State Machine States

My goal was to create designer and editor friendly states but my original approach had many flaws.

Iteration 1: Pure C# State Classes

Problems:
1. All variables lived in the massive Entity-inherited class, breaking encapsulation.
2. The inspector became very cluttered, making certain variables hard to find.

Entity system iteration 1
Cluttered monolith entity class containing variables from each state.

To solve these problems, I had to move variables and methods to their individual states, utilizing the Single Responsibility Principle. I turned the states into Monobehaviours for serialization and editor collapsible components.

Iteration 2: Monobehaviour State Components

Problems:
1. Huge memory overhead for each state since every entity carried 5+ states that do not fully use the functionality of Monobehaviours.
2. Every derived entity prefab needed manually added required state components, including ones from the super class.

Entity system iteration 2
Single Responsibility Principle with component-based states.

To address the Monobehaviour overhead, I reverted the states back to pure C# classes, but with serialization instead. This made designer and editor friendly collapsible dropdown config menus that looked very neat in the inspector.

Final Iteration: Serialized Pure C# States

Entity system iteration 3
Reduced memory overhead with pure C# classes and neat collapsible state configs.

Remaining Challenges:
1. Inheritance conflict: Serialized inherited states would show as duplicates in the inspector.
2. Needed a custom editor script to clean up the inspector.

Outcome

While there are still problems with my current implementation of Entity states, it does the job that it needs to for this project. I'm already happy that I was able to decouple state logic, balance memory, and improve editor usability while building a powerful and scalable entity framework.

Entity system showcase
Entities (player and enemies) running around the world.

Status Effect System

Goal

I needed a system that could apply and manage buffs, debuffs, and passive effects for both players and enemies. These effects needed to be modular, time-based, and optionally stackable.

Solution

I designed a modular component called EntityStatusEffector, which could be added to any entity. Status Effects were implemented as ScriptableObjects using a shared base class: StatusEffectSO. I also made two major subclasses for different timing behaviors, duration-based and tick-based. Each status effect inherited behavior through many lifecycle methods, giving me full control in a designer-friendly ScriptableObject format. This utilized the Strategy pattern, avoiding spaghetti code that would result from a large switch statement.

Status effects diagram
Class diagram of status effects and inheritance structure.

Limitations

Effects are stored by type, meaning each entity can only hold one instance of a given effect. This means that you can't reuse the same effect type, but with different configs, on one entity unless explicitly stacking and overriding.

Outcome

This system powered many unique passive abilities in the game, especially from our Aspects system. Effects could be added or removed dynamically during runtime. Designers could also easily tweak the configurations of these ScriptableObject status effects through the inspector.

Bomb status effect scriptable object
An example of the Bomb Elite status effect that is applied to elite enemies on spawn.
Bomb status effect enemy
Bomb elites explode after death as shown in the GIF. All Bomb Elite status effect settings are configurable in the editor.

Reflection

Although Project Dreamscape was missing most art assets and polish, I'm still proud of how far it came. Releasing it in early access on Steam was a major milestone, and a first for many people in the studio. This was my first time in a leadership role and my first experience working in a large, interdisciplinary team. Through it, I learned a lot about designing scalable game architecture and effective cross-discipline collaboration, and I hope to bring this knowledge forward to a future game.