UnityUnityメモ

Unityでキューブを動かして落下時に「ゲームオーバー」表示を作る方法【初心者向け】

Unity

はじめに

Unity初心者の皆さん、こんにちは!ゲームを作るとき、「落下したらゲームオーバー」という仕組みを見たことがありませんか?シンプルですが、どんなゲームでも役立つ重要な要素です。

今回は、キューブを矢印キーで操作して、特定のエリアに落下したら「Game Over」と表示される仕組みを作ります。この記事を通じて、Unityでのスクリプトの書き方や、オブジェクト間の基本的なやり取りを学べます。

Unityを触ったことがないという方はコチラの記事から見てみてください!



1. オブジェクトの準備をする

まずは、3Dプロジェクトを開いて、ゲームの基礎となるキューブやフィールドを作成していきます。

プレイヤー用のキューブを作成

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリックします。
  2. メニューから「3D Object」→「Cube」を選択します。
  3. 作成されたキューブの名前を「PlayerCube」に変更しましょう。

物理特性を追加

  1. インスペクター画面の「AddComponent」ボタンをクリックします。
  2. 「Rigidbody」を検索して追加します。

色を変更(任意)

  1. プロジェクトウィンドウを右クリック、「Create」→「Material」を選択します。
  2. インスペクター画面からお好みの色(この記事では赤)に設定して「Cube」にアタッチします。

フィールドを作成

  1. 同じくヒエラルキーで右クリックし、「3D Object」→「Plane」を選択します。
  2. 作成されたPlaneをフィールドとして使用します。名前を「Field」に変更するとわかりやすいです。
  3. 必要に応じてPlaneのサイズを拡大します。インスペクターの「Scale」で設定して広くしましょう。

ゲームオーバーエリアを追加

  1. ヒエラルキーで「3D Object」→「Plane」を再び作成します。
  2. このPlaneを大きめに設定し、名前を「GameOverArea」に変更します。

当たり判定を追加

  1. inspector画面の「AddComponent」から「BoxCollider」を追加します。
  2. 「Istrigger」の項目にチェックを入れておきます。

位置と見た目の調整

  1. 位置をフィールドの下方に移動し、落下したキューブがこのエリアに触れると「Game Over」になるようにします。
  2. インスペクターでGameOverAreaの「Mesh Renderer」のチェックを外し、見えないエリアにします(当たり判定だけ使用します)。この記事ではわかりやすいように青色に設定しました。



2. UIの準備

「Game Over」の文字を表示するためのUIを作成します。

UIテキストを作成

  1. 作成されたテキストの名前を「GameOverText」に変更します。
  2. ヒエラルキーで右クリックし、「UI」→「Text (Legacy)」を選択します。

テキスト内容を編集

  1. インスペクターで「Text」の欄に「Game Over」と入力します。
  2. フォントサイズや位置を調整して、画面中央に表示されるようにします。
  3. 初期状態で非表示にするため、インスペクターの「Active」のチェックを外します。



3. スクリプトを作成

ゲームを動かすためのスクリプトを作成していきましょう。スクリプトを使うことで、キューブを操作したり、特定の条件で「Game Over」を表示したりすることができます。手順を一つずつ説明します。


① スクリプトを作成する

  1. プロジェクト(Project)ウィンドウを右クリックします。
  2. 「Create」→「C# Script」を選択します。
  3. 新しいスクリプトが作成されるので、名前を CubeMove に変更してください。

② スクリプトにコードを追加する

作成したスクリプトをダブルクリックすると、コードエディタ(Visual Studioなど)が開きます。以下のコードをコピーして、CubeMoveスクリプトに貼り付けてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    [SerializeField] GameObject gameOverText;
    private float speed = 0.1f;

    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(-speed, 0.0f, 0.0f);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(speed, 0.0f, 0.0f);
        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(0.0f, 0.0f, speed);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(0.0f, 0.0f, -speed);
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "GameOverArea")
        {
            Destroy(this.gameObject);
            gameOverText.SetActive(true);
        }
    }
}

③ コードのポイントを解説

  • [SerializeField]
    • インスペクターで設定できる変数を指定します。ここでは、GameOverTextをインスペクターから設定できるようにしています。
  • transform.Translate
    • オブジェクトを移動させる命令です。矢印キーの入力に応じてキューブを動かします。
  • OnTriggerEnter
    • オブジェクトが特定のエリアに触れたときに反応する処理です。ここでは、GameOverAreaに触れると「Game Over」を表示しています。

最初の部分

[SerializeField] GameObject gameOverText;
private float speed = 0.1f;
  • [SerializeField]:
    • Unityエディターでこの変数に値を設定できるようにする仕組み。
    • GameObject gameOverText という変数には、「Game Over」の文字を表示するUIオブジェクトをアタッチします。
  • speed = 0.1f;:
    • キューブが動く速さを設定しています。
    • 値を変えると速さを調整できます。

