5. týždeň

Unity Engine Lab Bonus

Vytvorenie jednoduchej hracej logiky

Intro

Na Unity Engine Lab 1 sme si ukázali základy pre vytvorenie prostredia a hráča. Za pomoci skriptov si už však takýto jednoduchý projekt dokážeme pozmeniť na primitívnu hru.

Návod je je veľmi rýchly a na vypracovanie môžete použiť vlastnú hru.

Postup

Krok 1: Vylepšenie pohybu lode

Pomocou vylepšenia skriptu o možnosť pohybu po Y-ovej osi a rotácie lode, bude pohyb lode reálnejší a príjemnejší na ovládanie.

using UnityEngine;

public class MovementScript : MonoBehaviour
{
    [SerializeField] private float moveSpeed = 30f;      // Forward/Backward speed
    [SerializeField] private float strafeSpeed = 7f;     // Left/Right speed
    [SerializeField] private float verticalSpeed = 5f;   // Up/Down speed
    [SerializeField] private float rotationSpeed = 200f; // Rotation speed

    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        rb.useGravity = false;
    }

    void Update()
    {
        HandleMovement();
        HandleRotation();
    }

    private void HandleMovement()
    {
        // Get movement input
        float moveForward = Input.GetAxis("Vertical");   // W/S - Forward/Backward
        float moveSideways = Input.GetAxis("Horizontal"); // A/D - Strafe Left/Right
        float moveUpDown = 0f;

        if (Input.GetKey(KeyCode.Space)) moveUpDown = 1f;   // Space - Move Up
        if (Input.GetKey(KeyCode.LeftControl)) moveUpDown = -1f; // Left Ctrl - Move Down

        // Compute movement vector
        Vector3 moveDirection = transform.forward * moveForward * moveSpeed;
        Vector3 strafeDirection = transform.right * moveSideways * strafeSpeed;
        Vector3 verticalDirection = transform.up * moveUpDown * verticalSpeed;

        // Apply movement
        rb.velocity = moveDirection + strafeDirection + verticalDirection;
    }

    private void HandleRotation()
    {
        // Get rotation input
        float rotateYaw = Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime; // Rotate left/right (A/D)
        float rotatePitch = Input.GetAxis("Mouse Y") * rotationSpeed * Time.deltaTime; // Tilt up/down (Mouse Y)
        float rotateRoll = -Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime; // Roll (Mouse X)

        // Apply rotation
        rb.angularVelocity = new Vector3(rotatePitch, rotateYaw, rotateRoll);
    }
}

Následne môžeme používať myš na rotáciu hráča a tak aj realistickejšie ovládanie.

Poznámka

V prípade, že nemáte pre hráča skript vytvorený na pozmenenie. Pozrite si postup v Unity Engine Lab 1 na konci návodu o skritách.

Krok 2: Pridanie respawnu a efektu pri kolízii

Aby naša provyzorná hra mala zmysel a nebola príliš jednoduchá potrebujeme hráčovi umožniť aby zlyhal.

Túto funkcionaliu zabezpečíme pridaním respawn pointu - označeného Emty Objectom. Kliknite pravým tlačidlom na Hierarchy -> Create Empty a presuňte tento objekt na miesto, kde chcete aby sa hráč ocitol po kolízii.

Po kolízii musíme dať hráčovi najavo, že jeho loď sa znefunkčnila. To zabezpečíme vytvorením vizuálneho efektu pomocou Particle System. Kliknite pravým tlačidlom na Hierarchy v svojom Player Rig s hráčom -> Effects -> Particle System. Tento efekt bude znázorňovať výbuch po kolízii

Pre čo najpresvedčivejší efekt exlózie si môžete nastaviť Particle System podľa seba, tieto by však mali stačiť: Main Settings Duration -> 1 Looping -> Uncheck Start Lifetime -> 0 Start Speed -> 5 Start Size -> 1 - 3 Start Color -> Orange/Yellow Gravity Modifier -0.5

