Cthulu
Hobby Project
Overview
Love thine Fishies!
My Contribution
- Sole developer on this personal passion project, built alongside a friend — architecting the project from scratch while building hands-on depth in Unreal Engine and C++
Dev Logs
Fixed the digital static post-process effect for the CRT feeds — it needed to live in each cube's material directly (sampling the render target) rather than as a post-process on the SceneCapture2D, since that only affects the capture's internal framebuffer, not what the material actually samples. Then moved into camera-system architecture: a fixed first-person view where the player occupies discrete named positions (e.g. a desk with two poses, a cash register with one), transitioning via clicking interactables with constrained freelook per pose. Landed on a three-class split — ACameraAnchor (data-only, per-position transform + freelook cone), ACthuluCameraManager (owns transition/lerp logic), ACthuluPlayerController (thin, forwards clicks to the camera manager). ACameraAnchor is fully written; the camera manager is next.
Added a travelling static/noise band to the CRT monitor material. The first attempt pulsed the whole screen instead of showing a localized band — turned out the graph was missing a UV spatial mask (no TexCoord node), so the noise had no sense of screen position. Fixed by comparing TexCoord[0]'s V channel against a Frac(Time × Speed) band position, then shaping it with Abs → OneMinus → Saturate → Power for band tightness. Next: wire this up properly and consider driving speed via a Dynamic Material Parameter.
Starting from a completely empty map, learning Unreal from scratch. Got the base environment running (sky sphere, directional + sky light) and built the four in-world CRT monitor screens using SceneCapture2D actors feeding Render Targets, displayed via a shared master material. Iterated the CRT shader from a static scanline effect into a rolling scan-bar (Time → Frac scrolling a dark band vertically) after debugging a few disconnected node chains. Wrapped up by snapping the editor camera to the intended player viewpoint.
A pure architecture session — no code, and rightly so. The concept evolved significantly after a new art mockup: instead of flat UMG overlays, the game is now a persistent world of scene clusters connected by fast camera 'swoosh-and-settle' transitions, with a shadowbox parallax effect where depth layers subtly rotate around a pivot based on mouse position (background rotates least, foreground most). Locked in the core architecture spine: a PlayerController handling all raycasting, actors implementing an IInteractable interface to stay decoupled, and a camera transition system tying it together.
Solved surface-snapping for the placement system: a downward line trace from the cursor hits the plane mesh directly and returns the impact point, so placed objects sit cleanly on the surface without clipping. This means no separate collision or height maps are needed from the artist — real mesh geometry with Simple Collision enabled is enough.
First session. Locked in the foundational architecture: a 2D fish-tank management game built as a locked-camera 3D scene in UE5.7/C++ (chosen over Paper2D for better tooling support). Settled on a data-first build order — UMG sidebar as a visual test canvas, then a C++ inventory system that broadcasts an OnInventoryChanged delegate (UI listens, never talks back), owned by the Player class, wired together through the HUD. Also decided the sidebar would use a collapsible accordion pattern. Next: scaffold the UInventoryWidget C++ base class.