The development of this project has been without any doubt the hardest and most time consuming subject in all the degree, and I don't regret having spent a single hour of my time on it. Being a part of the team has let me know people I hadn't talked as much in the degree as I liked to, connect more with them and collaborate to create an amazing game. In the team we have great people who have shown how creative and effcient they can be and have helped me grow and learn. Improving and expanding our engine, allong with programming the enemies and other gameplay elements has helped me learn C++, C# and how important it is to write functional, safe and readable code. Spending the last month of the Project doing QA and bugfixing has made me learn how to find errors more easily and fix them in a clean and creative way. Finally, spending 13 weeks as a scrum master has taught me how to be a better lead and managing time and tasks so we can accomplish them without delays and trying to get the best result possible. The entire Project has been a great way to learn hard and soft skills and an experience I will remember with affection despite the hard times.
In order to optimize our game animation system we switched from traditional skeletal animation to shader animation. It allowed us to move the processing from the CPU to the GPU, taking advantage of its multihtreading capability. We had to rework the entire system but it was worth witout any doubt, it decreased the time to calculate the new position of the mesh vertices to one fifth of its original value.
To keep FPS high, the way animations were loaded, set and reproduced was optimized. I made that instead of having to iterate each bone identifying it by its name, when the animation is played, every bone is identified and saved in a Look Up Table from where it will be iterated from then on. Before this optimitzation only 6 characters consumed the same as the ones in the gif, in which there are almost 400.
For fast scene editing and character and prop iteration we implemented our own prefabs system. In its usage we tryied to replicate Unity as much as possible so the members of the team could easily adapt to it and using them was intuitive.
- Create prefabs from any kind of game object placed in the scene.
- Override them in real time.
- Unlink it converting to a normal GameObject
- Set prefabs inside prefabs.
- Instantiate them from script.
Moving entities in scene can be a hard task if there is not a pathfinding system in the engine. Recast is an open source library which can easily create NavMeshes from meshes in scene. It comes with Detour, a pathfinding and spatial reasoning toolkit. Knowing about the existence of such a powerful toolkit we couldn't resist integrating it into Diamond Engine. With its implementation we accomplisehd that the usaer could:
- Create NavMeshes from static objects.
- Find a path easily between two points of the NavMesh.
- Find a point in the NavMesh around another point.
- Check if a path between two points can be created.
- Use all of its functionality from C#.
For GameObject differentiation I implemented a basic tags system which lets the user:
- Create new tags and remove existing ones for every scene, using only those necessary for every scene.
- Assign them to GameObjects in scene or prefabs.
- Compare tags directly from C#.
In order to use C++ functionality from C# I implemented a full variety of functions for different systems such as:
- Animator Component.
- Camera management.
- Drawing rays.
Many people have used the engine through the development of the game, and to work faster and more confortably it is important to constantly make minor changes in the way it is used depending on the team needs.
- Auto detect which files need to be reimported, including the ones changed by someone else and received by GitHub.
- Drag & dropping materials into the inspector to add them.
- Easy addition of animations into Animator Component dragging & dropping FBXs.
During the second half of the Project I moved from engine extension to gameplay programming. What I spent most time on was in the enemies implementation. During this period I participated in:
- Enemies state machine development, general behavior and polishing.
- Integrate the pathfinding system into their behavior.
- Polishing interaction feedback.
- Fix behavior artifacts.
- Create a first and second version of the Spawn Manager.
During the development of the game minor bugs may be accumulated and not taken into account. For the last month of the project I was responsible of directing the scrum destinated to identify all the bugs possible and fix them.
My scrum ended up touching almost every system of the game due to the fact that game development implies that sometimes some tasks may be rushed and this can bring to code which lacks important nullchecks, does not completely accomplish its purpose or requires some optimitzation. For this reason we constantly made testing and tried to solve all the bugs reported by the rest of the team. It also meant having to do an entire rework of scripts such as the postboss shop, the damaging water and part of the boons.