UnityUnityメモ

Unityで簡単実装!触れたオブジェクトの名前をリストに追加する方法

Unity

はじめに

この記事では、Unityを使って「プレイヤーが触れたオブジェクトの名前をリスト(List)に順番に追加する仕組み」を作る方法を解説します。この仕組みは、簡単なゲームのスコア管理や、触れたアイテムを記録する用途などに活用できます。

今回はCube(キューブ)を動かして、複数のオブジェクトにぶつかった際に、オブジェクトの名前をリストに格納する方法を詳しく説明していきます!

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




1. キューブを動かす準備をする

Cubeの作成

  1. Hierarchyウィンドウで右クリック → 3D ObjectCubeを選びます。
  2. 作成されたCubeを「Player」と名前を変更します。

Rigidbodyの追加

  1. InspectorウィンドウAdd Componentボタンをクリック。
  2. Rigidbodyを検索して追加します。
  3. Rigidbodyの「Use Gravity」のチェックを外します。

見た目をわかりやすくする

  1. Assetsフォルダで右クリック → CreateMaterialを選択して新しいマテリアルを作成します。
  2. Cubeにドラッグ&ドロップして、好きな色を設定します。



2. 触れるオブジェクトを作成

Sphere、Cylinder、Capsuleの作成

  1. Hierarchyウィンドウで右クリック → 3D ObjectからSphereCylinderCapsuleを選んで作成します。
  2. 名前をそれぞれ「Sphere」「Cylinder」「Capsule」に変更します。

タグを設定

  1. Hierarchyウィンドウでそれぞれのオブジェクトを選択します。
  2. Inspectorウィンドウの上部にあるTag欄をクリック → Add Tagを選びます。
  3. 「+」ボタンを押して新しいタグ「Target」を作成。
  4. 作成した「Target」タグをSphere、Cylinder、Capsuleに設定します。

コライダーの設定

  1. InspectorウィンドウCollider(例えばSphere ColliderやCapsule Collider)を確認。
  2. Is Triggerにチェックを入れます。

配置

  1. 各オブジェクトをCube(Player)から少し離して配置します。こうすることで、Cubeを動かしてぶつかりやすくなります。



3. スクリプトで動きを設定

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

  1. Projectウィンドウで右クリック → CreateC# Scriptを選択。
  2. スクリプト名を「CubeMove」に変更します。
  3. 作成したスクリプトをCubeにドラッグ&ドロップしてアタッチします。

CubeMove.cs のコード

以下のコードをスクリプトに記述します。

1) リストの宣言

  • 何をしている?
    リストというデータを作っています。このリストには「キューブが触れたオブジェクトの名前」が追加されていきます。
  • リストって何?
    リストは、たくさんのデータを順番に並べて保存できるものです。この場合、文字(名前)をたくさん入れられる箱みたいなものですね。

2) キューブを移動させる部分

  • 何をしている?
    矢印キーやWASDキーを使ってキューブを動かします。
  • 詳しい説明:
    • Input.GetAxis("Horizontal")
      • 左右(横)のキー入力を取得します。例えば、右矢印キーやDを押すと正の値、左矢印キーやAを押すと負の値になります。
    • Input.GetAxis("Vertical")
      • 上下(縦)のキー入力を取得します。例えば、上矢印キーやWを押すと正の値、下矢印キーやSを押すと負の値になります。
    • Time.deltaTime
      • フレームごとの時間のずれを計算して、動きをスムーズにします。
    • transform.position
      • キューブの位置を変更します。x方向(左右)とz方向(前後)を計算して新しい位置を決めています。

3) トリガーに触れたときの処理

  • 何をしている?
    キューブが特定のオブジェクト(「Target」というタグがついているもの)に触れたら、そのオブジェクトの名前をリストに追加して非表示にします。
  • 詳しい説明:
    • OnTriggerEnter
      • 他のオブジェクトに「触れた瞬間」に呼び出される特別な関数です。
    • if (other.gameObject.tag == "Target")
      • 触れたオブジェクトのタグが「Target」の場合にだけ、次の処理を行います。
    • myList.Add(other.gameObject.name)
      • リストにオブジェクトの名前を追加します。
    • other.gameObject.SetActive(false)
      • オブジェクトを非表示にします(ゲーム中に「消えたように見える」)。

3. 全体の動き

  1. キーボードの矢印キーやWASDキーを押してキューブを移動します。
  2. キューブが「Target」タグを持つオブジェクトに触れると、そのオブジェクトの名前がリストに追加されます。
  3. 触れたオブジェクトは非表示になります(SetActive(false))。
  4. こうして、キューブがどのオブジェクトに触れたかを記録しながらゲームを進めます。

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

public class CubeMove : MonoBehaviour
{
    // リストの宣言
    public List<string> myList = new List<string>();

    void Update()
    {
        // キューブを移動させるコード
        float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3.0f;
        float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
        transform.position = new Vector3
        (
            transform.position.x + dx, 0, transform.position.z + dz
        );
    }

    void OnTriggerEnter(Collider other)
    {
        // タグが「Target」のオブジェクトに触れた場合
        if (other.gameObject.tag == "Target")
        {
            // オブジェクトの名前をリストに追加
            myList.Add(other.gameObject.name);
            // オブジェクトを非アクティブにする
            other.gameObject.SetActive(false);
        }
    }
}



4. ゲームをプレイして動作確認

  1. Gameウィンドウで「Play」を押してゲームを開始。
  2. キーボードの矢印キー(またはWASDキー)でCubeを操作します。
  3. Sphere、Cylinder、Capsuleにぶつかると、名前がmyListに追加され、オブジェクトが非表示になります。



よくある質問 (Q&A)

Q1: Unityでタグを設定するのを忘れた場合はどうなりますか?
A1: タグが設定されていないオブジェクトに触れてもリストに追加されません。タグをしっかり設定しましょう!

Q2: なぜリジッドボディの「Use Gravity」を外す必要がありますか?
A2: Gravityが有効だとCubeが下に落ちてしまうため、外しています。

Q3: 他の形のオブジェクトも追加できますか?
A3: もちろん可能です!「Target」タグを設定すれば、どんな形のオブジェクトでも対応できます。

おすすめのアセット

「Go/NoGo Task Response Time Measurement Tools」は、Unityを使用して反応時間を測定するためのツールです。このアセットを利用することで、Go/NoGoタスクを簡単に実装し、ユーザーの反応時間を正確に計測できます。

主な特徴:

  • 直感的な設定: 複雑なスクリプトなしで、タスクのパラメータを簡単に調整可能です。
  • 高精度なデータ収集: ミリ秒単位で反応時間を記録し、詳細な分析が行えます。
  • 柔軟なカスタマイズ: タスクの内容や難易度を自由に設定し、さまざまな実験ニーズに対応します。

おすすめポイント:

  • 初心者にも優しい設計: 導入が簡単で、すぐに使用を開始できます。
  • 高い互換性: Unityのビルトイン、URP、HDRPなど、主要なレンダーパイプラインと互換性があります。
  • 豊富なサポート: 開発者からの迅速なサポートが受けられ、安心して利用できます。