UnityUnityメモ

UnityでCubeを動かして衝突オブジェクトの名前を取得する方法【初心者向け】

Unity

1. はじめに

Unityでゲーム開発を始めたばかりの方にとって、「オブジェクトの動き」や「衝突判定」は基本中の基本です。この仕組みを理解することで、インタラクティブなゲームの開発に一歩近づきます。

本記事では、Cube(立方体)をキーボードで操作し、他のオブジェクトに触れた際にそのオブジェクトの名前を取得して表示する方法を、初心者にも分かりやすく解説します。


この記事で学べること

  • Unityシーンにオブジェクトを追加する方法
  • キーボード入力でCubeを動かすスクリプトの作成方法
  • 他のオブジェクトと衝突した際にその名前を取得して表示する仕組み

ゲーム開発の基礎となる知識を習得しながら、プログラミングやUnityの操作に慣れていきましょう!


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




2. シーンの準備

ここでは、Unityでシーンを設定し、Cube(キューブ)や他のオブジェクトを配置する手順を解説します。準備が整えば、すぐにスクリプトを作成して動作確認を進めることができます!


Step 1: 新しいシーンを作成

  1. Unityを開き、メニューバーからFileNew Sceneを選択します。
  2. 新しいシーンが開いたら、名前を付けて保存します(例: CubeCollisionScene)。

Step 2: Cube(キューブ)を追加

  1. ヒエラルキーウィンドウで右クリックし、3D ObjectCubeを選択します​例文。
  2. Cubeがシーンに追加されます。
    位置とサイズの確認:
    • 位置: インスペクターでTransformPosition(0, 0.5, 0)に設定します。
    • サイズ: デフォルト(Scale(1, 1, 1))のままでOKです。

Step 3: 他のオブジェクト(SphereやCylinderなど)を追加

  1. ヒエラルキーウィンドウで再び右クリックし、3D ObjectSphereを選択します。
    • 位置: TransformPosition(2, 0.5, 0)に設定します。
  2. 同様に、Cylinderや他の3Dオブジェクトを追加します。
    • 各オブジェクトの位置をCubeの周りに配置し、動かして触れることができるようにします。

Step 4: シーンの見やすさを調整

  1. カメラの位置を調整する
    • ヒエラルキーからMain Cameraを選択し、Position(0, 5, -10)Rotation(30, 0, 0)に設定します。
  2. 照明を確認する
    • ヒエラルキーでDirectional Lightを選択し、シーン全体が明るく見えるように調整します。

これで、シーンの準備は完了です!次のステップでは、Cubeを動かすためのスクリプトを作成していきます。



3. Cubeを動かすスクリプトの作成

ここでは、Cubeをキーボード操作で動かすスクリプトを作成し、それをCubeにアタッチする方法を解説します。シンプルなスクリプトなので、初心者でも簡単に理解できます!


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

  1. プロジェクトウィンドウで空白の部分を右クリックします。
  2. CreateC# Scriptを選択し、スクリプト名をCubeMoveに変更します​例文。

Step 2: スクリプトを編集

作成したスクリプトをダブルクリックして開き、以下のコードを貼り付けます。

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

public class CubeMove : MonoBehaviour
{
    private string objName; // 衝突したオブジェクトの名前を保存する変数
    private float speed = 3.0f; // Cubeの移動速度

    void Update()
    {
        // キーボード入力でCubeを動かす
        float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
        float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * speed;

        transform.position = new Vector3(
            transform.position.x + moveX, 
            transform.position.y, 
            transform.position.z + moveZ
        );
    }

    void OnCollisionEnter(Collision other)
    {
        // 衝突したオブジェクトの名前を取得して表示
        objName = other.gameObject.name;
        Debug.Log("衝突したオブジェクトの名前: " + objName);
    }
}

コードの説明

  • Updateメソッド:
    • Input.GetAxis("Horizontal")Input.GetAxis("Vertical")を使って、矢印キーやWASDキーでCubeを動かします。
    • Time.deltaTimeでフレームレートの影響を受けないようにします。
  • OnCollisionEnterメソッド:
    • 他のオブジェクトに衝突したときに、そのオブジェクトの名前をDebug.Logでコンソールに表示します。

コード全体の説明

このスクリプトは、キューブ(立方体)オブジェクトをキーボードの矢印キーで動かし、他のオブジェクトにぶつかったときにそのオブジェクトの名前をコンソールに表示します。

各部分の説明

  • 宣言と初期化部分
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    private string objName;
    private float speed = 3.0f;
  • using文は、特定の機能を使用するための宣言です。System.CollectionsUnityEngineなどのライブラリを使っています。
  • public class CubeMove : MonoBehaviourは、新しいクラスCubeMoveを定義し、それがMonoBehaviour(Unityの基本的なスクリプトクラス)を継承しています。
  • private string objName;は、衝突したオブジェクトの名前を保存するための変数を宣言しています。
  • private float speed = 3.0f;は、キューブの移動速度を設定しています。

  • Updateメソッド
