Stellar
Location
Stockholm
Date
2024
Team size
8
Role
Programmer
Engine
Unreal Engine
Overview
Stellar is the result of six weeks of work and collaboration by a diverse team of eight people. Our team was made up of three programmers, a visual effects artist, two 3D modelers, an animator, and a level designer. Together, we faced and overcame a variety of challenges, from developing a responsive AI companion to fine-tuning the camera system and designing engaging puzzles. Every step of the way, we worked closely to bring our ideas to life, resulting in a game that we’re proud of. "Stellar" is more than just a project; it’s a reflection of our combined efforts, creativity, and dedication.
Core features
During development, I focused on implementing several core features. These include:
AI Development
As the AI developer, I was responsible for programming the behavior of the in-game companion, the alpaca, which played a key role in solving puzzles. The alpaca was designed to assist the player by stepping on buttons or pressure plates and enabling the player to jump over obstacles.
In the initial AI design, I implemented various behaviors to make the alpaca feel more dynamic and alive. For example, if the alpaca stood still for too long, it would start wandering to random locations at random intervals. Additionally, the alpaca could be called to the player's side and directed to specific locations, such as standing on buttons or pressure plates. Another feature was that the alpaca would run away when it entered dark zones, adding an extra layer of interaction.
However, playtesting revealed that the random wandering behavior could lead to unpredictable and frustrating gameplay experiences. Since the alpaca could move to different locations at random times, it sometimes locked the player out of necessary actions, particularly in puzzle scenarios. To address this, I removed the wandering state, simplifying the AI to ensure that the alpaca's actions were more predictable and under the player's control. This change was crucial for maintaining a smooth and enjoyable gameplay experience.
Through this process, I learned valuable lessons about the importance of simple state machines and how sometimes, less complexity can lead to a better overall player experience.
Here’s the state machine that operated every frame. Each state had its own set of conditions for transitioning, allowing the system to switch to a new state based on these conditions.

Camera Systems
The camera system for our project evolved significantly over time, reflecting the changing needs of the game as it developed. Initially, the plan was to use static cameras to frame the action, giving the game a more cinematic feel. However, as the game world expanded into a more open and dynamic environment, it became clear that static cameras were no longer suitable. They restricted the player's view and didn't adapt well to the fluid nature of the gameplay.
In response to this, I explored and implemented a dynamic camera system using splines, which allowed the camera to move along predefined paths. While this approach offered more flexibility, it introduced new challenges, particularly with player movement. The spline-based camera system sometimes struggled to keep up with the player's actions, leading to disorienting shifts in perspective and making it harder for players to navigate the game world effectively.
After extensive testing and iteration, I ultimately designed and implemented a simpler, more effective camera system that followed the player using a spring arm mechanism. This approach provided a more consistent and reliable experience, ensuring that the camera was always positioned to give players a clear view of their surroundings. However, this solution came with its own set of challenges. The spring arm camera required careful level design to avoid obstacles and ensure that the camera movement remained smooth and unobtrusive.
Throughout this process, I gained a deep understanding of the complexities involved in camera design for games. I learned that different approaches to camera systems each have their own strengths and limitations. The key is to balance the technical capabilities of the camera with the needs of the gameplay, ensuring that the camera enhances the player's experience rather than detracting from it. This experience has given me valuable insights into how to create camera systems that are both functional and immersive, tailored to the specific needs of the game and its players.
First iteration
My initial camera system had a single camera that constantly rotated to face the player but only moved when the player entered a trigger box. Each trigger box specified a new location for the camera to move to. This approach caused several issues: the camera movement was frequent and abrupt, which led to erratic gameplay. Additionally, because the player movement logic relied on the camera’s orientation to determine directions (left, right, forward, and backward), this inconsistency affected the player's control and navigation.
Here is the blueprints for this system.




Second iteration
To enhance the camera system, we implemented a dynamic setup where the camera followed the player along splines and always rotated toward them. Although this improved the experience, it introduced new issues. Each time the camera changed angle or spline, it affected the player's movement because the movement controls relied on the camera's rotation.
Initially, we tried to mitigate this by only updating the camera reference when the player stopped giving input, which reduced the impact on movement controls. However, this solution was problematic if the player didn't stop moving and ended up behind the camera, causing the controls to invert.
Ultimately, we decided to base player movement on the world's rotation rather than the camera's, which provided more consistent controls but limited the camera's positioning relative to the player.

