Minispiel in Unity | CUBEavoid
CUBEavoid ist ein Minispiel, das in Unity erstellt wurde. Quellcode und Setup siehe unten.
Das Ziel besteht darin, dem kleinen Würfel auszuweichen, indem man den großen Würfel mit dem Mauszeiger neu skaliert.
Schritt 1: Alle notwendigen Skripte erstellen
- Erstellen Sie ein neues Skript, nennen Sie es SC_PlayerCube.cs, entfernen Sie alles daraus und fügen Sie den folgenden Code darin ein:
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;
}
}
}
- Erstellen Sie ein neues Skript, nennen Sie es SC_EnemyCube.cs, entfernen Sie alles daraus und fügen Sie den folgenden Code darin ein:
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();
}
}
}
Schritt 2: Einrichten
Nachdem die beiden Hauptskripte erstellt sind, fahren wir mit der Einrichtung des Spiels fort:
- Erstellen Sie eine neue Szene, falls Sie dies noch nicht getan haben
- Wählen Sie die Hauptkamera aus, ändern Sie ihre Position auf (0, 10, 0) und ihre Drehung auf (90, 0, 0).
- Ändern Sie die Eigenschaften der Kamerakomponente der Hauptkamera: Klare Flags auf 'Solid Color', Hintergrund auf 'white', Projektion auf 'Orthographic' und Größe auf '10'
- Erstelle einen neuen Würfel (Spielobjekt -> 3D-Objekt -> Würfel) und nenne ihn "Player"
- Ändern Sie die Position "Player" in (0, 0, 0) und skalieren Sie in (10, 10, 10).
- Neues Material erstellen (Rechtsklick auf Projektordner -> Erstellen -> Material) und benennen "PlayerMaterial"
- Ändern Sie den "PlayerMaterial" Shader in Unbeleuchtet/Farbe und ändern Sie seine Farbe in Schwarz
- Weisen Sie "PlayerMaterial" dem Würfel "Player" zu.
- Duplizieren Sie den "Player" Würfel und benennen Sie ihn um in "Enemy"
- Ändern Sie die "Enemy"-Skala auf (0,7, 0,7, 0,7).
- Duplizieren Sie "PlayerMaterial" und benennen Sie es um in "EnemyMaterial"
- Ändern Sie die Hexadezimalfarbe "EnemyMaterial" in 157EFB
- Zuletzt weisen Sie "EnemyMaterial" dem Würfel "Enemy" zu
Lassen Sie uns eine einfache Benutzeroberfläche erstellen:
- Erstelle neuen UI-Text (Spielobjekt -> UI -> Text), benenne ihn um in "GameOverText"
- Stellen Sie sicher, dass die RectTransform-Ausrichtung für den neuen Text auf Mitte zentriert eingestellt ist
- Setzen Sie Textposition X und Position Y auf 0
- Ändern Sie die Höhe auf 100
- Legen Sie für die Textkomponente den folgenden Text fest (stellen Sie sicher, dass die Eigenschaft „Rich Text“ aktiviert ist):
Game Over
<size=15>Click to Try Again</size>
- Stellen Sie die Schriftgröße auf 25 ein.
- Textausrichtung auf Mitte zentrieren
- Textfarbe auf Rot setzen
Lassen Sie uns zum Schluss die Skripte zuweisen:
- Wählen Sie den Würfel "Player" und weisen Sie ihm das Skript SC_PlayerCube zu
- Weisen Sie den Würfel "Enemy" der Variable Enemy zu
- Weisen Sie der Game Over Text-Variable "GameOverText" zu
- Wähle den Würfel "Enemy" und weise ihm das Skript SC_EnemyCube zu
Wenn Sie jetzt auf „Play“ drücken, sollte sich der blaue Würfel über den Bildschirm bewegen. Dies müssen Sie verhindern, indem Sie mit dem Mauszeiger die Größe des schwarzen Würfels ändern.
Fühlen Sie sich frei, dieses Spiel auf jede erdenkliche Weise zu verbessern.