UnityUnityメモ

Unityでオブジェクト衝突時に操作を無効化するスクリプトの作り方【初心者向け】

Unity

1. はじめに

こんにちは!Unityを使ってゲーム開発を始めたばかりの方、もしくはもう少し踏み込んでみたいと思っている方、この記事はそんなあなたにぴったりです。今回は、オブジェクト同士がぶつかったときにプレーヤーの操作を無効化する方法を学んでいきます。

例えば、ゲームの中でキャラクターが障害物にぶつかったら一時的に動けなくなる、そんなシステムを作りたいと思ったことはありませんか?この記事では、Cube(障害物)が往復運動をしている間に、プレイヤーの役割を持つSphereがCubeに衝突したときに操作を無効化する方法を解説します。

Unityのスクリプトが初めての方でも、手順に沿って進めれば必ず完成できる内容です。また、完成したスクリプトは他のゲームにも応用できるので、ぜひ最後までチャレンジしてみてくださいね!それでは、さっそく始めていきましょう!

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



2. 必要な準備

Unityでオブジェクトの衝突を利用した動きを作るには、まず基本的な設定をしておく必要があります。このセクションでは、新しいUnityプロジェクトを作成し、作業に必要な環境を整える手順を説明します。


1. Unityプロジェクトの作成

  1. Unity Hubを起動し、「New Project」(新規プロジェクト)をクリックします。
  2. テンプレートとして「3D」を選択し、プロジェクト名をわかりやすい名前(例: CollisionControlProject)に設定します。
  3. プロジェクトの保存場所を指定し、「Create Project」をクリックして新しいプロジェクトを作成します。

2. シーンの設定

Unityプロジェクトが開いたら、以下の初期設定を行いましょう。

  1. ヒエラルキーウィンドウを確認
    デフォルトでは、空のシーンに「Main Camera」と「Directional Light」が配置されています。このまま使用します。
  2. シーンの保存
    シーンを編集する前に保存しましょう。
    • メニューバーから「File」→「Save As」を選択します。
    • シーン名を「MainScene」に設定して保存します。

3. 作業環境の整備

  1. プロジェクトウィンドウでの整理
    作業がしやすいように以下のフォルダを作成します:
    • Scriptsフォルダ:スクリプトを格納するため。
    • Prefabsフォルダ(必要なら):オブジェクトのプレハブを保存するため。
    プロジェクトウィンドウで右クリックし、「Create」→「Folder」を選び、フォルダを作成してください。
  2. Sceneビューの設定
    シーンの視点が見やすい位置になるようにSceneビューを調整します。
    • マウスの右クリックとドラッグで視点を移動。
    • 中央クリックやホイールを使ってズームイン・アウト。

4. 必要なUnityの設定確認

作業をスムーズに進めるため、以下を確認してください:

  • Unityバージョン
    最新の安定版Unityを使用してください(例:Unity 2022以上)。
  • 入力システムの設定
    今回のプロジェクトでは旧入力システム(Input.GetAxis)を使用します。プロジェクト設定で「Input System Package」を有効にしていないことを確認してください。
    • 「Edit」→「Project Settings」→「Player」→「Active Input Handling」で「Both」または「Input Manager」を選択します。

この準備が完了すれば、いよいよ具体的なオブジェクトの配置とスクリプトの作成に進むことができます!次のセクションでは、CubeやSphereの配置方法について詳しく解説していきます。



3. Cubeの配置と設定

まずは、プレイヤーが衝突するCube(キューブ)をシーンに配置し、往復する動きを設定しましょう。以下の手順に従って進めてください。


3-1. Cubeを配置する

  1. Cubeの作成
    ヒエラルキーウィンドウで右クリックし、「3D Object」→「Cube」を選択します。シーン内にCubeが表示されます。
  2. Cubeの名前を変更
    Cubeをクリックして選択し、インスペクターウィンドウの上部にある名前を「Cube」に変更します(名前はスクリプトで使用するので間違えないようにしましょう)。
  3. Cubeの位置を調整
    Cubeが地面に浮いていないよう、インスペクターウィンドウの「Transform」セクションで以下のように位置を設定します。
    • Position: X = 0, Y = 0.5, Z = 0
    • サイズや回転はそのままでOKです。

3-2. Cubeの動きをスクリプトで設定する

