UnityUnityメモ

Unityで簡単!オブジェクト衝突で親子関係を作る方法

Unity

1. はじめに

この記事では、CubeとSphereという2つのオブジェクトを使い、衝突した際に親子関係を作る仕組みを学びます。この仕組みにより、SphereがCubeにくっついて一緒に動くようになる面白い効果を作成できます。

このチュートリアルは、Unity初心者でも簡単に取り組める内容です。スクリプトの作成方法やタグの設定方法をステップバイステップで解説しますので、プログラミングやUnityの知識が少ししかない方でも安心して進められます。

この記事を読み終える頃には、Unityの基本的な機能である「衝突判定」や「親子関係」の扱い方を理解し、自分のプロジェクトにも応用できるスキルを身に付けられるでしょう。それでは、準備を整えて始めていきましょう!

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



2. 必要な準備

この記事では、Unityでオブジェクトが衝突した際に親子関係を作る仕組みを構築します。そのために、まずはUnityプロジェクト内に必要なオブジェクトを準備しましょう。以下の手順を順番に進めてください。


① Unityプロジェクトの新規作成

  1. Unity Hubを開き、「New Project」をクリックします。
  2. テンプレートは「3D Core」を選択します。
  3. プロジェクト名を「CollisionParentingTutorial」と入力し、保存先フォルダを選択します。
  4. 「Create Project」をクリックしてプロジェクトを作成します。

② 必要なオブジェクトの配置

  1. Plane(床)の作成
    • ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
    • 「3D Object」→「Plane」を選択します。
    • Planeがシーンに追加されます。これが床の役割を果たします。
  2. Cubeの作成
    • ヒエラルキーウィンドウを右クリックし、「3D Object」→「Cube」を選択します。
    • Cubeがシーンに追加されます。
    • Cubeの位置を(0, 0.5, 0)に設定します(地面から少し浮かせるため)。
  3. Sphereの作成
    • 同じようにヒエラルキーウィンドウを右クリックし、「3D Object」→「Sphere」を選択します。
    • Sphereがシーンに追加されます。
    • Sphereの位置を(0, 1, -2)に設定します(Cubeの少し前方に配置)。

③ Rigidbodyコンポーネントの追加

次に、CubeとSphereに物理演算を追加するためのRigidbodyコンポーネントを設定します。

  1. CubeにRigidbodyを追加
    • ヒエラルキーウィンドウでCubeをクリックして選択します。
    • インスペクター(Inspector)ウィンドウ内で「Add Component」をクリックします。
    • 「Rigidbody」と検索し、表示されたRigidbodyコンポーネントを追加します。
  2. SphereにRigidbodyを追加
    • ヒエラルキーウィンドウでSphereを選択します。
    • Cubeと同じ手順で「Add Component」→「Rigidbody」を追加します。

④ 簡単なシーンの整備

  • カメラの位置調整
    カメラがシーン全体を見渡せる位置にあることを確認しましょう。カメラを選択して、位置を例えば(0, 5, -10)、回転を(30, 0, 0)に設定します。
  • ライトの確認
    シーンが暗い場合は、Directional Lightを選択し、角度や位置を調整して明るさを確保しましょう。

これで、プロジェクトの準備が整いました!次のステップでは、Cubeを動かすスクリプトを作成します。引き続き進めていきましょう!



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

Cubeをキーボードで動かせるようにするために、簡単なスクリプトを作成します。このステップでは、Unityプロジェクトで「CubeController」というスクリプトを作成し、Cubeにアタッチして動きを実装します。


スクリプトの作成方法

  1. プロジェクトウィンドウを開く
    Unityエディターの下部にある「Project」ウィンドウを見つけてください。
  2. 新しいスクリプトを作成する
    • 「Assets」フォルダを右クリックします。
    • 「Create」→「C# Script」を選択します。
    • スクリプトに「CubeController」という名前を付けてください。
  3. スクリプトを編集する
    作成した「CubeController」スクリプトをダブルクリックして、コードエディター(Visual StudioやRiderなど)を開きます。
  4. 以下のコードをコピーして貼り付ける
using UnityEngine;

public class CubeController : MonoBehaviour
{
    public float moveSpeed = 5f;

