UnityUnityメモ

Unityで簡単!オブジェクト接触による動き制御の仕組みを作る方法

Unity

1. はじめに

この記事では、上下運動を繰り返すSphere(球体)が、Cube(立方体)を操作してCapsule(カプセル)に接触することで動きを止める仕組みを作ります。


このチュートリアルでは、以下のことを学びます:

  • Unityの基本操作(オブジェクトの配置や設定)
  • スクリプトを使ったオブジェクトの動きの制御
  • Trigger機能を活用したオブジェクト間の相互作用

手順を一つずつ丁寧に解説しますので、Unity初心者の方でも安心して取り組めます!最終的には、自分でカスタマイズしてオリジナルの挙動を作れるようになることを目指しましょう。それでは、早速始めていきましょう!

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



2. オブジェクトを配置する

まずは、必要なオブジェクトをUnityのシーンに配置していきましょう。ここでは、Sphere(球体)、Cube(立方体)、Capsule(カプセル)の3つを配置します。以下の手順に従ってください。


1. Sphereを配置する

  1. Hierarchyウィンドウで右クリックします。
  2. メニューから 3D ObjectSphere を選択します。
  3. シーンビューにSphereが追加されます。適切な位置に配置してください(例: Position = (0, 1, 0))。

2. Cubeを配置して設定を調整する

  1. 同様に Hierarchyウィンドウ で右クリックし、3D ObjectCube を選択します。
  2. Cubeを選択した状態で、Inspectorウィンドウを確認します。
  3. Add Component ボタンをクリックし、「Rigidbody」と入力して Rigidbody を追加します。
  4. Use Gravity のチェックを外します。これにより、Cubeが物理的な重力に引っ張られず、静止した状態を保つことができます。

3. Capsuleを配置して設定を調整する

  1. 再び Hierarchyウィンドウ で右クリックし、3D ObjectCapsule を選択します。
  2. Capsuleを選択した状態で、Inspectorウィンドウを確認します。
  3. Capsule Collider コンポーネントの Is Trigger にチェックを入れます。
    • この設定により、Capsuleが他のオブジェクトと物理的にぶつかるのではなく、「接触イベント」を検知できるようになります。

4. オブジェクトの位置を調整する

各オブジェクトが見やすい位置に配置されていることを確認してください。例として以下の座標を参考に設定してください。

  • Sphere: Position = (0, 1, 0)
  • Cube: Position = (0, 0.5, -2)
  • Capsule: Position = (0, 0.5, 2)

これで、シーンに必要なオブジェクトが準備できました!次は、Sphereが上下に動くようにスクリプトを作成していきます。



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

ここでは、Sphereが上下に動く仕組みをスクリプトで実装します。この動きを作ることで、次のステップで他のオブジェクトとの接触を確認できる状態を整えます。以下の手順でスクリプトを作成しましょう。


スクリプトを作成する手順

  1. スクリプトの作成
    • Unityの Project ウィンドウ を右クリックします。
    • メニューから「Create」→「C# Script」を選択します。
    • 作成された新しいスクリプトに「SphereMovement」と名前を付けます。
  2. スクリプトをアタッチ
    • Hierarchy ウィンドウで「Sphere」を選択します。
    • 作成した SphereMovement スクリプトをドラッグ&ドロップで Sphere にアタッチします。
  3. スクリプトを編集
    • 作成したスクリプトをダブルクリックして開きます。
    • 以下のコードを記述してください。

SphereMovement.cs のコード

using UnityEngine;

public class SphereMovement : MonoBehaviour
{
    public float speed = 2.0f; // Sphereの動く速さ
    private bool canMove = true; // 動ける状態かを管理する変数

    void Update()
    {
        // canMoveがtrueのときに上下運動する
        if (canMove)
        {
            transform.position = new Vector3(
                transform.position.x, 
                Mathf.PingPong(Time.time * speed, 3), 
                transform.position.z
            );
        }
    }

    // Sphereの動きを止めるための関数
    public void StopMovement()
    {
        canMove = false;
    }
}

