Mini Game in Unity | CUBEavoid
The CUBEavoid is a mini-game made in Unity. Source code, and set up below.
The goal is to avoid the small cube by re-scaling the big cube with the mouse cursor.
Step 1: Create all the necessary scripts
- Create a new script, call it SC_PlayerCube.cs, remove everything from it, and paste the code below inside it:
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;
}
}
}
- Create a new script, call it SC_EnemyCube.cs, remove everything from it, and paste the code below inside it:
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();
}
}
}
Step 2: Setup
After the 2 main scripts are created, let's proceed with setting up the game:
- Create a new Scene if you haven't yet
- Select Main Camera, change its position to (0, 10, 0) and its rotation to (90, 0, 0)
- Change Main Camera's Camera component properties: Clear Flags to 'Solid Color', Background to 'white', Projection to 'Orthographic', and Size to '10'
- Create new Cube (Game Object -> 3D Object -> Cube) and name it "Player"
- Change the "Player" position to (0, 0, 0) and scale to (10, 10, 10)
- Create new Material (Right-click on Project folder -> Create -> Material) and name it "PlayerMaterial"
- Change the "PlayerMaterial" Shader to Unlit/Color and change its color to black
- Assign "PlayerMaterial" to the "Player" cube
- Duplicate the "Player" cube and rename it to "Enemy"
- Change the "Enemy" scale to (0.7, 0.7, 0.7)
- Duplicate "PlayerMaterial" and rename it to "EnemyMaterial"
- Change "EnemyMaterial" hexadecimal color to 157EFB
- Lastly, assign "EnemyMaterial" to "Enemy" Cube
Let's create a simple UI:
- Create new UI Text (Game Object -> UI -> Text), rename it to "GameOverText"
- Make sure the RectTransform alignment for the new Text is set to Middle Center
- Set Text Pos X and Pos Y to 0
- Change Height to 100
- For the Text component, set the text below (make sure the Rich Text property is checked):
Game Over
<size=15>Click to Try Again</size>
- Set Font Size to 25
- Set Text Alignment to Middle Center
- Set Text Color to Red
Lastly, let's assign the scripts:
- Select the "Player" cube and assign the SC_PlayerCube script to it
- Assign the "Enemy" cube to the Enemy variable
- Assign "GameOverText" to the Game Over Text variable
- Select "Enemy" cube and assign the SC_EnemyCube script to it
Now when pressing Play, the blue cube should begin moving across the screen, which you need to avoid by resizing the black cube, using the mouse cursor.
Feel free to improve this game in any way.
Previous articleEndless Runner Tutorial for Unity