Instead of relying on Unreal’s Water plugin, I built a custom stylized water shader and buoyancy system to have more control over how it performed, behaved, and looked in-game. The focus wasn’t realism — it was creating water that felt clear, stable, and reliable for gameplay.
The water uses an opaque material rather than a translucent one, helping reduce overdraw and avoid common sorting issues. This keeps it more performance-friendly while still achieving a strong stylized look.
The material is parameter-driven, making it easy to adjust color, surface motion, and highlights through instances without changing the core shader.
For buoyancy, I developed a custom float-point setup. Multiple points are distributed across the object, each checking how submerged it is and applying force accordingly. Torque is then calculated so the object can tilt and stabilize naturally as it moves across the surface.
The goal was to create motion that feels believable without becoming unpredictable — especially important for gameplay interaction.
Building the system from scratch also made it easier to tune both performance and behavior as the project evolved.