Unity のミニゲーム | 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 つのメイン スクリプトを作成したら、ゲームのセットアップに進みましょう。

  • 新しいシーンをまだ作成していない場合は作成します
  • Main Camera を選択し、位置を (0, 10, 0) に変更し、回転を (90, 0, 0) に変更します。
  • Main Camera の Camera コンポーネントのプロパティを変更します。Clear Flags を 'Solid Color'、Background を 'white'、Projection を 'Orthographic'、Size を に変更します。 '10'

  • 新しい Cube を作成し (ゲーム オブジェクト -> 3D オブジェクト -> キューブ)、名前を付けます。 "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" 16 進数の色を 157EFB に変更します
  • 最後に "EnemyMaterial" を "Enemy" Cube に代入します

CUBEavoid シーン ビュー

簡単な UI を作成してみましょう。

  • 新しい UI テキストを作成し (ゲーム オブジェクト -> UI -> テキスト)、名前を次のように変更します。 "GameOverText"
  • 新しい Text の RectTransform の配置が中央中央に設定されていることを確認します。
  • テキストの位置 X と位置 Y を 0 に設定します
  • 高さを 100 に変更します
  • Text コンポーネントの場合、以下のテキストを設定します (Rich Text プロパティがチェックされていることを確認してください)。
Game Over
<size=15>Click to Try Again</size>
  • フォント サイズを 25 に設定します
  • テキストの配置を中央中央に設定する
  • テキストの色を赤に設定する

CUBEゲームオーバー回避テキスト

最後に、スクリプトを割り当てましょう。

  • "Player" キューブを選択し、それに SC_PlayerCube スクリプトを assign します。
  • "Enemy" キューブを Enemy 変数に割り当てます
  • "GameOverText" をゲーム オーバー テキスト変数に割り当てます。

  • "Enemy" キューブを選択し、それに SC_EnemyCube スクリプトを assign

[再生] を押すと、青い立方体が画面上で動き始めるはずですが、これを避けるには、マウス カーソルを使用して黒い立方体のサイズを変更する必要があります。

このゲームをどのような方法でも自由に改善してください。

おすすめの記事
Unity 用エンドレス ランナー チュートリアル
Unity のマッチ 3 パズル ゲームのチュートリアル
Unity のミニゲーム | フラッピーキューブ
Unity で 2D ブリックブレイカー ゲームを作成する
Unity でスライディング パズル ゲームを作成する
Unity で Flappy Bird にインスピレーションを得たゲームを作成する方法
ファームゾンビ | Unity での 2D プラットフォーマー ゲームの作成