Third iteration(final)
In addition to the control issues, the camera's frequent movements were disliked by playtesters. To address this, we adopted a new approach using a local camera attached to the player via a spring arm (like a selfie stick). This setup kept the camera consistently behind the player, creating the impression that it was following them smoothly.
With this solution, we only needed to adjust the length and angle of the spring arm to achieve different perspectives. This led to more consistent movement and reduced camera shifts. However, it required careful level design to account for the fixed distance and single-axis angle adjustments of the spring arm.
This approach used a trigger box that, upon player entry, would set new target values for the selfie stick’s length and rotation. In the player’s update function, the camera smoothly interpolated to these new values using linear interpolation (lerp).

Puzzle Design and Implementation
In the later stages of the project, due to time constraints and an overwhelming workload on the project's level designer I had to involve myself in the game's puzzle design. Although my primary role was AI and camera systems, I collaborated closely with another programmer to conceptualize and implement all the puzzles featured in the game. Our goal was to create puzzles that were not only functional but also engaging for players, even though they did not fully align with the initial narrative and character development goals.
The puzzles we developed added necessary gameplay elements, ensuring that the game provided a challenge while maintaining player interest. We focused on designing puzzles that could be integrated seamlessly into the levels, working within the constraints of the existing game mechanics and environment. Despite the tight deadlines, we successfully delivered puzzles that were both innovative and technically robust, making a meaningful contribution to the final game.
This experience highlighted the critical importance of early planning and thorough documentation in game development. Had there been more time allocated to the planning phase, we could have aligned the puzzles more closely with the overall narrative and character arcs. Nonetheless, this challenge taught me the value of adaptability and teamwork, as well as the importance of balancing creativity with practicality under tight deadlines. The experience has deepened my understanding of puzzle design and reinforced the need for clear communication and collaboration in game development.
Customization System
I was responsible for developing the game's customization system, which enabled players to personalize their character's appearance. Initially, our approach involved more complex mesh and animation swaps, which allowed for a high degree of visual diversity but proved to be resource-intensive and challenging to manage. To streamline the process and optimize performance, we shifted to a more efficient method that relied on material and mesh changes.
The final system allowed players to start with a basic character mesh, which could then be customized by applying different materials to change the character's appearance. Accessories such as bags, hats, and other details were designed with a base shape, and their appearances could also be altered simply by changing their materials. These accessories were carefully attached to specific player bones, ensuring that they followed the character’s animations seamlessly, regardless of the customization choices made by the player.
This approach not only provided a wide range of customization options but also maintained the visual consistency and fluidity of the character's movements throughout the game. Despite some challenges, particularly with implementing the Save and Load functionality, I successfully delivered a working customization system by the final version. This experience underscored the importance of balancing creativity with technical efficiency, as well as the need for adaptable solutions in game development.
Sound System Implementation
I implemented a simple sound system that allowed players to adjust and save volume settings for different audio channels, such as music and sound effects. These settings were stored in a save slot, ensuring that the player's preferences were consistently applied across different scenes. When a new scene started, the system automatically loaded and applied the saved volume levels, providing a seamless audio experience throughout the game.

Team Collaboration and Support
Throughout the project, I played an active role in collaborating with other programmers, offering assistance and guidance whenever needed. I advocated for more modular and structured code practices, emphasizing the importance of creating maintainable and understandable code, especially in a team environment. Additionally, I stepped up to take on extra responsibilities, including level design and puzzle implementation, to ensure that the project stayed on track and met its deadlines. My contributions helped to keep the team aligned and the project progressing smoothly, even when key tasks were at risk of falling behind.
Personal Development and Lessons Learned
This project provided valuable learning experiences, particularly in AI development, camera systems, and project management. I realized the importance of clear documentation, structured planning, and early prototyping to avoid unnecessary work and ensure that all team members are aligned with the project goals. Moving forward, I will emphasize the importance of setting clear deadlines, maintaining regular team check-ins, and fostering open communication within the team to avoid the issues encountered in this project.








