UnityUnityメモ

Unity初心者必見!OnCollisionなどで複数のオブジェクトを指定して消去する方法

Unity

はじめに

Unityでゲームを作っていると、「特定のオブジェクトに触れたら消える」という仕組みを作りたいときがありますよね。この記事では、触れたオブジェクトが特定の名前に該当すれば削除する仕組みを作る際に複数条件を指定する方法を解説します。

初心者でも分かりやすい手順で進めるので、ぜひ実際に試してみてください!


この記事でできること

  • 触れたオブジェクトの名前を判定する方法
  • 複数の条件を指定してオブジェクトを削除する仕組み
  • プレイヤーの動きをプログラムで制御する方法

1. シーンにオブジェクトを配置する

まず、シーンに必要なオブジェクトを配置していきます。

  1. ヒエラルキーウィンドウを右クリックして、「3D Object」→「Cube」を選びます。
  2. 同じ手順で、「Capsule」「Sphere」「Cylinder」も作成します。
  3. それぞれのオブジェクトが見やすいように、シーンビューで少し離して配置してください。

2. Cubeをプレイヤーとして設定する

次に、Cubeをプレイヤーとして動かせるようにします。

  1. ヒエラルキーでCubeを選択します。
  2. インスペクターウィンドウで、「Add Component」をクリックして「Rigidbody」を追加します。
    • Rigidbodyは物理的な動きを持たせるためのコンポーネントです。
  3. Rigidbodyの「Use Gravity」のチェックはそのままでOKです。

3. スクリプトでCubeを動かす

Cubeを矢印キーで動かすプログラムを作成します。

  1. プロジェクトウィンドウを右クリックして、「Create」→「C# Script」を選択します。
  2. スクリプトに「CubeMove」と名前を付けます。
  3. スクリプトをダブルクリックして開き、以下のコードを入力します。

1. 基本設定とMonoBehaviour

public class CubeMove : MonoBehaviour
  • CubeMoveという名前のクラスを作っています。
  • MonoBehaviourを継承しているので、このクラスはUnityのゲームオブジェクトにアタッチすることができます。
  • このスクリプトをCubeにアタッチすると、Cubeが動くようになります。

2. キューブを動かす部分(Update関数)

void Update()
{
// 矢印キーの入力でCubeを動かす
float dx = Input.GetAxis("Horizontal") * 0.1f; // 横方向
float dz = Input.GetAxis("Vertical") * 0.1f; // 縦方向
transform.position = new Vector3(
transform.position.x + dx,
0,
transform.position.z + dz
);
}

解説:この部分ではキューブの動きを作っています!

  1. Update()とは?
    • 毎フレーム(1秒間に数十回~数百回)実行される関数です。
    • キー入力やオブジェクトの動きをリアルタイムで処理するのに使います。
  2. Input.GetAxis("Horizontal")Input.GetAxis("Vertical")
    • Horizontalは左右の矢印キー(またはA/Dキー)に対応。
    • Verticalは上下の矢印キー(またはW/Sキー)に対応。
    • これらの値は-1から1の間で変化します。
      • 例: 左矢印キーを押すと-1、右矢印キーを押すと1
  3. 動きを計算
    • 横方向の移動量(dx)と縦方向の移動量(dz)を計算します。
    • * 0.1fは動きの速さを調整するためです(小さくするほど遅く動きます)。
  4. 位置の更新
    • 現在の位置(transform.position)に計算した移動量を足し、新しい位置を設定します。
    • transform.position.x + dxで横方向に動き、
    • transform.position.z + dzで縦方向に動きます。
    • y方向(上下)は0に固定されているので、平面だけを移動します。

3. ぶつかったら削除する部分(OnCollisionEnter関数)

void OnCollisionEnter(Collision other)
{
// 触れたオブジェクトの名前を判定して削除
if (other.gameObject.name == "Capsule"
|| other.gameObject.name == "Sphere"
|| other.gameObject.name == "Cylinder")
{
Destroy(other.gameObject);
}
}