Cubeが往復する動きを追加するために、スクリプトを作成して適用します。

  1. スクリプトの作成
    プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選びます。名前を「CubeMove」に変更します。
  2. スクリプトにコードを追加
    作成したスクリプトをダブルクリックして開き、以下のコードを貼り付けます。
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    int counter = 0;  // カウンター変数
    float move = 0.05f;  // 移動量

    void Update()
    {
        Vector3 p = new Vector3(0, 0, move);  // Z方向の移動量
        transform.Translate(p);  // Cubeを移動
        counter++;

        // カウンターが一定値に達したら移動方向を反転
        if (counter == 100)
        {
            counter = 0;
            move *= -1;
        }
    }
}
  1. スクリプトをCubeにアタッチ
    作成した「CubeMove」スクリプトをプロジェクトウィンドウからCubeにドラッグ&ドロップしてアタッチします。

3-3. 実行して動作を確認

  1. プレイモードを開始します(画面上部の再生ボタンをクリック)。
  2. CubeがZ方向に動き、一定距離で往復することを確認します。

これでCubeの配置と動きの設定は完了です!次はSphereを配置し、プレイヤーの操作を設定していきましょう。



4. Sphereの配置と設定

次に、プレイヤーとなる「Sphere」をUnityシーンに配置し、必要な設定を行いましょう。

Sphereの作成

  1. ヒエラルキーウィンドウで右クリックします。
  2. メニューから「3D Object」→「Sphere」を選びます。
    これで、シーンに「Sphere」が追加されます。
  3. 追加されたSphereの名前を「Player」に変更しておきましょう。名前をわかりやすくすることで、後でスクリプトを設定する際に混乱を防げます。

Rigidbodyの追加

プレイヤーを動かすために「Rigidbody」を設定します。

  1. ヒエラルキーウィンドウで「Player」をクリックして選択します。
  2. インスペクターウィンドウの「Add Component」ボタンをクリックします。
  3. 検索欄に「Rigidbody」と入力し、表示された「Rigidbody」を選択します。
    これで物理演算が有効になり、プレイヤーオブジェクトに力や衝突の影響を与えることができます。

Colliderの設定

Sphereが他のオブジェクト(Cube)と衝突したことを認識できるように「Collider」を調整します。

  1. 再びヒエラルキーウィンドウで「Player」をクリックして選択します。
  2. インスペクターウィンドウで「Sphere Collider」という項目を探します(Sphereにはデフォルトで追加されています)。
  3. 「Sphere Collider」の設定内にある「Is Trigger」にチェックを入れます。
    • Is Triggerを有効にすると、衝突を検知するだけで物理的な反応(跳ね返りなど)は発生しなくなります。今回のスクリプトでは、これが重要なポイントです。

これで「Player」オブジェクト(Sphere)の基本的な設定は完了です。次は、プレイヤーの動きを制御するスクリプトを作成していきます。引き続き進めていきましょう!



5. Sphereのスクリプト

次に、Sphere(プレーヤー)の動きを制御するスクリプトを作成します。このスクリプトでは、プレーヤーが自由に移動できるようにしつつ、Cubeに衝突したら操作を無効にします。


スクリプトの作成

  1. プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選択します。
  2. 新しいスクリプトに「SphereMove」と名前を付けます。

コードの記述

以下のコードを「SphereMove」スクリプトに記述します。

using UnityEngine;

public class SphereMove : MonoBehaviour
{
    public bool isTouch; // Cubeに触れたかどうかを判定するフラグ

    void Start()
    {
        isTouch = false; // 初期状態では触れていない
    }

    void Update()
    {
        if (!isTouch) // Cubeに触れていない場合のみ操作可能
        {
            float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3; // 水平方向の入力
            float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3;   // 垂直方向の入力
            transform.position = new Vector3(transform.position.x + dx, 0, transform.position.z + dz);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "Cube") // Cubeに触れた場合
        {
            isTouch = true; // 操作を無効化
            Debug.Log("操作不可になりました"); // デバッグログを表示
        }
    }
}

コードの説明

  • isTouch: Cubeに衝突したことを判定するためのフラグです。初期値はfalse
  • Updateメソッド: キーボードの矢印キーまたはWASDキーでプレーヤーを移動させます。Cubeに触れるとisTouchtrueになり、移動が停止します。
  • OnTriggerEnterメソッド: Sphereが他のオブジェクト(ここではCube)に衝突したときに呼び出されるメソッドです。Cubeに触れるとisTouchtrueにして操作を無効化します。

スクリプトのアタッチ

作成した「SphereMove」スクリプトをヒエラルキーウィンドウのSphereにドラッグ&ドロップしてアタッチします。これでSphereにスクリプトが適用されました。


ここまでで、SphereがCubeに触れると操作が無効になる動作が実装できました。次は、この動きを実際にUnityエディターで確認してみましょう!



