Design Goal
The Curse mechanic was designed as the central gameplay system of Cursed Friendship. By physically linking the Wizard and Monster through a spring-like connection, players were encouraged to coordinate their movement, communicate effectively, and solve puzzles collaboratively throughout the game.
The mechanic was intentionally designed to create both limitations and opportunities. While the curse restricted player movement and required cooperation, it also became a gameplay tool that players could strategically use to launch one another across gaps, assist with traversal, and introduce additional complexity to climbing sections and environmental puzzles.
Implementation
The initial implementation used Unity's built-in Spring Joint component alongside Visual Scripting to create the physical connection between both characters. While functional as an early prototype, the system introduced several technical issues that negatively impacted gameplay stability and performance.
To address these problems, I collaborated with another developer to redesign the mechanic using a custom C# implementation. Replacing the built-in Spring Joint provided significantly greater control over the behavior of the connection while improving stability, responsiveness, and compatibility with the game's other systems.
Technical Breakdown
The custom controller continuously compares the current distance between the linked rigidbodies with a configurable maximum distance. When the connection stretches beyond that limit, the script calculates the excess distance and applies equal and opposite forces to pull both characters back toward the valid range.
Challenges
Because the Curse mechanic interacted directly with many of the game's core systems, it became one of the most technically challenging features to develop.
- Conflicts with the Player Controller.
- Frame-rate dependent behavior affecting gameplay consistency.
- Interference with the Rock Climbing system.
- Character clipping and unintended movement.
- Conflicts with mantling and other traversal mechanics.
Resolving these issues required extensive debugging, profiling, and iterative testing. Through investigation and collaboration, we identified the built-in Spring Joint implementation as the primary source of many system conflicts. Replacing it with a custom C# solution eliminated the majority of these issues and significantly improved gameplay stability.






