コードの説明

  • speed
    • Sphereの動く速さを制御します。Inspector から簡単に調整できるように public 修飾子を使用しています。
  • Mathf.PingPong
    • 時間(Time.time)を利用して、Sphereが一定範囲内(この場合は高さ3の範囲)を往復する動きを実現しています。
  • StopMovement()
    • この関数は、外部から呼び出すことで canMovefalse にし、Sphereの動きを停止させます。

動作確認

  1. Playボタンを押してシミュレーションを開始します。
  2. Sphereが上下に動くことを確認してください。

これで、Sphereが上下に動く準備が整いました!次のステップでは、Cubeを動かし、Capsuleに接触したときにSphereを停止させる仕組みを作ります。



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

次は、キーボードの矢印キーを使ってCubeを動かせるようにスクリプトを作成します。このスクリプトでは、CubeをCapsuleに接触させてSphereを止める仕組みを実現します。順を追って見ていきましょう。

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

まず、Projectウィンドウで新しいスクリプトを作成します。

  1. Projectウィンドウを右クリックします。
  2. 「Create」→「C# Script」を選択します。
  3. スクリプトの名前を「CubeController」としてください。

作成した「CubeController」スクリプトをCubeにドラッグ&ドロップしてアタッチします。


2. CubeController.csのコード

以下のコードをCubeControllerスクリプトに追加してください。

using UnityEngine;

public class CubeController : MonoBehaviour
{
    public GameObject sphere; // Sphereを参照するための変数

    void Update()
    {
        // 矢印キーでCubeを動かす
        float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * 5.0f;
        float moveZ = Input.GetAxis("Vertical") * Time.deltaTime * 5.0f;
        transform.Translate(new Vector3(moveX, 0, moveZ));
    }

    private void OnTriggerEnter(Collider other)
    {
        // CubeがCapsuleに触れたときの処理
        if (other.gameObject.name == "Capsule")
        {
            sphere.GetComponent<SphereMovement>().StopMovement();
        }
    }
}

3. スクリプトのポイント解説

  • 矢印キーでCubeを動かす
    • Input.GetAxis("Horizontal")Input.GetAxis("Vertical")を使うことで、Cubeを左右(X軸)や前後(Z軸)に移動させます。
    • Time.deltaTimeを使うことで、フレームレートに依存しないスムーズな移動を実現します。
  • OnTriggerEnterで接触判定
    • OnTriggerEnterメソッドは、CubeがCapsuleに触れた瞬間に呼び出されます。
    • 接触したオブジェクトがCapsuleである場合、Sphereのスクリプト(SphereMovement)にアクセスし、StopMovementメソッドを実行して動きを止めます。

4. スクリプトを設定する

  1. Cubeを選択し、InspectorウィンドウでCubeControllerスクリプトを確認します。
  2. スクリプトの「Sphere」フィールドに、Hierarchyウィンドウ内のSphereオブジェクトをドラッグ&ドロップします。

これで、CubeがCapsuleに触れるとSphereの動きが止まる仕組みが完成しました。


次は、接触で動きを止める仕組みが正しく動作するかをテストプレイしてみましょう!



5.テストプレイ

ここまでの手順が完了したら、実際にUnityエディターでシミュレーションを行い、正しく動作しているか確認しましょう。以下の手順に沿ってテストプレイを進めてください。

1. プレイモードを開始する

Unityエディターの上部にある「▶(再生)」ボタンをクリックしてプレイモードを開始します。

2. Cubeを操作してみる

プレイモードが開始されたら、キーボードの矢印キー(またはWASDキー)を使ってCubeを動かします。

  • 上下移動:Wキーで前進、Sキーで後退
  • 左右移動:Aキーで左移動、Dキーで右移動

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

3. CubeをCapsuleに接触させる

Cubeを動かし、Capsuleに接触させます。このとき、以下の点に注意してください:

  • Capsuleの「IsTrigger」が有効になっていること
  • SphereMovementスクリプトが正常に動作していること

4. Sphereの動きを確認する

