Permainan Mini di Unity | CUBEavoid
CUBEavoid adalah gim mini yang dibuat dalam Unity. Kode sumber, dan pengaturannya ada di bawah.
Tujuannya adalah untuk menghindari kubus kecil dengan mengubah skala kubus besar dengan kursor tetikus.
Langkah 1: Buat semua skrip yang diperlukan
- Buat skrip baru, beri nama SC_PlayerCube.cs, hapus semua yang ada di dalamnya, dan tempel kode di bawah ini di dalamnya:
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;
}
}
}
- Buat skrip baru, beri nama SC_EnemyCube.cs, hapus semua yang ada di dalamnya, dan tempel kode di bawah ini di dalamnya:
SC_MusuhKubus.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();
}
}
}
Langkah 2: Pengaturan
Setelah 2 skrip utama dibuat, mari kita lanjutkan dengan menyiapkan permainannya:
- Buat Adegan baru jika Anda belum melakukannya
- Pilih Kamera Utama, ubah posisinya menjadi (0, 10, 0) dan rotasinya menjadi (90, 0, 0)
- Ubah properti komponen Kamera Kamera Utama: Hapus Bendera ke 'Solid Color', Latar Belakang ke 'white', Proyeksi ke 'Orthographic', dan Ukuran ke '10'
- Buat Kubus baru (Objek Game -> Objek 3D -> Kubus) dan beri nama "Player"
- Ubah posisi "Player" ke (0, 0, 0) dan skala ke (10, 10, 10)
- Buat Material baru (Klik kanan pada folder Project -> Create -> Material) dan beri nama "PlayerMaterial"
- Ubah "PlayerMaterial" Shader menjadi Unlit/Color dan ubah warnanya menjadi hitam
- Tetapkan "PlayerMaterial" ke kubus "Player"
- Gandakan kubus "Player" dan ganti namanya menjadi "Enemy"
- Ubah skala "Enemy" menjadi (0,7, 0,7, 0,7)
- Gandakan "PlayerMaterial" dan ganti namanya menjadi "EnemyMaterial"
- Ubah warna heksadesimal "EnemyMaterial" menjadi 157EFB
- Terakhir, tetapkan "EnemyMaterial" ke Kubus "Enemy"
Mari membuat UI sederhana:
- Buat Teks UI baru (Objek Game -> UI -> Teks), ganti namanya menjadi "GameOverText"
- Pastikan perataan RectTransform untuk Teks baru diatur ke Tengah Tengah
- Atur Pos Teks X dan Pos Y ke 0
- Ubah Tinggi menjadi 100
- Untuk komponen Teks, atur teks di bawah ini (pastikan properti Rich Text dicentang):
Game Over
<size=15>Click to Try Again</size>
- Atur Ukuran Font menjadi 25
- Atur Perataan Teks ke Tengah Tengah
- Atur Warna Teks menjadi Merah
Terakhir, mari kita tetapkan skripnya:
- Pilih kubus "Player" dan tetapkan skrip SC_PlayerCube padanya
- Tetapkan kubus "Enemy" ke variabel Musuh
- Tetapkan "GameOverText" ke variabel Teks Game Over
- Pilih kubus "Enemy" dan tetapkan skrip SC_EnemyCube ke dalamnya
Sekarang saat menekan Play, kubus biru akan mulai bergerak melintasi layar, yang perlu Anda hindari dengan mengubah ukuran kubus hitam, menggunakan kursor mouse.
Jangan ragu untuk meningkatkan permainan ini dengan cara apa pun.