UnityUnityメモ

Unity初心者必見!オブジェクト同士が接近したら自動的に接続するシステムの作り方

Unity

1. はじめに

Unityでオブジェクト同士を接続して一体化し、特定の動きを実現する方法はゲーム開発でよく使用されます。例えば、プレイヤーが操作するオブジェクト(Cube)が、一定の条件下でターゲット(Sphere)と接続し、一緒に動くようにしたい場合があります。
こうした動作を簡単に実現するには、「Fixed Joint」というUnityのコンポーネントを活用するのが便利です。


この記事では、CubeがSphereに近づいたときに自動で接続し、一体化して動くシステムを作成する方法をわかりやすく解説します。初心者の方でも実践できるよう、具体的な手順とスクリプトの解説を交えながら進めていきます。

これをマスターすると、物理シミュレーションやキャラクターコントロールなど、さまざまな場面で役立つ知識が得られます。それでは、さっそく始めましょう!

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



2. 必要な準備

Unityでプロジェクトを作成し、CubeとSphereを接続する仕組みを作るためには、以下の準備が必要です。これらの手順をひとつずつ進めていきましょう。


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

まず、Unity Hubを開いて以下の手順でプロジェクトを作成します。

  1. Unity Hubで「新規プロジェクト」をクリック。
  2. テンプレートから「3D」を選択。
  3. プロジェクト名を入力し、「作成」をクリック。

2. ヒエラルキーにCubeとSphereを配置

Unityエディターのヒエラルキー(Hierarchy) ウィンドウを使って、3Dオブジェクトを追加します。

  1. ヒエラルキーウィンドウで右クリックし、「3D Object」→「Cube」を選択。
  2. 同様に、「3D Object」→「Sphere」を選択。
  3. CubeとSphereを適切な位置に配置します。
    • Cube: X=0, Y=4, Z=0
    • Sphere: X=0, Y=0, Z=0

3. Rigidbodyコンポーネントを設定

物理挙動を持たせるため、CubeとSphereの両方にRigidbodyコンポーネントを追加します。

  1. ヒエラルキーでCubeを選択し、インスペクター(Inspector) ウィンドウを開きます。
  2. 「Add Component」ボタンをクリックし、「Rigidbody」を検索して追加。
  3. CubeのRigidbody設定で「Use Gravity」のチェックを外します。
  4. Sphereにも同様にRigidbodyを追加し、「Use Gravity」はそのままオンの状態にします。

4. Fixed JointをSphereに追加

SphereがCubeと接続される際に使用するFixed Jointを追加します。

  1. ヒエラルキーでSphereを選択し、インスペクターウィンドウで「Add Component」をクリック。
  2. 「Fixed Joint」を検索して追加。
  3. まだ接続先を設定しない状態で準備完了です。

これで、必要な準備は完了です。次は、スクリプトを作成して機能を実装していきましょう!



3. Cubeの操作スクリプト作成

まず、プレイヤーがCubeを操作できるようにスクリプトを作成します。このスクリプトでは、キーボードの矢印キー(またはWASDキー)を使ってCubeを移動する仕組みを実装します。


1. スクリプトを作成する

  1. プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選択。
  2. スクリプト名を「CubeMove」とします。
  3. 作成したスクリプトをダブルクリックして、エディター(例: Visual Studio)で開きます。

2. スクリプトのコードを記述

以下のコードを「CubeMove」スクリプトに記述してください。

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

public class CubeMove : MonoBehaviour
{
    void Update()
    {
        // 水平方向と垂直方向の入力を取得
        float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3;
        float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3;

        // Cubeの位置を更新
        transform.position = new Vector3(
            transform.position.x + dx, 4, transform.position.z + dz
        );
    }
}

3. スクリプトの解説

  • Input.GetAxis:
    • キーボード入力(矢印キーやWASDキー)を取得します。
    • "Horizontal"は左右移動、"Vertical"は前後移動を表します。
  • Time.deltaTime:
    • フレームレートに依存せずスムーズな動きを実現するための補正値です。
  • transform.position:
    • 現在の位置に対して、計算された移動量を加算して更新します。
  • 固定Y座標(4):
    • Cubeが上下に動かないよう、Y軸を固定しています。

4. スクリプトをCubeにアタッチ

  1. ヒエラルキーウィンドウでCubeを選択します。
  2. プロジェクトウィンドウで作成した「CubeMove」スクリプトをドラッグ&ドロップしてCubeにアタッチします。

5. 動作確認

  1. Unityエディターの「再生ボタン」をクリックしてプレイモードを開始します。
  2. キーボードの矢印キー(またはWASDキー)を使ってCubeがスムーズに移動することを確認してください。

次は、CubeがSphereと接続する仕組みをスクリプトで実装していきましょう!



4. Fixed JointでSphereを接続

次に、SphereがCubeに近づいたときに、自動でFixed Jointを使用して接続する仕組みを作ります。このスクリプトでは、一定の距離内にCubeが入るとSphereがCubeと固定され、一体化して動くようにします。


