UnityUnityメモ

Unityでクリックしたオブジェクトを削除して名前をリストに保存する方法

Unity

1.はじめに

Unityでゲームやアプリを作っていると、「クリックしたオブジェクトを削除したり、その情報を別の場所で管理したい」と思ったことはありませんか?例えば、クリックしたキャラクターやアイテムの名前をリストに記録する仕組みがあれば、ゲームのスコア管理やコレクションシステムなど、幅広い応用が可能です。

この記事では、Unityで簡単に「オブジェクトをクリックして削除し、その名前をリストに保存する」仕組みを作る方法を解説します。初心者の方でも安心して取り組めるように、ステップバイステップでわかりやすく説明していきます。


この記事を読むことで、次のことができるようになります:

  • レイキャスト(Raycast)を使ってオブジェクトをクリックで認識する方法。
  • スクリプトを活用して、リストにデータを保存する方法。
  • 実際にゲーム画面で動作をテストする方法。

シンプルな機能ですが、この技術を使うことでゲームの表現がさらに豊かになります。それでは、実際に作っていきましょう!


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



2. 必要な準備

この記事では、Unityを使ってクリックしたオブジェクトを削除し、その名前をリストに保存する仕組みを作成します。そのために、まず必要な環境や設定を整えましょう。以下の手順を参考に、プロジェクトを準備してください。

プロジェクトの作成

Unityをまだインストールしていない場合は、Unity Hubを利用してインストールしてください。その後、以下の手順で新しいプロジェクトを作成します。

  1. Unity Hubを開く
    Unity Hubの「プロジェクト」タブをクリックします。
  2. 新規プロジェクトを作成
    「新しいプロジェクトを作成」をクリックし、テンプレートを選択します。この記事では「3D」を選択してください。
  3. プロジェクト名を設定
    プロジェクト名をわかりやすく設定(例: ObjectClickManager)し、保存場所を指定して「作成」をクリックします。

必要なアセットの確認と追加

この記事のサンプルでは特別なアセットは不要です。ただし、後述の手順でオブジェクトを配置するため、Unityに標準で含まれている「Cube」や「Sphere」を使用します。

  1. カメラの設定を確認
    ヒエラルキー(Hierarchy)ウィンドウで「Main Camera」を選択し、位置や向きを調整して、後述のオブジェクトが全てカメラに映るように設定してください。
  2. ライトの確認
    同様に、デフォルトの「Directional Light」が適切に配置されていることを確認し、必要に応じて調整します。オブジェクトが見やすいように設定しましょう。

サンプルプロジェクトの動作確認

プロジェクトの準備が整ったら、一度「再生(Play)」ボタンをクリックして、エラーがないことを確認します。特に以下の点に注意してください。

  • カメラのアングルからオブジェクトが見えること。
  • エラーや警告メッセージが表示されないこと。

これでプロジェクトの準備が完了しました!次は、実際にオブジェクトを配置してスクリプトを作成していきます。次のステップに進みましょう!



3. オブジェクトの作成と配置

このセクションでは、ヒエラルキーウィンドウを使用して複数のオブジェクトを作成し、ゲームシーンに配置する方法を説明します。この手順に従うことで、クリックして削除する対象のオブジェクトを準備できます。

1. ヒエラルキーウィンドウでオブジェクトを作成する

  1. Unityのエディターを開きます。
  2. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  3. メニューから「3D Object」を選択し、「Cube」や「Sphere」など好きなオブジェクトを選択します。
  4. 作成したオブジェクトは、ヒエラルキーウィンドウに表示され、シーンに配置されます。

ヒント: ヒエラルキーウィンドウで右クリックする代わりに、上部メニューの「GameObject」から同様の操作も可能です。

2. 複数のオブジェクトを追加

  1. 同じ手順で、複数のオブジェクトを作成します。
  2. この記事では例として、以下の4つのオブジェクトを使用します:
    • Cube
    • Sphere
    • Capsule
    • Cylinder

3. オブジェクトを間隔を空けて配置する

  1. シーンビューで各オブジェクトを選択し、**移動ツール(Move Tool)**を使用して適切な位置に配置します。
    • シーンビュー左上の矢印アイコンをクリックすると移動ツールを選択できます。
    • オブジェクトをクリックし、赤・緑・青の矢印をドラッグして移動します。
  2. オブジェクト同士が重ならないように、適度な間隔を空けて配置してください。