    void Update()
    {
        // 入力を取得
        float moveX = Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime;
        float moveZ = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;

        // Cubeを移動
        transform.Translate(moveX, 0, moveZ);
    }
}
  1. スクリプトを保存する
    コードを貼り付けたら、ファイルを保存(Ctrl+SまたはCmd+S)してください。

スクリプトをCubeにアタッチする

次に、作成したスクリプトをCubeに関連付けます。

  1. ヒエラルキーでCubeを選択する
    「Hierarchy」ウィンドウで、作成したCubeをクリックします。
  2. スクリプトをドラッグ&ドロップする
    「Project」ウィンドウから「CubeController」スクリプトを選び、Cubeにドラッグ&ドロップします。
  3. インスペクターで確認する
    Cubeを選択した状態で「Inspector」ウィンドウを確認します。「CubeController」というスクリプトが追加されていれば成功です。

テストプレイで動作確認

  1. プレイモードを開始する
    Unityの上部にある「▶」(再生ボタン)をクリックしてプレイモードに入ります。
  2. キーボードでCubeを動かす
    • 矢印キーや「WASDキー」を押して、Cubeが前後左右に動くことを確認します。
    • 動きがスムーズでない場合は、moveSpeedの値を調整してみてください。

これで、Cubeをキーボードで操作できるようになりました!次は、SphereがCubeにぶつかったときに親子関係を作成するスクリプトを作成しましょう。



4. 衝突時に親子関係を作るスクリプト

ここでは、SphereがCubeにぶつかった瞬間に親子関係を作成するスクリプトの作り方を解説します。具体的な手順とコードを使って、Unity初心者でも簡単に理解できるように説明していきます!


スクリプト「AttachOnCollision」の作成

まず、SphereがCubeにぶつかったときに親子関係を作るスクリプトを作成しましょう。

  1. プロジェクトウィンドウで新しいスクリプトを作成
    • プロジェクトウィンドウを右クリックします。
    • 「Create」→「C# Script」を選択します。
    • スクリプト名を AttachOnCollision に変更します。
  2. スクリプトを編集
    • AttachOnCollisionスクリプトをダブルクリックして開きます。
    • 以下のコードを記入してください。
using UnityEngine;

public class AttachOnCollision : MonoBehaviour
{
    // 衝突した際に呼ばれるメソッド
    private void OnCollisionEnter(Collision collision)
    {
        // 衝突した相手がタグ "Cube" を持っているか確認
        if (collision.gameObject.CompareTag("Cube"))
        {
            // SphereをCubeの子オブジェクトに設定
            transform.SetParent(collision.transform);
        }
    }
}

コードの解説

  • OnCollisionEnter(Collision collision)
    Unityで衝突を検出したときに呼ばれるメソッドです。このメソッドを使って、ぶつかった相手を判別します。
  • CompareTag(“Cube”)
    衝突したオブジェクトに「Cube」というタグが付いているかどうかを確認します。これにより、Cube以外のオブジェクトにぶつかっても反応しないようにできます。
  • transform.SetParent(collision.transform)
    衝突した相手(この場合はCube)を親オブジェクトに設定します。これにより、SphereがCubeと一緒に動くようになります。

タグの設定

スクリプトが正しく動作するように、Cubeに「Cube」というタグを設定しましょう。

  1. タグを作成
    • ヒエラルキーウィンドウでCubeを選択します。
    • インスペクターウィンドウの上部にある「Tag」フィールドをクリックします。
    • 「Add Tag」を選択して、新しいタグ「Cube」を作成します。
  2. Cubeにタグを適用
    • 再びCubeを選択し、タグを「Cube」に設定します。

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

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

これで準備は完了です!SphereがCubeにぶつかると、親子関係が作られ、SphereがCubeにくっついて一緒に動くようになります。次は動作確認を行いましょう!



5. テストプレイ

それでは、作成したスクリプトが正しく動作するかテストしてみましょう!以下の手順に従って、実際に動かしてみてください。


1. ゲームを実行する

Unityエディターの上部にある「▶︎(再生ボタン)」をクリックして、ゲームを実行します。


2. Cubeを操作してみる

キーボードの矢印キーまたは W/A/S/Dキー を使って、Cubeを動かしてみましょう。

  • 左右移動:矢印キーの / または A / D
  • 前後移動:矢印キーの / または W / S

