UnityUnityメモ

クリックしたオブジェクトを順番に配列へ格納!Unity初心者向け簡単チュートリアル

Unity

はじめに

この記事では、クリックしたオブジェクトを順番に配列へ格納する方法をわかりやすく解説します。

この記事を読み終える頃には、クリック操作の基礎や配列を使ったオブジェクト管理の仕組みが理解できるようになるはずです!さっそく始めてみましょう! 🎮

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



準備:Unityシーンのセットアップ

この記事では、クリックした3種類のオブジェクトを配列に格納するスクリプトを作成します。まず、Unityでシーンをセットアップしましょう。以下の手順に従って進めてください。

1. Unityプロジェクトを作成

Unity Hubを開き、新しいプロジェクトを作成します。テンプレートは「3D」を選び、プロジェクト名をわかりやすく「ObjectArrayTutorial」としましょう。

2. 3種類の3Dオブジェクトを配置する

Unityエディターで以下の手順を実行して、シーンに3種類の3Dオブジェクトを配置します。

  1. Hierarchyウィンドウを右クリック
    メニューが表示されるので、「3D Object」を選択し、以下の手順で3種類のオブジェクトを追加します:
    • Cube
    • Sphere
    • Capsule
  2. オブジェクトの配置を調整
    配置が重ならないように、それぞれ少し離して並べましょう。例として、以下のように設定します:
    • Cube: Position (X: -2, Y: 0, Z: 0)
    • Sphere: Position (X: 0, Y: 0, Z: 0)
    • Capsule: Position (X: 2, Y: 0, Z: 0)
  3. オブジェクトの名前を変更
    わかりやすい名前に変更します。例として、「Cube」「Sphere」「Capsule」とそのまま名前を残しておくと良いでしょう。

3. カメラと光源の確認(任意)

クリックしたオブジェクトを正しく表示させるため、カメラと光源の位置を調整します。

  1. カメラの位置を調整
    カメラを選択し、Inspectorウィンドウで以下の値を設定します:
    • Position: (0, 3, -10)
    • Rotation: (20, 0, 0)
  2. 光源の確認
    Hierarchyにある「Directional Light」を選択し、シーン全体が明るくなるように向きを調整します。

これでシーンのセットアップは完了です!次のステップでは、スクリプトを作成してクリックしたオブジェクトを配列に格納する方法を解説します。



スクリプト作成とアタッチ

ここでは、クリックしたオブジェクトを順番に配列に格納するスクリプトを作成し、Unityシーンにアタッチする手順を解説します。初心者でも安心して実践できるように、一つ一つ丁寧に説明しますね。

1. 新しいスクリプトを作成する

まず、プロジェクトウィンドウで以下の手順を実行してください。

  1. プロジェクトウィンドウ内で右クリックします。
  2. 「Create」→「C# Script」を選択します。
  3. 新しいスクリプトの名前を ObjectCollector に変更します。

これでスクリプトが作成されました。

2. スクリプトの内容を記述する

作成したスクリプトをダブルクリックして、コードエディタ(Visual Studioなど)で開きます。以下のコードを記述してください。

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

public class ObjectCollector : MonoBehaviour
{
    // オブジェクトを格納する配列を宣言
    public GameObject[] collectedObjects = new GameObject[3];
    private int currentIndex = 0;

    void Update()
    {
        // 左クリックが押されたときの処理
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                // クリックしたオブジェクトが3つまで格納される
                if (currentIndex < collectedObjects.Length)
                {
                    collectedObjects[currentIndex] = hit.collider.gameObject;
                    Debug.Log("オブジェクトを追加しました: " + collectedObjects[currentIndex].name);
                    currentIndex++;
                }
                else
                {
                    Debug.Log("配列がいっぱいです。");
                }
            }
        }
    }
}

3. スクリプトをアタッチする

スクリプトを書き終えたら、Unityエディタに戻りましょう。

  1. Hierarchy ウィンドウで右クリックし、「Create Empty」を選択して空のオブジェクトを作成します。
  2. 作成した空のオブジェクトの名前を「ObjectManager」に変更します。
  3. プロジェクトウィンドウから ObjectCollector スクリプトをドラッグし、ObjectManager にドロップしてアタッチします。

