UnityUnityメモ

Unityで3Dオブジェクトをランダム生成!タグを使用してカウントする方法

Unity

1.はじめに

こんにちは!今回はUnityを使って、3Dオブジェクト(キューブ、スフィア、シリンダー)をランダムに生成し、それぞれの数をリアルタイムでカウントして表示する方法を紹介します。この方法を学ぶと、ゲーム内でさまざまなオブジェクトをランダムに生成する仕組みを簡単に実装できるようになりますよ。

これをマスターすれば、Unityでのスクリプト作成に自信がつき、ゲーム開発の新たなステップに進む準備が整います。それでは、さっそく始めていきましょう!

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



2. 事前準備

この記事では、Unityを使って「キューブ」「スフィア(球体)」「シリンダー(円柱)」をランダムに生成し、それぞれのオブジェクトを数える仕組みを作ります。まずは事前準備として、必要なオブジェクトの作成と設定を行いましょう!


2-1. Unityプロジェクトの作成

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

  1. Unity Hubを開き、「新しいプロジェクト」をクリックします。
  2. テンプレートは「3D Core」を選択し、プロジェクト名を入力して「作成」をクリックします。

2-2. 必要な3Dオブジェクトを作成する

Unityエディターで以下の手順で3Dオブジェクトを作成します。

  1. キューブを作成
    • ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
    • 「3D Object」→「Cube」を選択すると、シーン内にキューブが追加されます。
  2. スフィア(球体)を作成
    • 同様に、右クリック →「3D Object」→「Sphere」を選択して球体を追加します。
  3. シリンダー(円柱)を作成
    • 最後に、右クリック →「3D Object」→「Cylinder」を選択して円柱を追加します。

それぞれのオブジェクトに適切な名前を付けましょう。

  • キューブには「Cube」
  • 球体には「Sphere」
  • 円柱には「Cylinder」

これで3種類のオブジェクトが準備できました!


2-3. タグを設定する

タグを使うことで、各オブジェクトを識別しやすくします。

  1. 新しいタグを作成
    • 各オブジェクトを選択した状態で、インスペクターパネルの「Tag」ドロップダウンメニューをクリックします。
    • 「Add Tag…」を選択し、新しいタグを追加する画面を開きます。
    • 以下の3つのタグを追加してください。
      • Cube
      • Sphere
      • Cylinder
  2. タグをオブジェクトに設定
    • 再び各オブジェクトを選択し、「Tag」メニューから対応するタグを設定します。
      • Cube → Cube
      • Sphere → Sphere
      • Cylinder → Cylinder

これで、タグの設定は完了です!


2-4. オブジェクトをプレハブ化する

プレハブを使うことで、オブジェクトを効率的に生成できます。

  1. 各オブジェクト(Cube、Sphere、Cylinder)をヒエラルキーからドラッグ&ドロップして、プロジェクトウィンドウの「Assets」フォルダに移動します。
  2. これで、それぞれのオブジェクトがプレハブとして保存されます。

プレハブ化したオブジェクトは、今後のスクリプトで使用します。


これで、ランダム生成の準備が整いました!次はUIテキストを作成して、オブジェクトのカウントを表示する準備をしましょう。



3.テキストの作成

オブジェクトの数を表示するために、画面上にテキストを設置します。このテキストは、Cube、Sphere、Cylinderそれぞれのオブジェクトの数をリアルタイムで表示する役割を果たします。以下の手順で進めましょう。


1. UIテキストの追加

  1. ヒエラルキーウィンドウでUIを作成
    • ヒエラルキーウィンドウを右クリックします。
    • メニューから「UI」→「Text – TextMeshPro」を選択します。
      ※「TextMeshProを使用するか確認」ダイアログが出た場合、「インポート」をクリックしてください。
  2. テキストオブジェクトの名前変更
    • ヒエラルキーウィンドウで作成された「Text (TMP)」を選択し、名前を変更します。
      例: CubeText
  3. テキストの内容を編集
    • インスペクタウィンドウの「TextMeshPro (Script)」コンポーネントを探します。
    • 初期テキストを「Cube: 0」に変更します。
  4. 位置やサイズの調整
    • Rect Transformを使って、画面上の配置を調整します。
    • Cube用のテキストは画面左上に配置すると見やすくなります。
  5. 同様にSphere用とCylinder用のテキストを作成
    • 上記の手順を繰り返して「SphereText」と「CylinderText」を作成します。
    • テキスト内容を「Sphere: 0」「Cylinder: 0」にそれぞれ設定します。

2. テキストのカスタマイズ

