Slipstream

Slipstream Project Description

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.

What I made

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.

International Teamwork

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.

Project Info

Made with - Unity, C#, Blender
Released - 1 July 2025
5 week project, 5 person team

Click here for GitHub

Click here for itch.io

Slipstream Screenshot 1 Slipstream Screenshot 2 Slipstream Screenshot 3 Slipstream Screenshot 4 Slipstream Screenshot 5 Slipstream Screenshot 6

Color Picker Script (for the crosshair)


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;
    }
}