4. 配列のサイズを確認する

最後に、ObjectManager を選択し、インスペクターウィンドウで Collected Objects の配列サイズが「3」になっていることを確認します。必要に応じてサイズを変更することも可能です。

これでスクリプトの準備とアタッチは完了です!


これを参考に、次のテストプレイで動作を確認してみましょう。もし質問や不明点があれば遠慮なく聞いてくださいね!



テストプレイ

スクリプトをアタッチしたら、実際に動作するかテストプレイをしてみましょう。以下の手順に従ってください。

1. プレイモードを開始

Unityエディターの上部にある「▶」ボタンをクリックして、プレイモードを開始します。

2. オブジェクトをクリック

シーンビューやゲームビューで配置したオブジェクトをクリックしてみましょう。クリックするたびに、コンソールウィンドウに次のようなメッセージが表示されるはずです:

オブジェクトを追加しました: Cube

もしオブジェクトが3つすべて配列に格納されると、次のメッセージが表示されます:

配列がいっぱいです。

3. 動作が正しいか確認

以下のポイントを確認しましょう:

  • クリックしたオブジェクトの名前が正しくコンソールに表示されているか
  • 配列が3つのオブジェクトでいっぱいになったとき、「配列がいっぱいです」というメッセージが表示されるか

4. 問題がある場合のチェックポイント

スクリプトが期待通りに動作しない場合、以下の項目を確認してください:

  • カメラの設定
    メインカメラが正しい方向を向いているか、Rayがオブジェクトに当たる位置に配置されているか確認してください。
  • オブジェクトのCollider
    配列に格納されるオブジェクトにColliderが付いていない場合、クリックを検知できません。Inspectorで「Box Collider」や「Sphere Collider」などが付いているか確認しましょう。
  • スクリプトのアタッチ
    「ObjectCollector」スクリプトが正しいGameObjectにアタッチされているか確認してください。

5. 配列の中身を確認する(オプション)

動作を詳しく確認したい場合は、スクリプトの Debug.Log 部分に配列の中身を出力するコードを追加すると便利です:

foreach (GameObject obj in collectedObjects)
{
if (obj != null)
{
Debug.Log("配列の中身: " + obj.name);
}
}



スクリプトの作成 (2): 配列に格納したオブジェクトをキー操作で表示

次に、クリックで配列に格納したオブジェクトを、キー操作で再表示するスクリプトを作成します。このスクリプトでは、クリックされたオブジェクトを非表示にし、指定したキーを押すと再び表示できるようにします。

スクリプトを作成する手順

  1. 新しいスクリプトを作成
    プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選びます。名前は ObjectManager にしましょう。
  2. スクリプトをアタッチ
    作成したスクリプトをドラッグ&ドロップして、シーン内の Main Camera にアタッチします。
  3. スクリプトを編集
    作成したスクリプトをダブルクリックして開き、以下のコードを記述します。
using UnityEngine;

public class ObjectManager : MonoBehaviour
{
    public GameObject[] objectArray = new GameObject[3]; // 配列を用意
    private int currentIndex = 0;

    void Update()
    {
        // オブジェクトのクリックをチェック
        if (Input.GetMouseButtonDown(0) && currentIndex < objectArray.Length)
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out RaycastHit hit))
            {
                GameObject clickedObject = hit.collider.gameObject;
                objectArray[currentIndex] = clickedObject;
                clickedObject.SetActive(false); // オブジェクトを非表示
                Debug.Log("オブジェクトを非表示にしました: " + clickedObject.name);
                currentIndex++;
            }
        }

        // キー操作でオブジェクトを表示
        if (Input.GetKeyDown(KeyCode.Alpha1) && objectArray[0] != null)
        {
            objectArray[0].SetActive(true);
            Debug.Log("オブジェクトを表示しました: " + objectArray[0].name);
        }
        if (Input.GetKeyDown(KeyCode.Alpha2) && objectArray[1] != null)
        {
            objectArray[1].SetActive(true);
            Debug.Log("オブジェクトを表示しました: " + objectArray[1].name);
        }
        if (Input.GetKeyDown(KeyCode.Alpha3) && objectArray[2] != null)
        {
            objectArray[2].SetActive(true);
            Debug.Log("オブジェクトを表示しました: " + objectArray[2].name);
        }
    }
}

