Minigame in Unity | CUBEavoid

De CUBEavoid is een mini-game gemaakt in Unity. Broncode en opstelling hieronder.

Het doel is om de kleine kubus te vermijden door de grote kubus opnieuw te schalen met de muiscursor.

Stap 1: Maak alle benodigde scripts

  • Maak een nieuw script, noem het SC_PlayerCube.cs, verwijder alles eruit en plak de onderstaande code erin:

SC_PlayerCube.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SC_PlayerCube : MonoBehaviour
{
    //Assign enemy mesh renderer
    public MeshRenderer enemy;
    public Text gameOverText;

    Transform thisT;
    MeshRenderer mr;

    //Global static variable
    public static bool GameOver = false;

    // Start is called before the first frame update
    void Start()
    {
        thisT = transform;
        mr = GetComponent<MeshRenderer>();
        gameOverText.enabled = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (GameOver)
            return;

        if (gameOverText.enabled)
        {
            //Game has resumed, disable game over text
            gameOverText.enabled = false;
        }

        //Scale player cube with mouse movement
        Vector3 playerScale = (new Vector3(Screen.width / 2 - Input.mousePosition.x, 1, Screen.height / 2 - Input.mousePosition.y)).normalized * 10;
        //Keep Y scale at 10
        playerScale.y = 10;
        //Limit minimum X and Z scale to 0.1
        if (playerScale.x >= 0 && playerScale.x < 0.1f)
        {
            playerScale.x = 0.1f;
        }
        else if (playerScale.x < 0 && playerScale.x > -0.1f)
        {
            playerScale.x = -0.1f;
        }
        if (playerScale.z >= 0 && playerScale.z < 0.1f)
        {
            playerScale.z = 0.1f;
        }
        else if (playerScale.z < 0 && playerScale.z > -0.1f)
        {
            playerScale.z = -0.1f;
        }
        thisT.localScale = playerScale;

        //Check if enemy have intersected with the player, if so, stop the game
        if (mr.bounds.Intersects(enemy.bounds))
        {
            GameOver = true;
            gameOverText.enabled = true;
        }
    }
}
  • Maak een nieuw script, noem het SC_EnemyCube.cs, verwijder alles eruit en plak de onderstaande code erin:

SC_EnemyCube.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//This script controls enemy cube AI
public class SC_EnemyCube : MonoBehaviour
{
    //Private variables
    Camera mainCamera;
    float movementTime = 0;
    Vector3 startPoint;
    Vector3 endPoint;

    // Start is called before the first frame update
    void Start()
    {
        //Get camera tagged "MainCamera"
        mainCamera = Camera.main;
        GenerateStartEndPoint();
    }

    //Assign start and end points slightly outside the Camera view
    void GenerateStartEndPoint()
    {
        Vector3 relativeStart;
        Vector3 relativeEnd;

        //Randomly pick whether to go Left <-> Right or Up <-> Down
        if (Random.Range(-10, 10) > 0)
        {
            relativeStart = new Vector3(Random.Range(-10, 10) > 0 ? 1.1f : -0.1f, Random.Range(0.00f, 1.00f), mainCamera.transform.position.y);
            if (relativeStart.y > 0.4f && relativeStart.y < 0.6f)
            {
                if(relativeStart.y >= 0.5f)
                {
                    relativeStart.y = 0.6f;
                }
                else
                {
                    relativeStart.y = 0.4f;
                }
            }
            relativeEnd = relativeStart;
            relativeEnd.x = relativeEnd.x > 1 ? -0.1f : 1.1f;
        }
        else
        {
            relativeStart = new Vector3(Random.Range(0.00f, 1.00f), Random.Range(-10, 10) > 0 ? 1.1f : -0.1f, mainCamera.transform.position.y);
            if (relativeStart.x > 0.4f && relativeStart.x < 0.6f)
            {
                if (relativeStart.x >= 0.5f)
                {
                    relativeStart.x = 0.6f;
                }
                else
                {
                    relativeStart.x = 0.4f;
                }
            }
            relativeEnd = relativeStart;
            relativeEnd.y = relativeEnd.y > 1 ? -0.1f : 1.1f;
        }

        //Convert screen points to world points
        startPoint = mainCamera.ViewportToWorldPoint(relativeStart);
        endPoint = mainCamera.ViewportToWorldPoint(relativeEnd);

        //Reset movement time
        movementTime = 0;
    }