4. オブジェクトの名前を変更する(任意)

  1. ヒエラルキーウィンドウでオブジェクトを選択し、名前をわかりやすく変更します。
    • 例: Cube → TargetCube、Sphere → TargetSphereなど。

これで、削除する対象となるオブジェクトが準備できました。次のステップでは、スクリプトを作成して、これらのオブジェクトをクリックしたときに削除する仕組みを作成します!



4. 空のオブジェクトを作成

「空のオブジェクト」とは、Unityで基本的なデータを持たないオブジェクトのことです。スクリプトをアタッチしたり、シーン内で特定の役割を持たせるための便利なツールとして活用されます。ここでは、この空のオブジェクトを作成する手順を解説します。


空のオブジェクトを作成する手順

  1. ヒエラルキーウィンドウを開く
    Unityエディター上部にあるヒエラルキーウィンドウを確認してください。このウィンドウは、現在のシーン内に存在するすべてのオブジェクトを一覧で表示します。
  2. 右クリックしてメニューを開く
    ヒエラルキーウィンドウの空白部分で右クリックします。すると、メニューが表示されます。
  3. 「Create Empty」を選択
    メニュー内から「Create Empty」をクリックします。これで空のオブジェクトが作成されます。
  4. 名前を変更する
    新しく作成された空のオブジェクトは「GameObject」という名前になります。この名前をダブルクリックして、「Manager」や「Controller」など、役割がわかりやすい名前に変更しましょう。(この記事の例では「Manager」とします。)

なぜ空のオブジェクトを使うのか?

空のオブジェクトは、以下のような使い道があります:

  • スクリプトや機能をまとめる「管理者」として機能。
  • 特定の位置や基準点としてシーン内で利用。
  • 無駄な見た目や機能を持たずに、シーン内のロジックを整理。

今回の記事では、この空のオブジェクトにスクリプトをアタッチして、クリックしたオブジェクトの名前をリストに追加する役割を与えます。


これで空のオブジェクトの準備は完了です!次のステップでは、スクリプトを作成して、このオブジェクトに機能を追加していきましょう。



5. スクリプトの作成

次に、オブジェクトをクリックした際にその名前をリストに追加し、オブジェクトを削除する仕組みを実現するスクリプトを作成します。Unityではスクリプトを簡単に作成して、さまざまな操作を実現できます。

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

  1. プロジェクトウィンドウを開く
    Unityエディターの下部にある「Project」タブをクリックして、プロジェクトウィンドウを開きます。
  2. スクリプトを作成
    プロジェクトウィンドウ内で空白部分を右クリックして、以下のように操作します。
    **「Create」→「C# Script」**を選択してください。
  3. スクリプト名を変更
    作成されたスクリプトの名前を**「ListMake」**に変更します(名前を変更するには、スクリプトを右クリックして「Rename」を選択します)。

スクリプトを開いてコードを記述

次に、スクリプトをダブルクリックしてVisual Studioや選択したコードエディタを開きます。以下のコードをスクリプトにコピーして貼り付けましょう。

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

public class ListMake : MonoBehaviour
{
    // 名前を格納するリスト
    public List<string> myList = new List<string>();

    void Update()
    {
        // カメラのスクリーン座標からレイを発射
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        // 左クリックが押されたとき
        if (Input.GetMouseButtonDown(0))
        {
            // オブジェクトに当たったか確認
            if (Physics.Raycast(ray, out hit))
            {
                // オブジェクトの名前をリストに追加
                myList.Add(hit.collider.gameObject.name);

                // オブジェクトを非表示(無効化)
                hit.collider.gameObject.SetActive(false);
            }
        }
    }
}

コードのポイント解説

  • myList
    このリストはクリックされたオブジェクトの名前を保存するためのものです。
  • レイキャスト(Raycast)
    カメラからマウスカーソルの位置に向けて仮想の光線を発射し、それがオブジェクトに当たったかを判定します。
  • Input.GetMouseButtonDown(0)
    マウスの左クリックが押されたタイミングを検出します。
  • オブジェクトの非表示化
    hit.collider.gameObject.SetActive(false);を使用してクリックされたオブジェクトを非表示にします。

これで、クリックしたオブジェクトの名前を記録し、削除するスクリプトが完成です。次のステップでは、このスクリプトを空のオブジェクトにアタッチして、動作させる方法を説明します。



6.スクリプトをオブジェクトにアタッチする方法