コードのポイント解説

  • 配列の宣言
    配列 objectArray を用意し、最大3つのオブジェクトを格納します。
  • クリック時の処理
    マウスの左クリックが検出されると、 Physics.Raycast を使用してクリックされたオブジェクトを取得します。そのオブジェクトを配列に格納し、 SetActive(false) で非表示にします。
  • キー操作で表示
    数字キー(1~3)を押すと、対応する配列内のオブジェクトが SetActive(true) で表示されます。 Debug.Log を使ってコンソールにメッセージを出力するため、動作確認が容易です。

動作確認

  1. シーンを再生し、3つのオブジェクトをクリックして配列に格納します。
  2. 数字キー(1~3)を順に押して、それぞれのオブジェクトが再表示されることを確認してください。
  3. クリックしたオブジェクトが非表示になり、指定のキーを押すと再び表示されれば成功です!

注意点

  • オブジェクトが非表示にならない場合
    オブジェクトに Collider がアタッチされているか確認してください。
  • キー操作が反応しない場合
    正しいキーが割り当てられているか、Unityエディターの「Game」ビューで動作を確認してください。



よくある質問(FAQ)

Q
配列に格納したオブジェクトをどう活用できますか?
A

配列に格納したオブジェクトは、ゲーム内で様々な用途に利用できます。例えば、以下のような使い方があります:

  • 順番にオブジェクトを移動させる
  • 配列内のオブジェクトに特定のエフェクトを適用する
  • 配列内のオブジェクトをクリック順に処理するロジックを作る

格納されたオブジェクトをループ処理で操作することで、効率的にゲームの動きを作成できます。

Q
配列のサイズを動的に変更したい場合はどうすれば良いですか?
A

動的にオブジェクトを追加したい場合は、固定サイズの配列ではなく**List<GameObject>**を使用するのがおすすめです。Listはサイズを自由に変更できるため、次のように記述します:

using System.Collections.Generic;
using UnityEngine;

public class ObjectCollector : MonoBehaviour
{
public List<GameObject> collectedObjects = new List<GameObject>();

void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;

if (Physics.Raycast(ray, out hit))
{
collectedObjects.Add(hit.collider.gameObject);
Debug.Log("オブジェクトを追加しました: " + hit.collider.gameObject.name);
}
}
}
}

このコードでは、**collectedObjects.Add()**を使って簡単にリストへオブジェクトを追加できます。

Q
クリックした位置を保存する方法はありますか?
A

クリックしたオブジェクトの位置を保存する場合、以下のコードを参考にしてください:

using System.Collections.Generic;
using UnityEngine;

public class ObjectCollector : MonoBehaviour
{
public List<Vector3> clickedPositions = new List<Vector3>();

void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;

if (Physics.Raycast(ray, out hit))
{
clickedPositions.Add(hit.point);
Debug.Log("クリックした位置を追加しました: " + hit.point);
}
}
}
}

このコードでは、RaycastHit構造体のhit.pointを使用してクリック位置を取得し、Listに格納します。これを利用して、クリックした位置にエフェクトを発生させたり、オブジェクトを生成することが可能です。

おすすめのアセット

「2D Action-RPG Kit」は、Unityで2DアクションRPGを簡単に作成できるツールです。このキットを使えば、複雑なプログラミングなしで、戦闘システムやスキルツリーなどの機能をゲームに組み込むことができます。

主な特徴:

  • アクションRPG戦闘システム: プレイヤーが敵と戦うための基本的な仕組みが含まれています。
  • スキルツリー: プレイヤーが新しいスキルを習得し、成長させることができます。
  • インベントリと装備システム: アイテムの収集や装備の管理が簡単に行えます。

おすすめポイント:

  • 初心者でも使いやすい: 複雑なコードを書く必要がなく、直感的に操作できます。
  • 時間の節約: ゲームの基本機能が揃っているため、開発時間を大幅に短縮できます。
  • カスタマイズ性: 自分のゲームに合わせて、機能やデザインを自由に変更できます。