void Update()
{
    float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
    float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * speed;
    transform.position = new Vector3(
    transform.position.x + moveX, transform.position.y, transform.position.z + moveZ);
}
  • Update()は、毎フレーム(ゲームの1コマ毎)実行される関数です。
  • Input.GetAxis("Horizontal")は、左右の入力(矢印キーやジョイスティックなど)を取得します。
  • Input.GetAxis("Vertical")は、上下の入力を取得します。
  • Time.deltaTimeは、前のフレームからの経過時間を取得し、移動をフレームレートに依存しないようにします。
  • speedは移動速度を制御します。
  • transform.positionはオブジェクトの現在の位置です。これに対して新しい位置を計算して設定します。
  • OnCollisionEnterメソッド
void OnCollisionEnter(Collision other)
{
    objName = other.gameObject.name;
    Debug.Log(objName);
}
  • OnCollisionEnter(Collision other)は、他のオブジェクトに衝突したときに呼ばれる関数です。
  • other.gameObject.nameで衝突したオブジェクトの名前を取得し、objNameに保存します。
  • Debug.Log(objName)は、取得した名前をコンソールに表示します。

全体の動き

このスクリプトは、UnityのUpdate()メソッドを使って毎フレームキーボードの入力をチェックし、キューブオブジェクトを移動させます。矢印キーを押すと、その方向にキューブが動きます。また、キューブが他のオブジェクトにぶつかると、そのオブジェクトの名前がコンソールに表示されます。




4. スクリプトのアタッチ

ここでは、作成したCubeMoveスクリプトをCubeにアタッチする方法を解説します。スクリプトを正しくアタッチすることで、Cubeを動かす処理が有効になります。


Step 1: Cubeを選択

  1. ヒエラルキーウィンドウで、キーボード操作で動かしたいCubeをクリックします。
  2. インスペクターウィンドウにCubeの詳細情報が表示されます。

Step 2: スクリプトをドラッグ&ドロップ

  1. プロジェクトウィンドウで、作成したCubeMoveスクリプトを探します。
    • スクリプトはAssetsフォルダに保存されています(場所が分からない場合は検索機能を使いましょう)。
  2. スクリプトをクリックして選択し、それをインスペクターウィンドウ内のCubeにドラッグ&ドロップします​例文。

Step 3: スクリプトが正しくアタッチされているか確認

  • Cubeのインスペクターウィンドウに、CubeMove (Script) というコンポーネントが追加されていれば成功です。
  • スクリプトに設定が必要な変数(今回はありません)がある場合は、ここで設定できます。



5. 実行して動作確認

いよいよ、作成したスクリプトを使ってCubeを動かし、他のオブジェクトに触れたときにその名前が取得されるか確認します。以下の手順で動作確認を進めましょう!


Step 1: Unityエディターでシーンを再確認

  • CubeやSphereなどのオブジェクトが正しく配置されていることを確認します。
  • CubeにCubeMoveスクリプトがアタッチされていることを再度確認してください。

Step 2: 実行

  1. Unityエディターの上部にある**「Playボタン」(三角アイコン)**をクリックします。
  2. シーンが実行されます。画面中央にCubeが表示されていれば準備OKです。

Step 3: キーボード操作でCubeを動かす

  • 矢印キーまたはWASDキーを使ってCubeを動かします。
  • Cubeが指定した速度で滑らかに動いているか確認してください。

Step 4: 衝突判定の確認

  1. Cubeを他のオブジェクト(SphereやCylinderなど)に向かって動かします。
  2. 衝突したときに、Consoleウィンドウに以下のようなメッセージが表示されることを確認します。

動作確認チェックリスト

  • Cubeが矢印キーやWASDキーで動く。
  • 他のオブジェクトに触れると、Consoleウィンドウにそのオブジェクトの名前が表示される。

Step 5: トラブルシューティング

問題1: Cubeが動かない

  • スクリプトが正しくアタッチされているか確認してください。
  • Consoleウィンドウにエラーメッセージが表示されている場合は、その内容を確認して修正します。

問題2: 名前が表示されない

  • 衝突対象のオブジェクトにColliderコンポーネントがアタッチされているか確認してください。
  • 必要に応じて、CubeにRigidbodyを追加して物理演算を有効にします。

これで動作確認は完了です!
次はこの機能を応用して、ゲーム作りに活かしてみましょう。Unityを楽しんでください! 😊



よくある質問

Q
Cubeが動かない場合の対処法は?
A

スクリプトが正しくアタッチされているか確認してください。また、Consoleウィンドウにエラーが表示されていないか確認してください。

Q
Consoleに名前が表示されません。
A

衝突対象のオブジェクトにColliderがアタッチされていることを確認してください。さらに、CubeにRigidbodyが必要な場合もあります。

Q
他のオブジェクトも動かしたい場合は?
A

同様のスクリプトを作成し、動かしたいオブジェクトにアタッチすることで可能です。

おすすめのアセット

「Bubble Merge Template Editor」は、楽しくてカラフルなバブルゲームを簡単に作成できるテンプレートです。このアセットは、プレイヤーが同じ色のバブルをつなげてスコアを稼ぐゲームの制作に最適です。このテンプレートを使えば、プログラミングの知識が少なくても、楽しいバブルゲームを手軽に作ることができます。