Cubeがスムーズに動くかを確認してください。


3. Sphereにぶつける

Cubeを動かして、Sphereにぶつけてみましょう。

  • SphereがCubeにぶつかった瞬間に、SphereがCubeの子オブジェクトになるはずです。
  • ヒエラルキーウィンドウで確認すると、SphereがCubeの中に表示されているのがわかります。

4. Cubeを動かして確認

SphereがCubeにくっついた状態で、Cubeを操作してみましょう。

  • SphereがCubeに追随して動いていれば成功です!

よくあるエラーとその解決方法

  1. SphereがCubeにくっつかない
    • Cubeに正しく「Cube」タグを設定したか確認してください。
    • CubeとSphereの両方にRigidbodyがアタッチされているか確認してください。
    • Rigidbodyの設定で「Is Kinematic」がオフになっていることを確認してください。
  2. Cubeが動かない
    • 「CubeController」スクリプトがCubeにアタッチされているか確認してください。
    • スクリプトのエラーメッセージが出ていないか確認してください。
  3. 衝突判定がうまくいかない
    • CubeとSphereにCollider(例: Box ColliderやSphere Collider)が正しく設定されているか確認してください。
    • 両方のオブジェクトのColliderが有効(チェックボックスがオン)になっていることを確認してください。

これでテストプレイの手順は完了です!正しく動作したら、応用編に挑戦してさらに知識を深めてみてください。



6.応用編:スクリプトの拡張案と応用シナリオ

このセクションでは、今回の親子関係を作るスクリプトを応用する方法をいくつか紹介します。これを参考に、さらに多機能な仕組みを作ってみましょう!


1. 親子関係を解除する方法

作成した「AttachOnCollision」スクリプトを少し改良して、特定のキーを押したときに親子関係を解除できるようにしてみましょう。

以下のコードを追加してください。

using UnityEngine;

public class AttachOnCollision : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Cube"))
        {
            transform.SetParent(collision.transform);
        }
    }

    void Update()
    {
        // "U"キーを押したときに親子関係を解除
        if (Input.GetKeyDown(KeyCode.U) && transform.parent != null)
        {
            transform.SetParent(null);
        }
    }
}

これを追加することで、SphereがCubeにくっついた後に「U」キーを押すと、親子関係が解除されます。親子関係を解除すると、Sphereは再び独立して動けるようになります。


2. 親子関係の作成時にエフェクトを追加する

オブジェクトが衝突して親子関係を作るときに、エフェクトやサウンドを追加して、ゲームプレイの体験を向上させることもできます。

以下のコードでは、衝突時にエフェクトを発生させる仕組みを追加します。

using UnityEngine;

public class AttachOnCollision : MonoBehaviour
{
    public GameObject effectPrefab; // エフェクトのプレハブをアタッチ

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Cube"))
        {
            // 親子関係を作成
            transform.SetParent(collision.transform);

            // エフェクトを生成
            if (effectPrefab != null)
            {
                Instantiate(effectPrefab, transform.position, Quaternion.identity);
            }
        }
    }
}

使用手順:

  1. ヒエラルキーウィンドウでエフェクト用のPrefabを作成します(例: パーティクルエフェクト)。
  2. 作成したPrefabを「AttachOnCollision」スクリプトの effectPrefab フィールドにアタッチします。

これで、SphereがCubeに衝突した瞬間にエフェクトが発生するようになります。


3. 他の応用シナリオ

今回の仕組みを応用して、以下のようなゲーム要素を実現できます。

  1. アイテム収集システム
    • Sphereをアイテムとして扱い、Cubeが衝突するたびにSphereが親子関係として追加される。
    • 最終的に、CubeがいくつのSphereを集められたかをカウントするスクリプトを作る。
  2. プラットフォームゲームの動く足場
    • Cubeを動く足場として設定し、Sphere(プレイヤー)が足場に乗ると一緒に動く仕組みを作る。
    • 足場が動く際の速度や動き方を調整して、難易度を上げることも可能です。
  3. 敵に捕まる仕組み
    • Cubeを敵キャラクターとして設定し、Sphere(プレイヤー)がCubeに触れると親子関係が形成されて逃げられなくなる。
    • 親子関係が形成された後に一定時間でゲームオーバーにする仕組みを追加することもできます。