解説:この部分ではぶつかったオブジェクトを削除しています!

  1. OnCollisionEnter(Collision other)とは?
    • この関数は、キューブが他の物体にぶつかった瞬間に実行されます。
    • otherにはぶつかったオブジェクトの情報が入っています。
  2. ぶつかったオブジェクトの名前を確認
    • other.gameObject.nameで、ぶつかったオブジェクトの名前を取得します。
    • 名前が"Capsule""Sphere""Cylinder"のどれかだった場合に中の処理が実行されます。
  3. Destroy()で削除
    • Destroy(other.gameObject)を使って、ぶつかったオブジェクトを削除しています。
    • これにより、対象のオブジェクトがゲームシーンから消えます。

4. 全体の動き

このスクリプトの流れをざっくりまとめるとこんな感じです:

  1. キューブが矢印キーで前後左右に動く。
  2. キューブがCapsuleSphereCylinderのどれかにぶつかると、そのオブジェクトが消える。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    void Update()
    {
        // 矢印キーの入力でCubeを動かす
        float dx = Input.GetAxis("Horizontal") * 0.1f; // 横方向
        float dz = Input.GetAxis("Vertical") * 0.1f;   // 縦方向
        transform.position = new Vector3(
            transform.position.x + dx, 
            0, 
            transform.position.z + dz
        );
    }

    void OnCollisionEnter(Collision other)
    {
        // 触れたオブジェクトの名前を判定して削除
        if (other.gameObject.name == "Capsule" 
            || other.gameObject.name == "Sphere" 
            || other.gameObject.name == "Cylinder")
        {
            Destroy(other.gameObject);
        }
    }
}

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

  1. 作成したCubeMoveスクリプトをドラッグして、ヒエラルキーのCubeにドロップします。
  2. これでスクリプトがCubeに適用されました!

5. ゲームを実行して確認

  1. シーンを保存して、**ゲームを再生(Playボタン)**します。
  2. 矢印キーを使ってCubeを動かしてみましょう。
  3. CubeがCapsule、Sphere、Cylinderに触れると、それらが消えるのを確認できます。

解説:条件分岐の「||」について

スクリプト内で使われている「||」は、OR条件を表します。
例えば、A || B の場合、AまたはBのどちらかが**true(条件を満たす)**であれば処理が実行されます。今回のコードでは、触れたオブジェクトの名前がCapsule、Sphere、Cylinderのいずれかなら削除するようになっています。


よくある質問(Q&A)

Q
触れるたびにオブジェクトが消えるのを止めたいです。
A

Destroyを削除し、代わりに他の処理を追加してください。例えば、オブジェクトの色を変えるコードを入れると、触れたことを視覚的に表現できます。

Q
プレイヤーが空中に浮いてしまいます。
A

CubeにRigidbodyを追加したとき、Use Gravityが有効になっているか確認してください。

Q
名前ではなくタグで判定したいです。
A

以下のコードに変更してください。

if (other.gameObject.CompareTag("TargetTag"))
{
Destroy(other.gameObject);
}

対象のオブジェクトに「TargetTag」というタグを設定すればOKです。


これで、UnityでOnCollisionを使って複数のオブジェクトを削除する仕組みが作れるようになりました!触れたオブジェクトに対して別の処理を追加したり、タグで判定したりするなど、いろいろ応用してみてくださいね。

おすすめのアセット

データ保存が驚くほど簡単に!「Easy Save」

ゲームのセーブ&ロード機能、複雑なコードを書かずに手軽に実装したいですよね?そこでおすすめなのが、**アセットストアの「Easy Save」**です!

  • 数行のコードで保存&ロード
    セーブ: ES3.Save("PlayerScore", score);
    ロード:score = ES3.Load(“PlayerScore”);
  • 多様なデータ形式に対応(スコア、設定、カスタムクラスもOK)
  • データ暗号化&クラウド保存で安心安全。

面倒なデータ管理をこれ一つで解決!効率的にゲーム開発を進めたい方はぜひお試しください。