UnityUnityメモ

Unityで3Dオブジェクト間の距離を測定しよう!簡単スクリプト解説

Unity

1. はじめに

Unityでゲームを作る中で、オブジェクト同士の距離を計算する方法を知っておくと、移動や判定、さらにはゲームロジックの構築に役立ちます。たとえば、プレイヤーと敵キャラクターの距離を測定して接近したら警告を出す仕組みや、特定の距離内でアイテムを取得できるシステムなど、幅広い用途に使えます。

この記事では、Unityで「Sphere(球体)」と「Cube(立方体)」の間の距離を計算し、その結果をコンソールに表示する方法をわかりやすく解説します。また、操作がわかりやすいようにSphereをキーボードで動かす方法も紹介します。

Unity初心者でも簡単に理解できる内容なので、ぜひ一緒に進めていきましょう!

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



2. 必要な準備

UnityでSphereとCubeの距離を計算するために、まずは基本的な準備をしましょう。ここでは、Unityプロジェクトを設定し、シーンに必要なオブジェクトを配置する方法を説明します。


1. 新しいUnityプロジェクトを作成する

  1. Unity Hubを開き、「新しいプロジェクト」ボタンをクリックします。
  2. テンプレートで「3D」を選択し、適当な名前を付けてプロジェクトを作成します。

2. Sphere(球体)をシーンに配置する

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 「3D Object」→「Sphere」を選択すると、シーンに球体が追加されます。
  3. シーンビューで位置を確認し、必要に応じて移動させます。デフォルトの位置でOKです。

3. Cube(立方体)をシーンに配置する

  1. 同じように、ヒエラルキーウィンドウを右クリックします。
  2. 「3D Object」→「Cube」を選択し、シーンに立方体を追加します。
  3. Cubeを適当な場所に配置します(たとえば、Sphereの少し右側に)。

これで基本的な準備は完了です!次は距離を計算するスクリプトを作成してみましょう。



3. スクリプトの作成

ここでは、SphereとCubeの距離を計算してコンソールに表示するスクリプトを作成します。また、Sphereをキーボードで移動できるようにする機能も追加します。


1. スクリプトファイルを作成する

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

2. スクリプトを編集する

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

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

public class DistanceCalculator : MonoBehaviour
{
    // Cubeオブジェクトを設定するためのフィールド
    [SerializeField] GameObject cube;

    void Update()
    {
        // SphereとCubeの距離を計算
        float dis = Vector3.Distance(this.transform.position, cube.transform.position);

        // 距離をコンソールに表示
        Debug.Log("距離 : " + dis);

        // 十字キーでSphereを移動
        float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * 3;
        float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * 3;
        transform.position = new Vector3(
            transform.position.x + moveX, 
            transform.position.y, 
            transform.position.z + moveZ
        );
    }
}

3. コードの説明

  • Vector3.Distance: SphereとCubeの位置(transform.position)間の距離を計算します。
  • Debug.Log: コンソールに計算結果を表示します。
  • Input.GetAxis: キーボードの入力(十字キー)を取得して、Sphereを移動させます。
    • Horizontal: 左右の動き(A/Dまたは矢印キー)。
    • Vertical: 前後の動き(W/Sまたは矢印キー)。

コード全体の説明

このスクリプトは「DistanceCalculator」という名前のクラスを持っています。これはMonoBehaviourを継承しており、Unityのゲームオブジェクトにアタッチすることで動作します。スクリプトの目的は以下の二つです:

  1. 他のオブジェクト(この場合は「cube」)との距離を計算して表示する。
  2. プレイヤーが十字キーを使ってオブジェクトを移動させる。

では、各部分の説明に進みましょう。

各部分の説明

usingディレクティブ

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

これらはUnityでスクリプトを動かすために必要なライブラリをインポートしています。

クラス宣言とフィールド