作成したテキストは、見やすくなるようにカスタマイズできます。

  1. フォントサイズの変更
    • インスペクタウィンドウの「Font Size」項目で文字の大きさを変更します。おすすめは24~36程度。
  2. 色の変更
    • 「Color」設定から、テキストの色を変更します。
      • Cube: 青色 (#0000FF)
      • Sphere: 緑色 (#00FF00)
      • Cylinder: 赤色 (#FF0000)
  3. 背景を追加(任意)
    • 必要に応じて、背景に「Image」オブジェクトを追加してテキストを強調表示できます。

3. テキストオブジェクトの管理

作成した3つのテキストを整理しておくと管理が楽になります。

  1. 空のオブジェクトを作成
    • ヒエラルキーウィンドウで右クリックし、「Create Empty」を選択。
    • 名前を「TextManager」に変更します。
  2. 子オブジェクトに設定
    • CubeText、SphereText、CylinderTextをドラッグしてTextManagerの子オブジェクトにします。

ここまでで、画面にCube、Sphere、Cylinderの数を表示するテキストが準備できました。次は、このテキストをスクリプトで更新していきます。ゲームオブジェクトの生成やカウントの仕組みと組み合わせて、実際に動作するようにしていきましょう!



4. スクリプトの作成

それでは、クリックで3Dオブジェクトをランダムに生成し、それぞれの数をカウントして表示するスクリプトを作成しましょう!


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

まずは、プロジェクト内に新しいC#スクリプトを作成します。

  1. プロジェクトウィンドウで空いている場所を右クリックします。
  2. **「Create」→「C# Script」**を選択。
  3. 作成されたスクリプトに「GameManager」という名前を付けます。

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

作成した「GameManager」スクリプトをダブルクリックして開き、以下のコードを貼り付けてください。

using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    private Vector3 mousePosition; // マウスの位置を格納する変数
    private int count; // ランダム選択用の変数
    public GameObject[] prefabArray; // プレハブの配列
    public Text cubeCountText; // キューブ数を表示するテキスト
    public Text cylinderCountText; // 円柱数を表示するテキスト
    public Text sphereCountText; // 球体数を表示するテキスト

    void Update()
    {
        // マウスクリックを検知
        if (Input.GetMouseButtonDown(0))
        {
            // ランダムに生成するオブジェクトを選択
            count = Random.Range(0, prefabArray.Length);

            // マウス位置を取得
            mousePosition = Input.mousePosition;
            mousePosition.z = 10.0f; // カメラからの距離を設定

            // 選択されたオブジェクトを生成
            Instantiate(prefabArray[count], Camera.main.ScreenToWorldPoint(mousePosition), Quaternion.identity);
        }

        // 各オブジェクトの数をカウント
        GameObject[] cubeObjects = GameObject.FindGameObjectsWithTag("Cube");
        GameObject[] cylinderObjects = GameObject.FindGameObjectsWithTag("Cylinder");
        GameObject[] sphereObjects = GameObject.FindGameObjectsWithTag("Sphere");

        // テキストを更新
        cubeCountText.text = "Cube: " + cubeObjects.Length.ToString();
        cylinderCountText.text = "Cylinder: " + cylinderObjects.Length.ToString();
        sphereCountText.text = "Sphere: " + sphereObjects.Length.ToString();
    }
}

3. スクリプトの解説

このスクリプトの主な機能を説明します:

  1. クリックでオブジェクトを生成
    • Input.GetMouseButtonDown(0)でマウスの左クリックを検知します。
    • Random.Rangeを使ってprefabArray内からランダムに1つのオブジェクトを選びます。
    • マウスの位置にオブジェクトを生成します。
  2. タグを使ったオブジェクトのカウント
    • GameObject.FindGameObjectsWithTag("Cube")でシーン内のキューブをすべて取得します。
    • 同様に、円柱と球体も取得して、それぞれの数を数えます。
  3. UIテキストの更新
    • 各オブジェクトの数をTextコンポーネントに表示します。

4. 注意点

  • 必ずPrefabのタグを設定し、「Cube」「Sphere」「Cylinder」という名前で統一してください。
  • prefabArrayには、キューブ、スフィア、シリンダーのプレハブをInspectorから割り当ててください。
  • TextフィールドにもInspectorでテキストオブジェクトを設定してください。

次に、このスクリプトを空のゲームオブジェクトにアタッチして動作を確認しましょう!



5.スクリプトのアタッチと設定

スクリプトを作成したら、次にそれをUnityエディター上で設定していきます。ここでは、作成したスクリプトをゲームオブジェクトにアタッチし、必要なPrefabやUIテキストを設定する手順を詳しく解説します。


1. 空のゲームオブジェクトを作成する

  1. Hierarchyウィンドウで右クリックし、メニューから「Create Empty(空のオブジェクトを作成)」を選びます。
  2. 作成された空のゲームオブジェクトを選択し、Inspectorウィンドウで名前を「GameManager」など分かりやすい名前に変更します。

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

  1. Projectウィンドウから、先ほど作成したスクリプトファイル(例: GameManager.cs)を探します。
  2. スクリプトをドラッグし、Hierarchyウィンドウの「GameManager」オブジェクトにドロップします。
  3. Inspectorウィンドウを確認すると、スクリプトが「GameManager」オブジェクトにアタッチされていることが分かります。

3. スクリプトにPrefabを設定する

  1. Hierarchyウィンドウで作成したCube、Sphere、Cylinderのオブジェクトを選択し、それぞれをProjectウィンドウにドラッグ&ドロップしてPrefab化します。
  2. 次に「GameManager」オブジェクトを選択し、InspectorウィンドウでスクリプトのPrefabArrayフィールドを確認します。
  3. フィールド右側の「サイズ(Size)」に3を入力します。
  4. PrefabArrayの3つのスロットに、作成したPrefab(Cube、Sphere、Cylinder)を順番にドラッグ&ドロップして設定します。

4. スクリプトにUIテキストを設定する

  1. Hierarchyウィンドウで「Canvas」を作成し、その中に「Text」を3つ追加します。
    • メニューから「UI」→「Text」を選んで作成できます。
  2. それぞれのテキストの名前を「CubeText」、「SphereText」、「CylinderText」に変更します。
  3. Inspectorウィンドウでフォントサイズや色を調整し、わかりやすい位置に配置します。
  4. 再び「GameManager」オブジェクトを選択し、Inspectorウィンドウでスクリプトのテキストフィールド(CubeCountTextなど)を確認します。
  5. フィールドに、Hierarchyウィンドウ内の該当するテキストオブジェクトをドラッグ&ドロップして割り当てます。



6. 動作確認

動作確認

  1. 再確認事項
    • プレハブ(Cube、Sphere、Cylinder)がすべて設定されているか確認。
    • Textオブジェクトがそれぞれ正しくInspectorに割り当てられているか確認。
  2. ゲームを実行
    • Unityエディター上部の「▶(再生ボタン)」をクリックしてゲームを実行します。
    • 画面をクリックしてみてください。クリックした位置にCube、Sphere、Cylinderのいずれかがランダムに生成されるはずです。
  3. 生成結果の確認
    • UIテキストが更新され、各オブジェクトの数が表示されていることを確認してください。
      • 例: 「Cube: 3」「Sphere: 1」「Cylinder: 2」など。

以上で、動作確認の解説は終了です!



7.トラブルシューティング

もし上手く動作しない場合は、以下の項目を確認してみてください。


1. オブジェクトが生成されない場合

  • 原因1: Prefabが設定されていない
    • InspectorでGameManagerスクリプトの PrefabArray にすべてのプレハブが設定されているか確認してください。
  • 原因2: スクリプトのスペルミス
    • Instantiate() メソッドや GameObject.FindGameObjectsWithTag() の記述に誤りがないか確認しましょう。

対処法:

  1. PrefabArrayスロットにCube、Sphere、Cylinderをドラッグ&ドロップしてください。
  2. スクリプトをもう一度確認し、エラー箇所を修正してください。

2. UIテキストが更新されない場合

  • 原因1: テキストオブジェクトが正しく設定されていない
    • GameManagerスクリプト内の CubeCountTextSphereCountTextCylinderCountText に対応するUIテキストが割り当てられているか確認してください。
  • 原因2: テキストコンポーネントが正しくリンクされていない
    • Inspectorでリンクミスがないかチェックしましょう。

対処法:

  • テキストオブジェクトをInspectorで確認し、スロットに正しいオブジェクトをドラッグ&ドロップします。

3. エラーが発生する場合

  • エラー1: NullReferenceException
    • オブジェクトまたはテキストがスクリプトに割り当てられていない可能性があります。
  • エラー2: ArgumentOutOfRangeException
    • ランダム生成時にPrefabArrayの範囲外の値を指定している可能性があります。

対処法:

  • PrefabArray.Length を使い、ランダム範囲が適切に設定されているか確認してください。
count = Random.Range(0, prefabArray.Length);

4. タグが認識されない場合

  • 原因: タグの設定ミス
    • オブジェクトに正しいタグ(Cube、Sphere、Cylinder)が設定されているか確認してください。

対処法:

  • 各オブジェクトをHierarchyウィンドウで選択し、Inspectorでタグを再確認・再設定してください。

5. クリック位置がズレる場合

  • 原因: カメラの設定ミス
    • スクリプト内の Camera.main.ScreenToWorldPoint() の計算に問題があるかもしれません。

対処法:

  • mousePosition.z の値が適切か確認し、カメラの位置と生成位置が合っているか調整してください。

エラーや不具合が発生した場合でも、落ち着いて設定を一つずつ確認することで解決できます。特に、Prefabとタグの設定ミスが初心者にはよくあるポイントです。問題が解決しない場合は、Consoleウィンドウでエラーメッセージを確認し、エラー内容を理解して修正を試みましょう。



よくある質問

Q
タグの設定が正しく反映されません。どうすればいいですか?
A

タグを追加したら、オブジェクトの「Tag」メニューで正しく選択されているか確認してください。

Q
オブジェクトが生成されません。原因は何ですか?
A

スクリプト内のPrefabアレイが正しく設定されているか、Inspectorで確認してください。

Q
UIテキストが更新されません。どうしたらいいですか?
A

Textコンポーネントが正しく割り当てられているか、Inspectorで確認し、スクリプトとリンクされているか確認してください。

おすすめのアセット

「Hypercasual Runner Starter Kit」は、簡単にランナーゲームを作れるUnityアセットです。このキットを使えば、プログラミングの知識がなくてもすぐにゲームの制作を始められます。キットには基本的なランナーゲームの要素が全て含まれており、キャラクターの移動、障害物の配置、得点システムなど、すぐに使える機能が揃っています。