UnityUnityメモ

Unityでクリックした場所にPrefabを生成し、1秒後に消滅させる仕組みを作ろう

Unity

はじめに

Unityを使って、クリックでSphere(球体)のPrefabを出現させ、1秒後に自動で消える仕組みを作る方法を説明します。とてもシンプルな手順なので、初心者でも安心して取り組めますよ!

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



1. プロジェクトの準備

Unity Hubを起動し、新しいプロジェクトを作成する

  1. Unity Hubを開き、「新規作成(New Project)」をクリックします。
  2. テンプレートは「3D」を選択してください。
  3. プロジェクト名を「ClickSphereDemo」と入力し、保存先を指定して「作成(Create)」をクリックします。

球体オブジェクトを作成する

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 「3D Object」→「Sphere」を選択して、シーン内に球体を作成します。
  3. 作成した球体の名前を「SpherePrototype」に変更します(わかりやすくするため)。

カメラとライトの確認

  1. メインカメラが正しく配置されているか確認します。
    • カメラがオブジェクトを適切に映すように位置を調整してください(例: X=0, Y=1, Z=-10)。
  2. シーン内に「Directional Light」があるか確認します。必要に応じてライトの位置や角度を調整します。

これでプロジェクトの準備が整いました!次のステップでは、この球体をPrefab化し、再利用できるように設定します



2. Prefabを作成

Prefabとは?

  • Prefab(プレハブ)は、Unityでオブジェクトを再利用可能にする便利な仕組みです。例えば、同じ球体を複数生成する場合、Prefabを使うことで効率的に管理できます。

Prefabを作成する手順

  1. 球体を選択する
    ヒエラルキー(Hierarchy)ウィンドウで先ほど作成した「SpherePrototype」をクリックして選択します。
  2. 球体をPrefab化する
    • プロジェクト(Project)ウィンドウで適当な場所を右クリックし、「Create」→「Folder」を選んで新しいフォルダを作成します。
    • フォルダ名を「Prefabs」に変更しておきます(Prefabをまとめて管理するため)。
    • ヒエラルキーウィンドウの「SpherePrototype」をプロジェクトウィンドウの「Prefabs」フォルダにドラッグ&ドロップします。
    • これで「SpherePrototype」のPrefabが作成されました。Prefab化されたオブジェクトは青色のアイコンで表示されます。
    • ヒエラルキーウィンドウから元の球体を削除する
      • ヒエラルキーウィンドウ内で「SpherePrototype」を右クリックし、「Delete」で削除します。
      • 削除してもPrefab化された球体はプロジェクトウィンドウに保存されています。

  1. Prefabの確認
    • プロジェクトウィンドウの「Prefabs」フォルダを開き、「SpherePrototype」をクリックします。
    • インスペクター(Inspector)ウィンドウで、球体の設定が正しく保存されているか確認してください。

これでPrefabの作成が完了です!次のステップでは、このPrefabを使ってスクリプトで球体を生成する仕組みを作ります。



3. スクリプトを作成

  1. スクリプトとは?
    Unityでオブジェクトを動かしたり、操作したりするにはスクリプトが必要です。ここでは、クリックで球体(Sphere)を生成し、1秒後に消える仕組みを作ります。

スクリプトの作成手順

  1. Scriptsフォルダを作成する
    • プロジェクト(Project)ウィンドウで右クリック →「Create」→「Folder」を選択します。
    • フォルダ名を「Scripts」に変更します。
  2. 新しいスクリプトを作成する
    • 「Scripts」フォルダを右クリック →「Create」→「C# Script」を選択します。
    • スクリプト名を ClickAndDestroy に変更します。
  3. スクリプトを開く
    • 作成した ClickAndDestroy スクリプトをダブルクリックして、コードエディタ(通常はVisual Studio)が開きます。

スクリプトのコードを記述する

  • 以下のコードを入力してください:
using UnityEngine;

public class ClickAndDestroy : MonoBehaviour
{
    public GameObject spherePrefab; // SphereのPrefab
    private Camera mainCamera;