Emission Settings Rate over Time -> 0 Burst -> Add Burst -> Time = 0, Count -> 50

Shape Settings Shape -> Sphere Radius -> 1-2

Posledný finálny a najdlôležitejší krok je pridanie skriptu a pridelenie efektu spolu s respawnom. Nazvať si ho môžeme PlayerCollisionHandler a priradenie exlózie a respawnu môžeme zabezpečiť pretiahnutím objektu z hierarchie do inšpektora ku vytvorenému skriptu, kde budú vytvorené polia na tieto objekty.

using System.Collections;
using UnityEngine;

public class PlayerCollisionHandler : MonoBehaviour
{
    [SerializeField] private float delayBeforeAction = 1f; // Delay before executing action
    [SerializeField] private GameObject explosionEffect; // Assign explosion effect prefab in Inspector
    [SerializeField] private Transform respawnPoint; // Assign respawn position in Inspector

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Terrain")) // Check if player collides with terrain
        {
            Debug.Log("Player collided with terrain! Taking action in " + delayBeforeAction + " seconds.");
            StartCoroutine(HandleCollisionAfterDelay());
        }
    }

    private IEnumerator HandleCollisionAfterDelay()
    {
        yield return new WaitForSeconds(delayBeforeAction); // Wait for set time

        // Play explosion effect
        if (explosionEffect != null)
        {
            Instantiate(explosionEffect, transform.position, Quaternion.identity);
        }

        // Respawn player
        if (respawnPoint != null)
        {
            transform.position = respawnPoint.position;
            transform.rotation = respawnPoint.rotation;
        }

        Debug.Log("Collision effect executed.");
    }
}

Explózia pomocou Particle System
Obr. 1: Explózia pomocou Particle System

Krok 3: Pridanie prekážok a správneho používania kolízie

Pre správne usmernenie hráča potrebujeme dráhu, ktorú bude musieť prejsť. Pri našej primitívnej hre tak môžeme zabezpečiť vytvorením jednoduchých prstencov, cez ktoré bude hráč prelietavať.

Prstenec však nenájdeme v 3D Objects menu po pravým kliknutím na našej hierarchy. Vieme si ho však vytvoriť týmto jednoduchým spôsobom:

  1. Nainštalovanie ProBuilder-a
  • Window -> Package Manager
  • Vyhľadaj ProBuilder a klikni Install
  1. Vytvorenie tvaru
  • Prejdi do Tools -> ProBuilder -> ProBuilder Window pre otvorenie Panelu s ProBuilder-om
  • Klikni na New Shape
  • Nastav Shape na Torus (to bude predstavovať náš prstenec)
  1. Nastavenie prstenca
  • Nastav parametre prstenca podľa potrieb a dožadovanej zložitosti prelietavania s loďou
  • Klikni Build a následne môžeme s prstencom narábať, ako s klasickým 3D objektom v Hierarchy menu

Výroba Prstenca pomocou nástroja ProBuilder
Obr. 2: Výroba Prstenca pomocou nástroja ProBuilder

Taktiež musíme nakopírované prstence otočiť pomocou Rotate Tool-u a rozmiestniť ich podľa vlastného uváženia.

Príklad levelu
Obr. 3: Príklad levelu

Na záver musíme nastaviť terénu a vytvoreným prekážkam Tag, ktorý používame v skripte (v našom prípade Terrain), aby RigidBody hráča reagoval s týmitu prekážkami na spustenie skriptu.

Inspector (terénu alebo prekážok) -> Tag -> Add Tag... následne si zvolíme meno tagu a stlačíme Save. Po vytvorení tohto tagu ho pridelíme všetkým objektom, ktoré majú vyvolať akciu skriptu na výbuch a respawn po kolízii.

Pre ďalšie zdokonalenia svojej hry sa môžete pozrieť na zvýšenie obtiažnosti implementovaním konštantého pohybu lietadla vpred, zväčšovaním/prispôsobením prstencov alebo implementovaním skóre, ktoré bude pribúdať prelietaním cez prstence.

Držim palce!