public class DistanceCalculator : MonoBehaviour
{
    [SerializeField] GameObject cube;

DistanceCalculatorというクラスが定義されており、MonoBehaviourを継承しています。[SerializeField]属性を使って、インスペクターで設定できるGameObject型のcubeというフィールドを定義しています。

Updateメソッド

void Update()
{
    float dis = Vector3.Distance(this.transform.position, cube.transform.position);
    Debug.Log("距離 : " + dis);

Updateメソッドは毎フレーム呼び出されます。まず、Vector3.Distanceメソッドを使って、このスクリプトがアタッチされたオブジェクトの位置とcubeオブジェクトの位置との距離を計算し、その結果をdisという変数に保存します。そして、その距離をコンソールに表示します。

    //十字キー操作
    float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * 3;
    float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * 3;
    transform.position = new Vector3(
    transform.position.x + moveX, transform.position.y, transform.position.z + moveZ
    );
}

次に、十字キーの入力を取得してオブジェクトを移動させる部分です。Input.GetAxis("Horizontal")は左右の入力を取得し、Input.GetAxis("Vertical")は前後の入力を取得します。これらにTime.deltaTime(前フレームからの経過時間)を掛け、移動速度を調整するためにさらに3を掛けています。そして、新しい位置を計算してオブジェクトの位置を更新しています。

全体の動き

  1. 毎フレーム、このスクリプトがアタッチされたオブジェクトとcubeオブジェクトの距離が計算され、コンソールに表示されます。
  2. プレイヤーが十字キーを押すと、その入力に基づいてオブジェクトが移動します。



4. スクリプトの設定

スクリプトを正しく機能させるために、Unityエディタでいくつかの設定を行います。この手順では、スクリプトをSphereにアタッチし、Cubeオブジェクトを設定します。


1. スクリプトをSphereにアタッチする

  1. ヒエラルキー(Hierarchy)ウィンドウで、Sphereをクリックして選択します。
  2. プロジェクトウィンドウで「DistanceCalculator」スクリプトを探します。
  3. スクリプトをドラッグ&ドロップして、Sphereにアタッチします。
    • 成功すると、インスペクター(Inspector)ウィンドウに「DistanceCalculator」コンポーネントが表示されます。

2. Cubeオブジェクトを設定する

  1. インスペクターウィンドウで、DistanceCalculatorコンポーネントを確認します。
  2. 「Cube」というフィールドが表示されているはずです。
  3. ヒエラルキーウィンドウからCubeオブジェクトをドラッグ&ドロップして、このフィールドに設定します。

これで設定は完了です!次に、スクリプトが正しく動作するかを実行して確認してみましょう。



5. 実行と確認

いよいよスクリプトを実行して、SphereとCubeの距離がコンソールに表示されることを確認します。


1. プレイモードで実行

  1. Unityエディタの上部にある再生ボタン(▶)をクリックして、プレイモードに入ります。
  2. ゲームビューに切り替え、SphereとCubeが見えることを確認します。

2. 動作確認

  1. コンソール出力の確認
    • Unityエディタの下部にある「Console」タブを開きます。
    • SphereとCubeの距離が「距離: 数値」の形式で表示されていることを確認します。
    • 数値はSphereとCubeの間の実際の距離を示しています。
  2. Sphereの移動
    • キーボードの矢印キー(またはW/A/S/Dキー)を使ってSphereを動かします。
    • Sphereが移動するにつれて、コンソールに表示される距離が変化することを確認します。

3. 問題が発生した場合の確認ポイント

  • コンソールに何も表示されない場合:
    • スクリプトがSphereに正しくアタッチされているかを確認してください。
    • Cubeが「Cube」フィールドに設定されているかを確認してください。
  • Sphereが動かない場合:
    • キーボードの入力が正しく認識されているか、スクリプトのInput.GetAxis部分を再確認してください。

これでスクリプトの動作確認は完了です!この仕組みを応用すれば、距離を使ったゲームロジックや演出を簡単に実現できます。次のセクションでは、よくある質問とその解決方法をまとめます。



よくある質問(Q&A)

Q
距離が表示されません。原因は何ですか?
A

CubeフィールドにCubeオブジェクトを正しく設定しているか確認してください。

Q
スクリプトが動作しない場合の対処法は?
A

スクリプトがSphereにアタッチされているか、エラーメッセージが出ていないか確認してください。

Q
他のオブジェクトの距離も測定できますか?
A

はい、他のGameObjectも同様に設定すれば計算できます。

おすすめのアセット

Infinite Runner Engine 3Dは、無限ランナーゲームを簡単に作成できるUnityアセットです。初心者にも使いやすく、豊富なテンプレートやサンプルシーンが含まれています。プレイヤーキャラクター、障害物、パワーアップアイテムなど、すぐに使用できるコンポーネントが揃っており、カスタマイズも自由自在です。