    // Update is called once per frame
    void Update()
    {
        //Game over, wait for click
        if (SC_PlayerCube.GameOver)
        {
            //Click to resume
            if (Input.GetMouseButtonDown(0))
            {
                SC_PlayerCube.GameOver = false;
                GenerateStartEndPoint();
            }
            else
            {
                return;
            }
        }

        //Move enemy from one side to the other
        if(movementTime < 1)
        {
            movementTime += Time.deltaTime * 0.5f;

            transform.position = Vector3.Lerp(startPoint, endPoint, movementTime);
        }
        else
        {
            //Re-generate start / end point
            GenerateStartEndPoint();
        }
    }
}

Stap 2: Instellen

Nadat de twee hoofdscripts zijn gemaakt, gaan we verder met het instellen van het spel:

  • Maak een nieuwe scène als je dat nog niet hebt gedaan
  • Selecteer Hoofdcamera, verander de positie naar (0, 10, 0) en de rotatie naar (90, 0, 0)
  • Wijzig de eigenschappen van het cameracomponent van de hoofdcamera: Wis vlaggen naar 'Solid Color', Achtergrond naar 'white', Projectie naar 'Orthographic' en Grootte naar '10'

  • Maak een nieuwe kubus (Spelobject -> 3D-object -> Kubus) en geef deze een naam "Player"
  • Verander de "Player"-positie naar (0, 0, 0) en schaal naar (10, 10, 10)
  • Maak een nieuw materiaal (klik met de rechtermuisknop op de projectmap -> Maken -> Materiaal) en geef het een naam "PlayerMaterial"
  • Verander de "PlayerMaterial" Shader naar Onverlicht/Kleur en verander de kleur naar zwart

  • Wijs "PlayerMaterial" toe aan de "Player" kubus
  • Dupliceer de "Player"-kubus en hernoem deze naar "Enemy"
  • Verander de "Enemy"-schaal naar (0,7, 0,7, 0,7)
  • Dupliceer "PlayerMaterial" en hernoem het naar "EnemyMaterial"
  • Verander "EnemyMaterial" hexadecimale kleur naar 157EFB
  • Wijs ten slotte "EnemyMaterial" toe aan "Enemy" Cube

CUBEavoid Scèneweergave

Laten we een eenvoudige gebruikersinterface maken:

  • Maak een nieuwe UI-tekst (Game Object -> UI -> Tekst), hernoem deze naar "GameOverText"
  • Zorg ervoor dat de RectTransform-uitlijning voor de nieuwe tekst is ingesteld op Midden-midden
  • Stel tekstpositie X en positie Y in op 0
  • Verander de hoogte naar 100
  • Stel voor het tekstcomponent de onderstaande tekst in (zorg ervoor dat de eigenschap Rich Text is aangevinkt):
Game Over
<size=15>Click to Try Again</size>
  • Stel lettergrootte in op 25
  • Stel de tekstuitlijning in op Midden-Centrum
  • Stel de tekstkleur in op rood

CUBEvermijd Game Over Tekst

Laten we als laatste de scripts toewijzen:

  • Selecteer de "Player" kubus en wijs het SC_PlayerCube script eraan toe
  • Wijs de "Enemy" kubus toe aan de Enemy variabele
  • Wijs "GameOverText" toe aan de Game Over Text-variabele

  • Selecteer "Enemy" kubus en wijs het SC_EnemyCube script eraan toe

Wanneer u nu op Play drukt, zou de blauwe kubus over het scherm moeten gaan bewegen. Dit kunt u voorkomen door de zwarte kubus met de muiscursor van formaat te veranderen.

Voel je vrij om dit spel op welke manier dan ook te verbeteren.