I made this game during a student exchange my school (from the Netherlands) did with a school in
Finland.
This game is a 3D first-person parkour game. It takes place in a cyberpunk world.
You run away from a drone that tries to catch you. It's your goal to collect as many checkpoints as
possible before the time is up or you get caught.
which in a parkour game is one of the most important aspects, so to make sure he could fully focus on
this, I did everything else.
I made the drone, game manager, screenflow, menus, and UI, and I made the settings, which also have
a save and load.
Together with the artists, I made the levels; I did the tutorial level myself.
The thing I am most happy with is the crosshair picker. You can choose a crosshair, color, size, and
transparency.
This was a lot of fun to make, and it even saves your crosshair settings with a save and load.
Working together with a team consisting of people from different countries was very challenging.
But I am very happy with the experience and everything I learned from this exchange. And my teamwork
skills have developed a lot.
What I mostly learned was how important planning meetings are. And how you can properly set up a
schedule for them, etc.
Also, doing a project fully in English and for parts of it online helped further my communication
skills.
Made with - Unity, C#, Blender
Released - 1 July 2025
5 week project, 5 person team
public class ColorPickButton : MonoBehaviour
{
[SerializeField] private Settings settings;
[SerializeField] private Texture2D colorChart;
[SerializeField] private Image crosshairIMG;
[SerializeField] private GameObject chart;
[SerializeField] private RectTransform cursor;
[SerializeField] private Image cursorColor;
[SerializeField] Slider alphaSlider;
[SerializeField] Slider sizeSlider;
private void Start()
{
alphaSlider.value = settings.CrosshairColor.a;
sizeSlider.value = settings.CrosshairSize;
}
private void Update()
{
// Set the size and transparency (alpha) of the preview image
settings.CrosshairColor.a = alphaSlider.value;
settings.CrosshairSize = sizeSlider.value;
if (crosshairIMG.color != settings.CrosshairColor)
crosshairIMG.color = settings.CrosshairColor;
crosshairIMG.gameObject.transform.localScale = new Vector3(settings.CrosshairSize, settings.CrosshairSize, settings.CrosshairSize);
}
// This function gets called when you click somewhere on the color chart
public void PickColor()
{
RectTransform _chartRect = chart.GetComponent();
Vector2 _localPoint;
if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(_chartRect, Input.mousePosition, null, out _localPoint))
return;
// Get the position of the mouse cursor on the rect transform (color chart image)
cursor.transform.position = Input.mousePosition;
float _pivotX = _chartRect.pivot.x;
float _pivotY = _chartRect.pivot.y;
float _normalizedX = (_localPoint.x / _chartRect.rect.width) + _pivotX;
float _normalizedY = (_localPoint.y / _chartRect.rect.height) + _pivotY;
int _texX = Mathf.Clamp(Mathf.RoundToInt(_normalizedX * colorChart.width), 0, colorChart.width - 1);
int _texY = Mathf.Clamp(Mathf.RoundToInt(_normalizedY * colorChart.height), 0, colorChart.height - 1);
// Get the color of the clicked pixel from the rect transform
Color _pickedColor = colorChart.GetPixel(_texX, _texY);
// Set the preview image to the selected color and save this color in the settings
cursorColor.color = _pickedColor;
settings.CrosshairColor = _pickedColor;
crosshairIMG.color = _pickedColor;
}
}