لعبة صغيرة في Unity | CUBEavoid
CUBEavoid هي لعبة صغيرة تم إنشاؤها باستخدام الكود المصدر Unity. وتم إعدادها أدناه.
الهدف هو تجنب المكعب الصغير عن طريق إعادة قياس المكعب الكبير باستخدام مؤشر الماوس.
الخطوة 1: إنشاء جميع البرامج النصية اللازمة
- قم بإنشاء نصًا جديدًا، وأطلق عليه اسم SC_PlayerCube.cs، ثم قم بإزالة كل شيء منه، ثم قم بلصق الكود أدناه بداخله:
ملف 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;
}
}
}
- قم بإنشاء نصًا جديدًا، وأطلق عليه اسم SC_EnemyCube.cs، ثم قم بإزالة كل شيء منه، ثم قم بلصق الكود أدناه بداخله:
ملف 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();
}
}
}
الخطوة 2: الإعداد
بعد إنشاء النصين الرئيسيين، دعنا ننتقل إلى إعداد اللعبة:
- قم بإنشاء مشهد جديد إذا لم تقم بذلك بعد
- حدد الكاميرا الرئيسية، وقم بتغيير موضعها إلى (0، 10، 0) ودورانها إلى (90، 0، 0)
- تغيير خصائص مكون الكاميرا في الكاميرا الرئيسية: مسح الأعلام إلى 'Solid Color'، والخلفية إلى 'white'، والإسقاط إلى 'Orthographic'، والحجم إلى '10'
- قم بإنشاء مكعب جديد (كائن اللعبة -> كائن ثلاثي الأبعاد -> مكعب) وقم بتسميته "Player"
- قم بتغيير موضع "Player" إلى (0, 0, 0) وقم بتغيير المقياس إلى (10, 10, 10)
- قم بإنشاء مادة جديدة (انقر بزر الماوس الأيمن على مجلد المشروع -> إنشاء -> مادة) وقم بتسميتها "PlayerMaterial"
- قم بتغيير "PlayerMaterial" Shader إلى Unlit/Color وقم بتغيير لونه إلى الأسود
- تعيين "PlayerMaterial" إلى المكعب "Player"
- قم بتكرار المكعب "Player" وأعد تسميته إلى "Enemy"
- قم بتغيير مقياس "Enemy" إلى (0.7، 0.7، 0.7)
- انسخ "PlayerMaterial" وأعد تسميته إلى "EnemyMaterial"
- تغيير اللون السداسي عشري "EnemyMaterial" إلى 157EFB
- أخيرًا، قم بتعيين "EnemyMaterial" إلى "Enemy" مكعب
دعونا ننشئ واجهة مستخدم بسيطة:
- إنشاء نص واجهة مستخدم جديد (كائن اللعبة -> واجهة المستخدم -> النص)، وإعادة تسميته إلى "GameOverText"
- تأكد من ضبط محاذاة RectTransform للنص الجديد على المنتصف
- تعيين موضع النص X وموضع النص Y إلى 0
- تغيير الارتفاع إلى 100
- بالنسبة لمكون النص، قم بتعيين النص أدناه (تأكد من تحديد خاصية النص الغني):
Game Over
<size=15>Click to Try Again</size>
- ضبط حجم الخط إلى 25
- تعيين محاذاة النص إلى المنتصف والمركز
- تعيين لون النص إلى اللون الأحمر
وأخيرًا، دعنا نقوم بتعيين البرامج النصية:
- حدد المكعب "Player" وخصص البرنامج النصي SC_PlayerCube له
- قم بتعيين المكعب "Enemy" إلى متغير العدو
- تعيين "GameOverText" إلى متغير Game Over Text
- حدد المكعب "Enemy" وخصص البرنامج النصي SC_EnemyCube له
الآن عند الضغط على زر التشغيل، يجب أن يبدأ المكعب الأزرق بالتحرك عبر الشاشة، الأمر الذي يجب عليك تجنبه عن طريق تغيير حجم المكعب الأسود باستخدام مؤشر الماوس.
لا تتردد في تحسين هذه اللعبة بأي طريقة.