Minghao Zhou.
← All work

Project Good Boy

A character-driven puzzle game in Unreal Engine 5. I handle art assets, character modelling, rigging, animation and gameplay programming.

Role
Founder & Developer
Year
2025 — present
Tools
Unreal Engine 5, C++, Blueprint, Maya
Status
In development, pre-release

Overview

Good Boy (working title) is a puzzle-solving dog simulator. You wake as a dog in a streamer's bedroom with human intent and animal tools — no hands, only paws, weight, teeth and bark — and the only way out is to solve the room before she notices. Every locked drawer and high shelf becomes a problem of physics and timing, and the streamer who owns the room is both the obstacle and the clock.

The game runs on a repeating daily cycle: free exploration in the morning, supervision before the broadcast, real risk while she is live, then consequences and a reset at night. Hidden values track suspicion, affection and dream stability, and pushing too far ejects you from the loop.

It is a solo project, so it covers the whole path from modelling, rigging and animation through to gameplay code in C++ and Blueprint.

The dog controller

The central technical problem is that a long-bodied quadruped does not fit Unreal's upright, capsule-based character model. The controller is a bespoke C++ layer over Character Movement, built around that mismatch.

Locomotion is driven by Motion Matching rather than a hand-built state machine. Control Rig foot IK with per-foot locking removes the sliding that Motion Matching leaves during low-speed turns, and lets the front and rear feet find the floor independently on slopes and steps. Because secondary collision volumes do not push the root capsule, head clipping is handled with predictive sweeps before each move.

Production timeline

Development is documented in a 36-week log, grouped into eleven phases. The target is a ten-minute vertical slice: one room, one heroine, a handful of polished dog interactions and a single complete loop that ends on a narrative beat.

  • Weeks 1–3 · Nov — Finding the Dog. Settled the core fantasy, the single-room setting and the dog's limited set of verbs.
  • Weeks 4–6 · Nov–Dec — Building the Body. First contact with Unreal: the bespoke controller on Character Movement, and the decision to commit to Motion Matching.
  • Weeks 7–9 · Dec–Jan — The Room as a Puzzle Box. Narrowed the scope to a short bedroom experience, defined the streamer's daily schedule and drafted the system architecture.
  • Weeks 10–13 · Jan — Making the Dog Move. Motion Matching locomotion, rotation and camera behaviour, jump and fall logic, and the five-phase dream loop.
  • Weeks 14–17 · Feb — Bringing the World to Life. Idle variety, a NavMesh-driven heroine, grooms, in-room screens and ambient animation.
  • Weeks 19–21 · Mar — Polish and Structure. Custom camera collision, the limits of capsule collision, and a single diagram of the whole architecture.
  • Weeks 22–25 · Mar–Apr — Learning from Other Animals. Research into horse controllers and animal collision that fed back into the dog, and the decision to target a ten-minute slice.
  • Weeks 28–29 · May — Shaping the Demo. Consolidated the game's identity and defined the flow of the slice.
  • Week 30 · May — Interaction and Event Triggers. An interface-based interaction framework and overlap triggers that turn the room into a solvable puzzle.
  • Weeks 31–33 · Jun — Wiring the Loop. The heroine's perception and suspicion system, the first complete puzzle, and the full day-phase loop with night reset.
  • Weeks 34–36 · Jun–Jul — First Playable. Assembled the slice end to end, added foot locking and camera polish, and ran the first structured playtest.

Current status

The slice is playable start to finish and runs nine to twelve minutes. In the first playtest, testers understood being a dog immediately and reacted well to the moment of slipping past the heroine while she is distracted. The main finding is that suspicion needs a readable in-world signal, so being caught does not feel arbitrary, and that is the next design problem.