これらの応用方法を試すことで、今回学んだスクリプトの知識をさらに発展させることができます。ぜひ、オリジナルのアイデアを取り入れながら、自分だけのユニークな仕組みを作ってみてください!



7. まとめ

今回の記事では、Unityを使って「オブジェクトがぶつかった瞬間に親子関係を作り、動きを連動させる仕組み」を作成する方法を学びました。以下が主なポイントです。

  1. オブジェクトの配置と準備
    ヒエラルキーウィンドウでCube、Sphere、Planeを作成し、それぞれにRigidbodyコンポーネントを追加しました。これにより、物理挙動が加わり、オブジェクトが現実的に動くようになりました。
  2. Cubeを動かすスクリプトの作成
    「CubeController」というスクリプトを作成し、キーボード操作でCubeを動かせるようにしました。これにより、CubeがSphereと衝突する条件を設定できました。
  3. 衝突時に親子関係を作る仕組み
    「AttachOnCollision」というスクリプトを作成し、SphereがCubeとぶつかった瞬間に親子関係を設定する仕組みを実装しました。さらに、Cubeに「Cube」というタグを設定して、特定のオブジェクトとの衝突を判定する方法を学びました。
  4. 仕組みのテストと動作確認
    作成したスクリプトを使い、SphereがCubeと衝突するとCubeの子オブジェクトとなり、一緒に動くことを確認しました。このような仕組みは、ゲームのギミックやオブジェクト管理に活用できます。

今後の学びにつなげるヒント

  • 親子関係の解除: 親子関係を解除する仕組みを追加すると、より柔軟な動作を実現できます。例えば、一定の条件で親子関係を解消するスクリプトを作成してみましょう。
  • 複雑な衝突判定: 複数のオブジェクトが絡むシステムを作ることで、ゲーム性をさらに高めることができます。
  • 物理挙動の調整: Rigidbodyの設定を細かく調整することで、現実的な挙動を再現できます。摩擦や質量の設定を試してみてください。

この記事で学んだ内容を応用して、より複雑で魅力的なゲームの仕組みを作りましょう!Unityの可能性をどんどん広げていってくださいね! 🎮



よくある質問

Q
Rigidbodyを追加しないとどうなりますか?
A

Rigidbodyは物理演算をUnityで適用するために必要なコンポーネントです。これを追加しない場合、オブジェクト同士の衝突判定が正しく行われません。今回のチュートリアルでは、CubeやSphereが物理的な挙動を持つためにRigidbodyが必要です。忘れずに追加しましょう!

Q
SphereがCubeにくっつかない場合、何が問題でしょうか?
A

いくつか原因が考えられます:

  • タグが正しく設定されていない: Cubeに「Cube」というタグを設定しましたか?設定を確認してください。
  • スクリプトが正しくアタッチされていない: 「AttachOnCollision」スクリプトがSphereにアタッチされているか確認しましょう。
  • Rigidbodyが設定されていない: CubeとSphere両方にRigidbodyが追加されているかを確認してください。
  • 衝突が発生していない: CubeがSphereに実際にぶつかっているか確認し、位置を調整してください。
Q
Cubeの動きが滑らかではありません。どうすれば改善できますか?
A

Cubeの動きがカクカクする場合は、以下を確認してください:

  1. フレームレート依存のコード修正: 現在のコードではTime.deltaTimeを使っているため、基本的にフレームレートの影響は受けないはずですが、確認しておきましょう。
  2. RigidBodyの設定を見直す: Rigidbodyの「Interpolation」を「Interpolate」に設定すると、動きが滑らかになる場合があります。
  3. 移動方式を変更: Transformの移動ではなく、Rigidbody.MovePosition()を使用する方法も試してみてください。

おすすめのアセット

「Survival Island」は、サバイバルゲームを簡単に作成できるテンプレートアセットです。プレイヤーが資源を集め、クラフトし、敵と戦いながら生き延びるサバイバル要素を提供します。Unityの初心者でも使いやすく、カスタムエディターが付属しているため、ゲームの要素を簡単に編集可能。システムには採取、建築、戦闘が含まれており、オープンワールド風のゲーム作りに適しています。