6. 実行と動作確認

さて、ここまででCubeとSphereの設定やスクリプトの準備が完了しました!それでは、実際にUnityでプレイモードを起動して、動作を確認してみましょう。


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

  1. Unityエディターの上部にある「Play」ボタン(三角形の再生ボタン)をクリックします。
  2. シーンビューがゲームビューに切り替わり、実際の動きを確認できます。

2. Sphereを動かしてCubeに近づける

  1. キーボードの矢印キーまたはW/A/S/Dキーを使ってSphereを操作します。
    • 例: 「Wキー」で前進、「Aキー」で左に移動します。
    • Sphereが滑らかに移動していることを確認してください。
  2. Cubeが往復運動を繰り返していることも同時に確認してください。

3. CubeとSphereが衝突したときの動作を確認

  1. Sphereを操作してCubeに近づけます。
  2. SphereがCubeに触れると、操作が無効になるはずです。
  3. コンソールウィンドウを開いて、「操作不可になりました」というメッセージが表示されるか確認してください。

4. 問題が発生した場合のチェックポイント

もし思ったように動かない場合は、以下を確認してください。

  1. スクリプトが正しくアタッチされているか
    • CubeにCubeMoveスクリプト、SphereにSphereMoveスクリプトがドラッグ&ドロップされているか確認します。
  2. ColliderとisTriggerの設定が正しいか
    • SphereのSphere ColliderisTriggerにチェックが入っているか確認してください。
  3. オブジェクト名が正しいか
    • OnTriggerEnter内で判定しているother.gameObject.name == "Cube"の名前が、ヒエラルキーで設定したCubeの名前と一致しているか確認してください。

Cubeに触れた後、Sphereが動かなくなり、コンソールに「操作不可になりました」と表示されれば成功です!おめでとうございます🎉

これで、プレイヤー操作を無効化する仕組みを正しく設定できました。これを応用して、さまざまなギミックを作ることができますよ!



7. まとめ

今回は、Unityでオブジェクトに衝突したときにプレーヤーの操作を無効化するスクリプトの作り方を解説しました。以下の手順で進めることで、基本的な機能を実装することができましたね!


  1. CubeとSphereの配置
    ヒエラルキーウィンドウを使って、簡単に3Dオブジェクトを配置しました。Cubeは動きのある障害物として、Sphereはプレーヤーとして設定しました。
  2. スクリプトの作成と設定
    C#スクリプトを作成し、Cubeには動きを、Sphereには操作と衝突時の処理を追加しました。それぞれのスクリプトを対応するオブジェクトにアタッチすることで、動作が連携しました。
  3. 衝突による操作無効化
    SphereがCubeに触れたときに操作が無効化される処理を、OnTriggerEnterメソッドで実現しました。デバッグログで状態の変化も確認できましたね。

このように、UnityではColliderやRigidbodyなどの基本コンポーネントを組み合わせることで、簡単にインタラクティブな動きを実現できます。今回学んだ内容を活用すれば、より複雑なゲームロジックにも応用できるはずです。

次のステップとしては、例えば、衝突時に音を鳴らしたり、視覚エフェクトを追加することで演出を強化することもおすすめです。また、アニメーションを使った動きの追加も挑戦してみると良いでしょう!

Unityを使いこなして、自分だけのオリジナルゲームを作り上げてみてください!今回の内容がその一歩になれば嬉しいです。



よくある質問

Q
スクリプトが正しく動きません。原因は何ですか?
A

スクリプトが正しいオブジェクトにアタッチされているか、ColliderのisTriggerが有効になっているか確認してください。

Q
Cubeの往復アニメーションをスクリプトではなくアニメーターで設定できますか?
A

はい、アニメーターを使用してCubeの動きを設定することも可能です。

Q
Sphereが動きません。どうすればいいですか?
A

Rigidbodyが設定されているか、Input.GetAxisが正しく取得できているか確認してください。

おすすめのアセット

60 Games Bundleは、パズル、カジュアル、レトロ、サバイバル、プラットフォーマー、アドベンチャーなど、様々なジャンルのゲームを収録した豪華なアセットパックです。ゲーム開発初心者から経験者まで、誰でも利用できる内容となっています。

このバンドルの特徴は、60種類ものゲームが含まれており、それぞれがすぐにプレイ可能な完全なプロジェクトファイルとなっていることです。各ゲームにはカスタマイズ可能なスクリプトとアートアセットが付属しており、自分だけのゲームを作り上げることができます。また、Unityの最新バージョンにも対応しており、簡単にインポートして利用可能です。