لعبة صغيرة في الوحدة | تجنب المكعب

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" Cube

CUتجنب عرض المشهد

لنقم بإنشاء واجهة مستخدم بسيطة:

  • أنشئ نصًا جديدًا لواجهة المستخدم (كائن اللعبة -> واجهة المستخدم -> النص)، وأعد تسميته إلى "GameOverText"
  • تأكد من ضبط محاذاة RectTransform للنص الجديد على المركز الأوسط
  • اضبط النص Pos X وPos Y على 0
  • تغيير الارتفاع إلى 100
  • بالنسبة لمكون النص، قم بتعيين النص أدناه (تأكد من تحديد خاصية Rich Text):
Game Over
<size=15>Click to Try Again</size>
  • اضبط حجم الخط على 25
  • ضبط محاذاة النص إلى المركز الأوسط
  • اضبط لون النص على اللون الأحمر

CUBEتجنب لعبة أكثر من نص

أخيرًا، لنقم بتعيين البرامج النصية:

  • حدد المكعب "Player" وعيّن البرنامج النصي SC_PlayerCube إليه
  • قم بتعيين المكعب "Enemy" لمتغير العدو
  • قم بتعيين "GameOverText" لمتغير Game Over Text

  • حدد "Enemy" cube وعيّن البرنامج النصي SC_EnemyCube له

الآن عند الضغط على تشغيل، يجب أن يبدأ المكعب الأزرق في التحرك عبر الشاشة، وهو ما تحتاج إلى تجنبه عن طريق تغيير حجم المكعب الأسود باستخدام مؤشر الماوس.

لا تتردد في تحسين هذه اللعبة بأي شكل من الأشكال.

المقالات المقترحة
لعبة صغيرة في الوحدة | المكعب القفاز
دروس عداء لا نهاية لها من أجل الوحدة
البرنامج التعليمي للعبة ألغاز Match-3 في Unity
كيفية صنع لعبة الثعبان في الوحدة
إنشاء لعبة 2D Brick Breaker في Unity
إنشاء لعبة ألغاز منزلقة في Unity
كيفية إنشاء لعبة مستوحاة من لعبة Flappy Bird في Unity