CapsuleにCubeが接触した瞬間に、Sphereが上下運動を止めるはずです。この挙動が確認できれば、仕組みが正しく動作していることになります。

5. デバッグメッセージの確認(必要に応じて)

もしSphereの動きが止まらない場合、以下の点を確認してください:

  • CubeControllerスクリプトのOnTriggerEnterメソッドにエラーがないか
  • SphereオブジェクトがCubeControllerSphere変数にアタッチされているか

必要に応じて、Debug.Logを使用してトリガーが発動しているか確認することもできます。

private void OnTriggerEnter(Collider other)
{
if (other.gameObject.name == "Capsule")
{
Debug.Log("Capsuleに接触しました");
sphere.GetComponent<SphereMovement>().StopMovement();
}
}

6. 問題がある場合の対応

Sphereが止まらない、Cubeが動かないなどの問題がある場合、以下を再チェックしてください:

  • RigidbodyやColliderの設定が正しいか
  • スクリプトがアタッチされているか
  • Unityエディターのコンソールでエラーメッセージが出ていないか

以上でテストプレイが完了です!うまく動作した場合は、自分で別のオブジェクトや挙動を追加してカスタマイズしてみると、さらに理解が深まります。



よくある質問(FAQ)

Q
Cubeが動かない場合はどうすればいいですか?
A

Cubeが動かない場合、以下の点を確認してください:

  • CubeにRigidbodyコンポーネントが追加されているか確認します。
  • Rigidbodyの「Use Gravity」のチェックが外れているか確認します。
  • CubeControllerスクリプトがCubeにアタッチされているか確認します。
  • キーボード入力(矢印キーやWASDキー)が有効か確認し、他のアプリケーションがキーボードを占有していないか確認してください。
Q
Sphereの動きが止まらない場合、何が問題ですか?
A

Sphereの動きが止まらない場合は以下を確認してください:

  • CapsuleのColliderの「Is Trigger」にチェックが入っているか確認してください。
  • CubeControllerスクリプト内のOnTriggerEnterメソッドで、sphere変数が正しくSphereオブジェクトを参照しているか確認してください。
    • CubeControllerスクリプトのインスペクターで、sphereにSphereをドラッグ&ドロップして割り当ててください。
  • SphereMovementスクリプトがSphereにアタッチされているか確認してください。
Q
CapsuleのTriggerが正しく動作しない場合、どうすればいいですか?
A

Triggerが正しく動作しない場合は、以下のポイントを確認してください:

  • Capsuleの「Capsule Collider」の「Is Trigger」にチェックが入っているか確認します。
  • CapsuleがHierarchy内で他のオブジェクトと同じレイヤー設定になっていない場合、コリジョンが無効になることがあります。レイヤー設定を確認し、同じレイヤーでテストしてください。
  • CubeにRigidbodyが追加されていない場合、Triggerイベントが発生しません。CubeにRigidbodyコンポーネントを追加して設定してください。

おすすめのアセット

「Color Hole 3D | Template + Editor」は、Unityでシンプルな操作性と魅力的なゲームプレイを持つ3Dゲームを簡単に作成できるテンプレートです。このパッケージを使用することで、プレイヤーが穴を操作してカラフルなブロックを吸い込むゲームを効率的に開発できます。

主な特徴:

  • 直感的な操作: プレイヤーは指先で穴を動かし、ブロックを吸い込むだけのシンプルな操作が可能です。
  • 多彩なレベルデザイン: 様々な形状や配置のブロックを組み合わせたレベルを簡単に作成できます。
  • カスタマイズ可能: ゲームの見た目や難易度を自由に調整し、自分だけのオリジナルゲームを作成できます。

おすすめポイント:

  • 初心者でも使いやすい: 複雑なプログラミング知識がなくても、直感的なエディターで簡単にゲームを作成できます。
  • 時間の節約: 基本的なゲームシステムが既に組み込まれているため、開発時間を大幅に短縮できます。
  • 高品質なサポート: 開発者からのサポートがあり、安心して利用できます。