מיני משחק באחדות | CUBEימנע

ה-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: התקנה

לאחר יצירת 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הימנע תצוגת סצנה

בואו ניצור ממשק משתמש פשוט:

  • צור טקסט ממשק משתמש חדש (אובייקט משחק -> ממשק משתמש -> טקסט), שנה את שמו ל "GameOverText"
  • ודא שהיישור RectTransform עבור הטקסט החדש מוגדר למרכז האמצעי
  • הגדר את הטקסט Pos X ו- Pos Y ל-0
  • שנה את הגובה ל-100
  • עבור רכיב הטקסט, הגדר את הטקסט למטה (ודא שהמאפיין טקסט עשיר מסומן):
Game Over
<size=15>Click to Try Again</size>
  • הגדר את גודל הגופן ל-25
  • הגדר יישור טקסט למרכז האמצעי
  • הגדר את צבע הטקסט לאדום

CUBEavoid Game Over Text

לבסוף, בואו נקצה את התסריטים:

  • בחר את הקובייה "Player" ו-הקצה לה את הסקריפט SC_PlayerCube
  • הקצה את הקובייה "Enemy" למשתנה האויב
  • הקצה "GameOverText" למשתנה Game Over Text

  • בחר "Enemy" קובייה ו-הקצה לה את הסקריפט SC_EnemyCube

כעת כאשר לוחצים על Play, הקובייה הכחולה אמורה להתחיל לנוע על פני המסך, מה שעליך להימנע מכך על ידי שינוי גודל הקובייה השחורה, באמצעות סמן העכבר.

אתה מוזמן לשפר את המשחק הזה בכל דרך.