Ultrakill-Slideshow

In periode 2 van schooljaar 2024 – 2025 kregen we een slideshow en kon je kiezen welke game je moest namaken. Ik had toen Ultrakill gekozen en gingen we samenwerken met Game-Artists. Het groepje bestond uit 3 Game-Developers en 3 Game-Artists. We  deden er ongeveer 10 weken over om het spel na te maken.

Health en stamina systeem

public class PlayerHealth : MonoBehaviour
{

    [Header("Health Settings")]
    [SerializeField] private float maxHealth = 100f;
    private float currentHealth;

    [Header("UI")]
    public Slider healthBar;
    public GameObject deathScreen; 
    void Start()
    {
        //Geeft de speler max health als je begint met het spel.

        currentHealth = maxHealth;

        if (healthBar != null)
        {     
            healthBar.maxValue = maxHealth;
            healthBar.value = currentHealth;
        }

        if (deathScreen != null) 
        { 
            deathScreen.SetActive(false);
        }
    }

    void Update()
    {
        //Geeft 10 damage als je op Q drukt.

        if (Input.GetKeyDown(KeyCode.Q))
        {
            TakeDamage(10f);
        }

        //Geeft de speler 10 health terug als je op E drukt.

        if (Input.GetKeyDown(KeyCode.E))
        {
            Heal(10f);
        }

        //Restart de game als je dood gaat en een death screen krijgt.

        if (deathScreen.activeSelf && Input.GetKeyDown(KeyCode.R))
        {
            RestartGame();
        }
    }

    public void TakeDamage(float damage) 
    { 
        //Zorgt ervoor dat als je damage krijgt dat het van de healthbar af gaat.
        currentHealth -= damage;
        currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);

        if (healthBar != null) 
        {
            healthBar.value = currentHealth;
        }
        //Als de speler minder dan 0 health heeft gaat de speler dood.
        if (currentHealth <= 0)
        {
            Die();
        }
    }

    public void Heal(float amount) 
    { 
        //Zorgt ervoor dat als je healed dat je health bij je healthbar krijgt.
        currentHealth += amount;
        currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);

        if (healthBar != null)
        {
            healthBar.value = currentHealth;
        }
    }

    private void Die() 
    {
        //Zorgt ervoor dat als je dood bent dat het de deathScreen activeert en de tijd van de spel op stop zet.
        Debug.Log("Player is dead!");
        if (deathScreen != null) 
        {
            deathScreen.SetActive(true);
        }
        Time.timeScale = 0f;
    }

    public void RestartGame()
    {
        //Zorgt ervoor dat als je de spel restart dat de tijd weer doorgaat en dat de scene wordt terug geladen.
        Time.timeScale = 1f;
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}

Health script

public class PlayerDash : MonoBehaviour
{
    [Header("Movement Settings")]
    public float moveSpeed = 5f; 
    public float dashSpeed = 20f;
    public float dashDuration = 0.2f;
    public float dashCooldown = 1f; 

    private CharacterController controller;
    private Vector3 moveDirection;
    private bool isDashing = false;
    private float dashTime;
    private float lastDashTime;

    [Header("Camera Settings")]
    public Transform cameraTransform;
    public float dashShakeIntensity = 0.1f;

    [Header("Stamina Settings")]
    public int maxDashes = 3;
    private int currentDashes;
    public float staminaRechargeTime = 3f;
    private float staminaRechargeTimer;

    [Header("UI")]
    public Slider staminaBar; 
    void Start()
    {
        //De speler begint met max 3 dashes als je de game opstart
        controller = GetComponent<CharacterController>();
        currentDashes = maxDashes;

        if(staminaBar != null)
        {
            staminaBar.maxValue = maxDashes;
            staminaBar.value = currentDashes;
        }
    }

    
    void Update()
    {
        if (!isDashing)
        {
            HandleMovement();
            HandleDashInput(); 
        }
        else 
        {
            DashMove(); 
        }
        RechargeStamina();
    }

    //Zorgt ervoor dat de player kan bewegen in de goeie directie. 

    void HandleMovement()
    {
        float moveX = Input.GetAxis("Horizontal");
        float moveZ = Input.GetAxis("Vertical");

        moveDirection = (cameraTransform.forward * moveZ + cameraTransform.right  * moveX).normalized;
        controller.Move(moveDirection * moveSpeed * Time.deltaTime);
    }

    //Zorgt ervoor dat de player max 3 keer kan dashen met Left shift.

    void HandleDashInput()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift) && currentDashes > 0)
        {
            StartDash(); 
        }
    }


    //Zorgt ervoor dat de dash begint en neemt ook stamina af als je dashed.
    void StartDash()
    {
        isDashing = true; 
        dashTime = Time.time + dashDuration;
        lastDashTime = Time.time;

        currentDashes--; 

        if (staminaBar != null)
        {
            staminaBar.value = currentDashes;
        }
    }

    //Zorgt ervoor dat de player dashed in de goeie richting met de juiste velocity.

    void DashMove()
    {
        Vector3 dashVelocity = moveDirection * dashSpeed; 
        controller.Move(dashVelocity * Time.deltaTime);

        cameraTransform.localPosition += Random.insideUnitSphere * dashShakeIntensity; 

        if (Time.time >= dashTime)
        {
            isDashing = false; 
            cameraTransform.localPosition = new Vector3(0, 1.8f, 0);
        }
    }

    //Laat de player stamina rechargen na een paar secondes.

    void RechargeStamina()
    {
        if (currentDashes < maxDashes)
        {
            staminaRechargeTimer += Time.deltaTime; 

            if(staminaRechargeTimer >= staminaRechargeTime)
            {
                currentDashes++;
                staminaRechargeTimer = 0;

                if(staminaBar != null)
                {
                    staminaBar.value = currentDashes;
                }
            }
        }
    }
}

Dash script