スクリプトを作成したら、それをUnity内のオブジェクトにアタッチする必要があります。このステップでは、作成したスクリプト「ListMake」を空のオブジェクトにアタッチする手順を詳しく説明します。


手順 1: 空のオブジェクトを選択

  1. ヒエラルキーウィンドウで先ほど作成した「空のオブジェクト」を見つけてクリックします。
    • 名前を「Manager」など分かりやすいものに変更すると管理がしやすくなります。

手順 2: プロジェクトウィンドウでスクリプトを確認

  1. プロジェクトウィンドウで「ListMake」という名前のスクリプトを探します。
    • 作成したスクリプトが表示されない場合は、Assetsフォルダが選択されているか確認してください。

手順 3: スクリプトをドラッグ&ドロップ

  1. 「ListMake」スクリプトを選択し、ヒエラルキーウィンドウ内の空のオブジェクト(例:「Manager」)にドラッグ&ドロップします。
    • ドロップすると、インスペクターウィンドウにスクリプトが追加されているのが確認できます。

手順 4: スクリプトの確認

  1. インスペクターウィンドウを開き、空のオブジェクトが選択されていることを確認します。
  2. 「ListMake (Script)」というコンポーネントが追加されていることを確認してください。
    • ここに「My List」というフィールドが表示されるはずです。このリストにクリックしたオブジェクトの名前が追加されます。

注意点

  • 間違ったオブジェクトにアタッチした場合は、インスペクターウィンドウでスクリプトを右クリックし、「Remove Component」を選択することで削除できます。
  • スクリプトエラーが表示される場合は、スクリプト内のコードに誤りがないか確認しましょう。

これで、スクリプトが正しくアタッチされました。次に、ゲームビューで動作をテストし、クリックしたオブジェクトがリストに追加されるか確認してみましょう!



7.テストプレイ

さあ、スクリプトの準備が整いました!ここからは、実際にUnityエディターで動作を確認してみましょう。以下の手順に従ってテストプレイを行い、正しく動作しているか確認してください。


1. プレイモードを開始する

  1. Unityエディターの上部にある「▶」ボタンをクリックしてプレイモードを開始します。
  2. シーンビューがゲームビューに切り替わり、テストプレイができる状態になります。

2. オブジェクトをクリックして削除

  1. ゲームビューで配置した3Dオブジェクトを左クリックします。
  2. 左クリックしたオブジェクトが瞬時に非表示になり(SetActive(false))、削除されたように見えるはずです。

3. 名前がリストに追加されているか確認

  1. プレイモードのまま、空のオブジェクトにアタッチしたスクリプト(ListMake)をインスペクターで選択します。
  2. スクリプトのインスペクター内にある「My List」の項目を展開し、クリックしたオブジェクトの名前がリストに追加されていることを確認します。

4. プレイモードを終了する

  1. テストが終わったら、再び「▶」ボタンをクリックしてプレイモードを終了します。
  2. 注意:プレイモード中に変更した内容は、モード終了後にリセットされるため注意してください。

期待される結果

  • ゲームビューでオブジェクトをクリックすると、該当オブジェクトが非表示になります。
  • 空のオブジェクトにアタッチしたスクリプトの「My List」に、削除されたオブジェクトの名前が順番に記録されます。

これでテストプレイは完了です!動作が期待通りになっていれば成功です。もしうまく動作しない場合は、スクリプトのエラーや設定を再確認してください。



応用アイデア

ここでは、今回作成した仕組みをさらに発展させる2つの方法を解説します。これらを実装することで、ゲームの体験をより魅力的にすることができます。


1. 名前をファイルに保存する方法

オブジェクトの名前をリストに保存するだけでなく、テキストファイルに書き出せば、ゲーム終了後もデータを確認できます。この方法はセーブ機能やログ保存に役立ちます。

ステップ 1: 必要な名前空間をインポート

スクリプトの冒頭でSystem.IOをインポートします。

using System.IO;

ステップ 2: 名前をファイルに保存するコードを追加

ゲーム終了時にリスト内の名前をテキストファイルに保存するコードを記述します。

private void OnApplicationQuit()
{
string path = Application.dataPath + "/SavedNames.txt";
File.WriteAllLines(path, myList);
Debug.Log("オブジェクト名をファイルに保存しました: " + path);
}

効果

  • ゲーム終了時に、クリックされたオブジェクトの名前がSavedNames.txtに保存されます。
  • 開発者はテスト用のログとして活用でき、プレイヤーにセーブデータとして提供することも可能です。

