Unity'de Mini Oyun | CUBEkaçının
CUBEavoid Unity ile yapılmış bir mini oyundur. Kaynak kodunu ve aşağıda kurulumunu yapın.
Amaç, büyük küpü fare imleciyle yeniden ölçeklendirerek küçük küpten kaçınmaktır.
Adım 1: Gerekli tüm komut dosyalarını oluşturun
- yeni bir komut dosyası oluşturun, buna SC_PlayerCube.cs adını verin, içindeki her şeyi kaldırın ve aşağıdaki kodu içine yapıştırın:
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;
}
}
}
- yeni bir komut dosyası oluşturun, onu SC_EnemyCube.cs olarak adlandırın, içindeki her şeyi kaldırın ve aşağıdaki kodu içine yapıştırın:
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();
}
}
}
Adım 2: Kurulum
2 ana script oluşturulduktan sonra oyunun kurulumuna geçelim:
- Henüz yapmadıysanız yeni bir Sahne oluşturun
- Ana Kamerayı seçin, konumunu (0, 10, 0) ve dönüşünü (90, 0, 0) olarak değiştirin
- Ana Kameranın Kamera bileşeni özelliklerini değiştirin: Bayrakları Temizle 'Solid Color' olarak, Arka Plan olarak 'white' olarak, Projeksiyon olarak 'Orthographic' olarak ve Boyut olarak '10'
- Yeni Küp oluşturun (Oyun Nesnesi -> 3B Nesne -> Küp) ve adını verin "Player"
- "Player" konumunu (0, 0, 0) olarak değiştirin ve (10, 10, 10) olarak ölçeklendirin
- Yeni Malzeme oluşturun (Proje klasörüne sağ tıklayın -> Oluştur -> Malzeme) ve adlandırın "PlayerMaterial"
- "PlayerMaterial" Shader öğesini Işıksız/Renkli olarak değiştirin ve rengini siyah olarak değiştirin
- "PlayerMaterial"'i "Player" küpüne atayın
- "Player" küpünü çoğaltın ve yeniden adlandırın "Enemy"
- "Enemy" ölçeğini (0,7, 0,7, 0,7) olarak değiştirin
- "PlayerMaterial" dosyasını kopyalayın ve yeniden adlandırın "EnemyMaterial"
- "EnemyMaterial" onaltılık rengini 157EFB olarak değiştirin
- Son olarak "EnemyMaterial"'i "Enemy" Cube'a atayın
Basit bir kullanıcı arayüzü oluşturalım:
- Yeni Kullanıcı Arayüzü Metni oluşturun (Oyun Nesnesi -> Kullanıcı Arayüzü -> Metin), onu şu şekilde yeniden adlandırın: "GameOverText"
- Yeni Metin için RectTransform hizalamasının Orta Orta olarak ayarlandığından emin olun
- Metin Poz X ve Poz Y'yi 0'a ayarlayın
- Yüksekliği 100 olarak değiştirin
- Metin bileşeni için aşağıdaki metni ayarlayın (Zengin Metin özelliğinin işaretli olduğundan emin olun):
Game Over
<size=15>Click to Try Again</size>
- Yazı Tipi Boyutunu 25'e Ayarla
- Metin Hizalamasını Orta Ortaya Ayarla
- Metin Rengini Kırmızı Olarak Ayarla
Son olarak scriptleri atayalım:
- "Player" küpünü seçin ve buna SC_PlayerCube komut dosyasını atayın
- "Enemy" küpünü Düşman değişkenine atayın
- Game Over Text değişkenine "GameOverText" atayın
- "Enemy" küpünü seçin ve buna SC_EnemyCube komut dosyasını atayın
Artık Oynat'a bastığınızda mavi küp ekran boyunca hareket etmeye başlamalıdır; fare imlecini kullanarak siyah küpü yeniden boyutlandırarak bundan kaçınmanız gerekir.
Bu oyunu herhangi bir şekilde geliştirmekten çekinmeyin.