    void Start()
    {
        // メインカメラを取得
        mainCamera = Camera.main;
    }

    void Update()
    {
        // 左クリックを検知
        if (Input.GetMouseButtonDown(0))
        {
            // マウスの位置を取得
            Vector3 mousePosition = Input.mousePosition;
            mousePosition.z = 10f; // カメラからの距離を設定
            Vector3 worldPosition = mainCamera.ScreenToWorldPoint(mousePosition);

            // Sphereを生成
            GameObject sphere = Instantiate(spherePrefab, worldPosition, Quaternion.identity);

            // 1秒後にSphereを削除
            Destroy(sphere, 1f);
        }
    }
}

コードの説明

  • public GameObject spherePrefab;
    スクリプトにPrefabを設定できるようにするための変数です。
  • mainCamera = Camera.main;
    メインカメラを取得して、マウスの位置をワールド座標に変換します。
  • Input.GetMouseButtonDown(0)
    左クリックを検知します。
  • Instantiate(spherePrefab, worldPosition, Quaternion.identity);
    指定した位置にPrefabを生成します。
  • Destroy(sphere, 1f);
    生成されたオブジェクトを1秒後に自動で削除します。

コード全体の説明

このスクリプトを使うと、画面をクリックしたときに指定されたプレハブがその位置に生成され、1秒後に自動的に消えます。スクリプトは PrefabSpawner というクラスを定義しており、これをアタッチしたゲームオブジェクトがこの動作を実行します。

各部分の説明

  • クラスの定義:
public class PrefabSpawner : MonoBehaviour
  • PrefabSpawner という名前のクラスを定義し、Unityの MonoBehaviour クラスを継承しています。これにより、このクラスがUnityのゲームオブジェクトにアタッチできるようになります。
  • プレハブのフィールド定義:
[SerializeField] GameObject prefab;
  • これはインスペクターから設定できるようにするためのプレハブを指す変数です。 SerializeField 属性を使うことで、プライベート変数でもUnityエディターで設定可能になります。
  • クリック位置の変数:
private Vector3 clickPos;
  • マウスクリックの位置を保存するための変数です。 Vector3 は三次元空間の座標を表します。
  • Updateメソッド:
void Update()
  • Update メソッドは、毎フレーム呼び出される特別なメソッドです。ここにゲームのメインループの処理を記述します。
  • マウスクリックの検出とプレハブの生成:
if (Input.GetMouseButtonDown(0))
{
    clickPos = Input.mousePosition;
    clickPos.z = 10.0f;
    GameObject ball = Instantiate(prefab, Camera.main.ScreenToWorldPoint(clickPos), Quaternion.identity);
    Destroy(ball, 1.0f);
}
  • Input.GetMouseButtonDown(0): マウスの左クリックを検出します。0 は左クリックを意味します。
  • clickPos = Input.mousePosition;: クリックした位置をスクリーン座標で取得します。
  • clickPos.z = 10.0f;: Z軸の位置を10に設定します。これは、カメラからの距離を設定するためです。
  • Instantiate(prefab, Camera.main.ScreenToWorldPoint(clickPos), Quaternion.identity);: プレハブをクリックした位置に生成します。 ScreenToWorldPoint を使ってスクリーン座標をワールド座標に変換しています。 Quaternion.identity は回転なしで生成することを意味します。
  • Destroy(ball, 1.0f);: 生成されたプレハブを1秒後に削除します。

全体の動き

  1. ゲームが実行されると、 Update メソッドが毎フレーム呼び出されます。
  2. プレイヤーがマウスの左ボタンをクリックすると、そのクリック位置が取得されます。
  3. クリック位置にプレハブが生成され、1秒後に自動的に消えます。

スクリプトを保存

  • コードを書き終えたら、ファイルを保存します(Ctrl + S または Cmd + S)。

次のステップでは、このスクリプトをUnityのシーンに設定して動作を確認します!



4. スクリプトを設定