2. オブジェクト削除時に特殊エフェクトを追加する方法

オブジェクトが削除される際に、爆発や光のエフェクトを発生させることで、視覚的な演出を加えられます。

ステップ 1: エフェクト用のプレハブを準備

Unity Asset Storeから無料のエフェクトをダウンロードするか、自分で作成したプレハブを用意します。

ステップ 2: エフェクトを生成するコードを追加

スクリプトに以下のコードを追加し、エフェクトを生成します。

public GameObject explosionEffect; // インスペクターで設定

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

if (Input.GetMouseButtonDown(0))
{
if (Physics.Raycast(ray, out hit))
{
// エフェクトを生成
Instantiate(explosionEffect, hit.transform.position, Quaternion.identity);

// 名前をリストに追加
myList.Add(hit.collider.gameObject.name);

// オブジェクトを非表示
hit.collider.gameObject.SetActive(false);
}
}
}

ステップ 3: プレハブをインスペクターで設定

  • ヒエラルキーにスクリプトをアタッチしたオブジェクトを選択。
  • インスペクターでexplosionEffectにエフェクトのプレハブをドラッグ&ドロップします。

効果

  • プレイヤーがオブジェクトをクリックした際、爆発や光の演出が発生し、ゲーム体験が向上します。
  • シューティングゲームやパズルゲームなど、幅広いジャンルに応用可能です。

これらの応用方法を活用して、オリジナルの仕組みをさらに魅力的に仕上げてみましょう。Unityの機能を駆使して、あなたのアイデアを形にしてください!



よくある質問(FAQ)

Q
レイキャストが機能しない場合の対処法は?
A

レイキャストが正しく動作しない場合、以下を確認してください:

  • Colliderの設定: 対象のオブジェクトにColliderが付いているか確認してください。Colliderがないとレイキャストに反応しません。
  • カメラの向き: レイキャストはカメラの向きに基づいて発射されます。カメラがオブジェクトを向いていない場合、レイキャストが当たりません。
  • 距離の設定: レイキャストの範囲を明確に指定することで、不要なエラーを防げます。Physics.Raycast(ray, out hit, 100f)のように距離を設定してみてください。
Q
他の種類のオブジェクトも反応させたい場合は?
A

特定のオブジェクトだけに反応する制限を解除したい場合、以下を試してください:

  • タグの設定: すべてのオブジェクトに共通のタグを設定し、スクリプトでそのタグを条件にすることができます。
    if (hit.collider.gameObject.CompareTag("YourTag")) { // 処理内容 }
  • レイヤーの使用: レイヤーマスクを使って反応するオブジェクトの種類をカスタマイズすることも可能です。
Q
削除ではなく、削除されたオブジェクトを復元するには?
A

削除ではなく無効化(SetActive(false))を行うことで、オブジェクトを復元する仕組みを簡単に追加できます。以下の手順を参考にしてください:

  1. リストに名前だけでなく、オブジェクト自体も保存
    public List<GameObject> objectList = new List<GameObject>();
  2. クリック時にリストにオブジェクトを保存
    objectList.Add(hit.collider.gameObject); hit.collider.gameObject.SetActive(false);
  3. 復元用のメソッドを作成
    public void RestoreObjects() { foreach (GameObject obj in objectList) { obj.SetActive(true); } objectList.Clear(); }ボタンを追加してこのメソッドを呼び出すと、削除したオブジェクトを復元できます。

おすすめのアセット

「Bad Word Filter PRO」は、Unityプロジェクト内で不適切な言葉を自動的に検出・フィルタリングするための強力なツールです。このアセットを導入することで、ユーザー生成コンテンツやチャット機能において、健全なコミュニケーション環境を維持できます。

主な特徴:

  • 多言語対応: 日本語を含む複数の言語での不適切な表現を検出可能です。
  • カスタマイズ可能な辞書: 独自の単語リストを追加・編集し、プロジェクトのニーズに合わせたフィルタリングが行えます。
  • 高いパフォーマンス: 大量のテキストデータでも迅速に処理し、ゲームやアプリのパフォーマンスを損なうことなく動作します。

おすすめポイント:

  • 簡単な導入: 複雑な設定なしで、プロジェクトにすぐに組み込めます。
  • 柔軟な設定: フィルタリングの厳しさや対象範囲を自由に調整可能です。
  • 信頼性の高いサポート: 開発者からの迅速なサポートが受けられ、安心して利用できます。