Minispil i Unity | CUBEundgå

CUBEavoid er et minispil lavet i Unity. Kildekode, og opsat nedenfor.

Målet er at undgå den lille terning ved at skalere den store terning igen med musemarkøren.

Trin 1: Opret alle de nødvendige scripts

  • Opret et nyt script, kald det SC_PlayerCube.cs, fjern alt fra det, og indsæt koden nedenfor i det:

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;
        }
    }
}
  • Opret et nyt script, kald det SC_EnemyCube.cs, fjern alt fra det, og indsæt koden nedenfor i det:

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

Trin 2: Opsætning

Når de 2 hovedscripts er oprettet, lad os fortsætte med at opsætte spillet:

  • Opret en ny scene, hvis du ikke har gjort det endnu
  • Vælg Hovedkamera, skift dets position til (0, 10, 0) og dets rotation til (90, 0, 0)
  • Skift hovedkameraets kamerakomponentegenskaber: Ryd flag til 'Solid Color', baggrund til 'white', projektion til 'Orthographic' og størrelse til '10'

  • Opret ny terning (spilobjekt -> 3D-objekt -> terning) og navngiv den "Player"
  • Skift "Player"-positionen til (0, 0, 0) og skala til (10, 10, 10)
  • Opret nyt materiale (højreklik på mappen Projekt -> Opret -> Materiale) og navngiv det "PlayerMaterial"
  • Skift "PlayerMaterial" Shader til Unlit/Color og skift dens farve til sort

  • Tildel "PlayerMaterial" til "Player"-terningen
  • Dupliker "Player"-terningen og omdøb den til "Enemy"
  • Skift "Enemy"-skalaen til (0,7, 0,7, 0,7)
  • Dupliker "PlayerMaterial" og omdøb den til "EnemyMaterial"
  • Skift "EnemyMaterial" hexadecimal farve til 157EFB
  • Til sidst skal du tildele "EnemyMaterial" til "Enemy" terning

CUBEundgå scenevisning

Lad os oprette en simpel brugergrænseflade:

  • Opret ny UI-tekst (Spilobjekt -> UI -> Tekst), omdøb den til "GameOverText"
  • Sørg for, at RectTransform-justeringen for den nye tekst er sat til Middle Center
  • Indstil Tekst Pos X og Pos Y til 0
  • Skift højde til 100
  • Indstil teksten nedenfor for tekstkomponenten (sørg for, at Rich Text-egenskaben er markeret):
Game Over
<size=15>Click to Try Again</size>
  • Indstil skriftstørrelse til 25
  • Indstil tekstjustering til midterste
  • Indstil tekstfarve til rød

CUBEavoid Game Over Tekst

Lad os til sidst tildele scripts:

  • Vælg "Player"-terningen og tildel SC_PlayerCube-scriptet til den
  • Tildel "Enemy"-terningen til Enemy-variablen
  • Tildel "GameOverText" til Game Over Text-variablen

  • Vælg "Enemy" terning og tildel SC_EnemyCube-scriptet til det

Når du nu trykker på Afspil, skulle den blå terning begynde at bevæge sig hen over skærmen, hvilket du skal undgå ved at ændre størrelsen på den sorte terning ved hjælp af musemarkøren.

Du er velkommen til at forbedre dette spil på nogen måde.