Update メソッド

void Update()
{
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Translate(-speed, 0.0f, 0.0f);
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Translate(speed, 0.0f, 0.0f);
}
if (Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(0.0f, 0.0f, speed);
}
if (Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(0.0f, 0.0f, -speed);
}
}
  • Update:
    • 毎フレーム(1秒間に何十回も)呼び出される関数です。
    • 矢印キーが押されているかを確認し、その方向にオブジェクトを動かします。
  • Input.GetKey:
    • 指定されたキー(矢印キー)が押されているかをチェックします。
  • transform.Translate:
    • オブジェクトの位置を指定した分だけ動かします。
    • 例:
      • 左方向(-speed, 0, 0) → キューブが左に動きます。
      • 右方向(speed, 0, 0) → キューブが右に動きます。
      • 上方向(0, 0, speed) → キューブが奥に動きます。
      • 下方向(0, 0, -speed) → キューブが手前に動きます。

OnTriggerEnter メソッド

void OnTriggerEnter(Collider other)
{
if (other.gameObject.name == "GameOverArea")
{
Destroy(this.gameObject);
gameOverText.SetActive(true);
}
}
  • OnTriggerEnter:
    • 何かが「トリガー」に触れたときに呼び出される関数です。
  • Collider other:
    • 触れたオブジェクトの情報が other に入ります。
  • if (other.gameObject.name == "GameOverArea"):
    • 触れたオブジェクトの名前が「GameOverArea」なら、以下の処理をします。
  • Destroy(this.gameObject):
    • キューブ自身(このスクリプトがアタッチされているオブジェクト)を消します。
  • gameOverText.SetActive(true):
    • ゲームオーバーのテキストを表示します。

全体の動き

  1. キューブは矢印キーで自由に移動できます。
  2. キューブが「GameOverArea」という名前のトリガーエリアに触れると、以下が起こります:
    • キューブが消える。
    • ゲームオーバーのテキストが表示される。


④ スクリプトを保存する

コードを入力したら、**Ctrl + S(または Command + S)**で保存してください。

スクリプトが完成しました!次のステップでは、このスクリプトをUnity内で設定していきます。



4. スクリプトを設定

キューブにスクリプトをアタッチする

  1. ヒエラルキー(Hierarchy)ウィンドウで、キューブ(Cube)オブジェクトをクリックして選択します。
  2. プロジェクトウィンドウのCubeMoveスクリプトをクリックして、キューブにドラッグ&ドロップします。これでスクリプトがキューブにアタッチされます。

Game Overテキストをスクリプトに関連付ける

  1. 次に、再びキューブを選択し、インスペクターでCubeMoveスクリプトを確認します。
  2. スクリプト内のGameOverTextフィールドに、ヒエラルキーから「Game Over」テキストオブジェクトをドラッグ&ドロップします。



テストプレイ

  1. 「再生」ボタンをクリックしてゲームをテストします。
  2. Cubeを操作してフィールドから落とすと、「Game Over」のテキストが表示されることを確認しましょう。

これで、Cubeがフィールドから落ちるとゲームオーバーになる仕組みが完成です!楽しく試してみてくださいね。



まとめ

お疲れさまでした!今回のチュートリアルでは、Unityを使ってキューブが落下したら「Game Over」のテキストが表示されるシンプルな仕組みを作りました。

こうした基本的なスクリプトやUIの使い方は、ゲーム作りの土台となる大切なスキルです。この仕組みを応用して、落下するとリトライできるようにしたり、スコアを表示したりと、さらに面白いゲームに発展させてみてください!🎮✨

おすすめのアセット

今回のチュートリアルで「落下したらゲームオーバー」という仕組みが作れましたが、アセットを使えばもっと本格的なアクションやゲームシステムを簡単に作る事ができます。例えば、2Dや2.5Dのプラットフォーマーゲームを作る際に、細かなコードを書く手間を省けるツールがあれば、より早く夢のゲームが完成します。

そんなときにおすすめなのが、Unity Asset Storeの人気アセット Corgi Engine – 2D + 2.5D Platformer です!このアセットは、2Dや2.5Dのプラットフォーマーゲームを作るためのテンプレートで、キャラクターの動きや物理演算、さらには敵のAIまで備えています。

おすすめポイント
  • ノーコードで高度な動きを実現:キャラクターのダッシュやジャンプなど、一般的な動作が簡単に設定可能。
  • 豊富な機能:チェックポイントやゲームオーバー画面の設定もすぐに行えます。
  • 拡張性の高さ:テンプレートを基に、自分のアイデアをどんどん追加できます。

Corgi Engineを活用することで、初心者でも短時間で完成度の高いゲームが作れます。Unityを始めたばかりの方にもやさしく設計されているので、今後のゲーム開発をレベルアップさせる絶好のチャンスです!