1. スクリプトを作成する

  1. プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選択。
  2. スクリプト名を「JointOn」とします。
  3. 作成したスクリプトをダブルクリックしてエディターで開きます。

2. スクリプトのコードを記述

以下のコードを「JointOn」スクリプトに記述してください。

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

public class JointOn : MonoBehaviour
{
    // Cubeオブジェクトの参照を取得
    public GameObject target;

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

        // 一定距離以内にCubeが入った場合、接続処理を実行
        if (dis < 4.1f)
        {
            SphereGravity();
        }
    }

    void SphereGravity()
    {
        // RigidbodyのGravityを有効にする
        GetComponent<Rigidbody>().useGravity = true;

        // Fixed Jointを追加してCubeと接続
        FixedJoint fj = this.gameObject.GetComponent<FixedJoint>();
        if (fj == null)
        {
            fj = this.gameObject.AddComponent<FixedJoint>();
        }
        fj.connectedBody = target.GetComponent<Rigidbody>();
    }
}

3. スクリプトの解説

  • Vector3.Distance:
    • SphereとCubeの間の距離を計測します。
    • 閾値(ここでは4.1f)を設定することで、接続の条件を指定します。
  • SphereGravityメソッド:
    • SphereのRigidbodyの「Gravity(重力)」を有効にします。
    • SphereにFixed Jointを追加し、CubeのRigidbodyと接続します。
    • すでにFixed Jointがある場合、新たに追加されないようにチェックしています。

4. スクリプトをSphereにアタッチ

  1. ヒエラルキーでSphereを選択します。
  2. プロジェクトウィンドウで作成した「JointOn」スクリプトをSphereにドラッグ&ドロップしてアタッチします。
  3. インスペクターウィンドウで、TargetフィールドにCubeをドラッグ&ドロップして設定します。

5. 動作確認

  1. Unityエディターで「再生ボタン」をクリックしてプレイモードを開始します。
  2. キーボードでCubeを操作し、Sphereに近づけてみましょう。
  3. SphereがCubeと接続され、一体化して動くことを確認してください。

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

  • Sphereが接続されない場合:
    • SphereとCubeのRigidbodyが正しく設定されているか確認してください。
    • SphereにFixed Jointが追加されているか確認してください。
  • 接続の閾値を変更したい場合:
    • スクリプト内のif (dis < 4.1f)の値を調整してください(例: 5.0fなど)。

これで、CubeとSphereを接続する仕組みが完成です!次は、このシステムをさらに応用する方法を考えてみてもいいですね!



6. まとめ

今回の記事では、Unityを使ってCubeがSphereに近づいたときに自動で接続し、一体化して動くシステムを作成する方法を解説しました。具体的には、以下の手順を進めました:

  1. Unityプロジェクトの準備
    • CubeとSphereを配置し、RigidbodyやFixed Jointを設定。
  2. Cubeの操作スクリプト(CubeMove)の作成
    • 矢印キー(またはWASDキー)でCubeを自由に移動できるようにするスクリプトを作成。
  3. SphereとCubeの接続スクリプト(JointOn)の作成
    • Cubeが一定距離内に入ったとき、Fixed Jointを使ってSphereとCubeを接続するスクリプトを実装。
  4. 動作確認
    • 作成したスクリプトが正常に動作し、CubeとSphereが接続されて一体化する様子を確認。

応用アイデア

今回の仕組みは、さまざまなシステムに応用できます。例えば:

  • プレイヤーが特定のアイテムを拾うシステム。
  • トリガー範囲内でNPCやオブジェクトに接続する仕組み。
  • 複雑な物理シミュレーションを実現するための基礎構築。

次のステップ

以下のポイントを試してみると、さらに学びが深まります:

  • 接続条件を変更: 距離だけでなく、タグや特定のイベントをトリガーに接続する。
  • 接続後の動作をカスタマイズ: 接続後に特定のアニメーションやエフェクトを追加する。
  • Fixed Jointの設定を変更: Break ForceやBreak Torqueを使って、一定の力で接続が解除されるようにする。

Unityの「Fixed Joint」は、オブジェクト同士を簡単に接続して物理的な一体化を実現する強力なツールです。今回の例を通じて、Unityの物理エンジンとスクリプトの基本を学べたと思います。

これからも少しずつチャレンジを重ね、より魅力的なゲーム開発に取り組んでいきましょう!



よくある質問(Q&A)

Q
Fixed Jointがうまく機能しないのですが?
A

SphereとCubeのRigidbodyが正しく設定されているか確認してください。また、Fixed Jointがアタッチされていることを確認しましょう。

Q
Cubeが動かない原因は?
A

CubeMoveスクリプトがCubeに正しくアタッチされているか、またRigidbodyの「Use Gravity」がオフになっているか確認してください。

Q
距離の閾値を変更したいのですが?
A

JointOnスクリプトのif(dis < 4.1f)の数値を変更することで、距離の閾値を調整できます。