スクリプトをUnityのシーンに組み込むための設定手順を説明します。これにより、クリックで球体が生成され、1秒後に自動で消える仕組みを動作させます。


空のゲームオブジェクトを作成

  1. ヒエラルキーウィンドウで右クリック
    • 「Create Empty」を選択して、新しい空のゲームオブジェクトを作成します。
  2. 名前を変更
    • 作成した空のゲームオブジェクトの名前を「GameManager」に変更します。
      ※ 名前をわかりやすくすることで管理がしやすくなります。

スクリプトをアタッチ

  1. スクリプトをGameManagerに設定
    • プロジェクトウィンドウの「Scripts」フォルダを開き、作成した ClickAndDestroy スクリプトを見つけます。
    • スクリプトをヒエラルキーウィンドウの「GameManager」にドラッグ&ドロップします。
  2. インスペクターウィンドウを確認
    • 「GameManager」を選択すると、インスペクターウィンドウに ClickAndDestroy スクリプトが表示されていることを確認してください。

Prefabを設定

  1. spherePrefabフィールドにPrefabを割り当てる
    • インスペクターウィンドウに表示された ClickAndDestroy スクリプトの spherePrefab フィールドに、作成した「SpherePrototype」Prefabをドラッグ&ドロップします。
  2. 設定を確認
    • フィールドが空ではなく、正しく「SpherePrototype」が割り当てられていることを確認してください。



5. 実行して確認

実行手順

  1. プレイモードを開始
    • Unityエディターの上部にある「Play」ボタンをクリックしてプレイモードを開始します。
  2. ゲームビューを確認
    • ゲームビューを開き、カメラの視点に基づいてオブジェクトがどのように表示されるか確認します。
  3. 左クリックで球体を生成
    • ゲームビュー内を左クリックすると、クリックした位置に球体が生成されることを確認してください。

正常動作の確認

  1. 球体が生成される
    • 左クリックした位置に球体が出現します。このとき、球体の位置がマウスの位置に対応していることを確認しましょう。
  2. 球体が1秒後に消える
    • 生成された球体が1秒後に自動で削除されることを確認してください。

問題が発生した場合のチェックポイント

  1. 球体が生成されない場合
    • インスペクターで spherePrefab フィールドに正しいPrefabが設定されているか確認します。
    • スクリプトのコードにエラーがないか確認してください(コンソールにエラーメッセージが表示されていないかをチェック)。
  2. 球体が消えない場合
    • スクリプト内の Destroy メソッドが正しく記述されているか確認します。Destroy(sphere, 1f); が欠けていないかチェックしてください。

次のステップ

  • 無事に動作が確認できたら、生成するオブジェクトを変更したり、クリックごとに異なる動きをさせたりして、仕組みをカスタマイズしてみましょう。
  • 例えば、ランダムな色やサイズの球体を生成することで、さらに楽しい動作を実現できます!

これで、クリックで球体を生成して1秒後に自動で消える仕組みが完成しました!



よくある質問

Q
Prefabが正しく設定できているかわかりません。
A

Prefabを選択し、インスペクターで正しい設定がされているか確認してください。また、スクリプトの SpherePrefab フィールドにPrefabを割り当てているか再チェックしましょう。

Q
球体が画面外に生成されます。
A

マウスの位置がカメラの視点に基づいてワールド座標に変換されているか確認してください。mousePosition.z の値を調整することで、生成位置を微調整できます。

Q
球体が消えません。
A

Destroy メソッドが正しく呼び出されているか確認してください。スクリプトの中で Destroy(sphere, 1f); があるか確認しましょう。

おすすめのアセット

「Unblock Wood」は、パズルゲームのテンプレートです。プレイヤーは木のブロックをスライドさせて、特定のブロックを出口に導くというシンプルながらも頭を使うゲームです。このテンプレートは、Unityでゲームを作りたい初心者にぴったりです。

特徴としては、直感的な操作方法、美しい木目調のグラフィック、そして数々のレベルが用意されている点が挙げられます。また、このアセットには完全なソースコードが含まれているため、自分でカスタマイズすることも可能です。