Unity의 미니 게임 | 큐브피하다

The 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

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개의 기본 스크립트가 생성된 후 게임 설정을 진행해 보겠습니다.

  • 아직 만들지 않았다면 새 장면을 만드세요.
  • Main Camera를 선택하고 위치를 (0, 10, 0)으로 변경하고 회전을 (90, 0, 0)으로 변경합니다.
  • 기본 카메라의 카메라 구성 요소 속성을 변경합니다. 플래그를 'Solid Color'로, 배경을 'white'으로, 투영을 'Orthographic'로, 크기를 다음으로 지웁니다. '10'

  • 새 큐브(게임 개체 -> 3D 개체 -> 큐브)를 만들고 이름을 지정합니다. "Player"
  • "Player" 위치를 (0, 0, 0)으로 변경하고 크기를 (10, 10, 10)으로 변경합니다.
  • 새 재료를 생성하고(프로젝트 폴더 -> 생성 -> 재료를 마우스 오른쪽 버튼으로 클릭) 이름을 지정합니다. "PlayerMaterial"
  • "PlayerMaterial" Shader를 Unlit/Color로 변경하고 색상을 검정색으로 변경합니다.

  • "Player" 큐브에 "PlayerMaterial" 할당
  • "Player" 큐브를 복제하고 이름을 다음으로 바꿉니다. "Enemy"
  • "Enemy" 스케일을 (0.7, 0.7, 0.7)로 변경합니다.
  • "PlayerMaterial"을 복제하고 이름을 다음으로 바꿉니다. "EnemyMaterial"
  • "EnemyMaterial" 16진수 색상을 157EFB로 변경
  • 마지막으로 "EnemyMaterial"를 "Enemy" 큐브에 할당합니다.

CUBE씬 뷰 방지

간단한 UI를 만들어 보겠습니다.

  • 새 UI 텍스트(게임 개체 -> UI -> 텍스트)를 만들고 이름을 다음으로 바꿉니다. "GameOverText"
  • 새 텍스트의 RectTransform 정렬이 중간 가운데로 설정되어 있는지 확인하세요.
  • 텍스트 위치 X 및 위치 Y를 0으로 설정
  • 높이를 100으로 변경
  • 텍스트 구성 요소의 경우 아래 텍스트를 설정합니다(서식 있는 텍스트 속성이 선택되어 있는지 확인).
Game Over
<size=15>Click to Try Again</size>
  • 글꼴 크기를 25로 설정
  • 텍스트 정렬을 가운데 가운데로 설정
  • 텍스트 색상을 빨간색으로 설정

CUBE텍스트 이상의 게임을 피하세요

마지막으로 스크립트를 할당해 보겠습니다.

  • "Player" 큐브를 선택하고 여기에 할당 SC_PlayerCube 스크립트를 추가하세요.
  • "Enemy" 큐브를 Enemy 변수에 할당
  • Game Over Text 변수에 "GameOverText"을 할당합니다.

  • "Enemy" 큐브를 선택하고 여기에 SC_EnemyCube 스크립트를 할당

이제 재생을 누르면 파란색 큐브가 화면을 가로질러 움직이기 시작합니다. 마우스 커서를 사용하여 검은색 큐브의 크기를 조정하여 이를 피해야 합니다.

어떤 방식으로든 이 게임을 개선해 보세요.

추천 기사
Unity의 미니 게임 | 플래피 큐브
Unity용 Endless Runner 튜토리얼
Unity의 매치-3 퍼즐 게임 튜토리얼
Unity에서 2D 벽돌깨기 게임 만들기
Unity에서 슬라이딩 퍼즐 게임 만들기
Unity에서 Flappy Bird에서 영감을 받은 게임을 만드는 방법
농장 좀비 | Unity로 2D 플랫폼 게임 만들기