【Unity】2つのゲームオブジェクトに同じスクリプトがアタッチされている場合のデバッグ

2024年4月11日

複数の敵(同じプレファブから生成されたとします)がシーン上にいる場合、基本的にすべての敵には同じスクリプトがアタッチされていると思います

それぞれは、別々のスクリプトとして扱われます(インスタンス化されています)が、コードが1つなので、デバッグのためDebug.Logを表示したりブレークポイントで停止させたりしても、どちらにアタッチされているコードかわかりませんね

今回は、どのゲームオブジェクトにアタッチされているスクリプトのインスタンスが実行中かを確認する手順について説明します

サンプルシーン構成

説明のため、シンプルなシーンを用意します
下記キャプチャーは、2つの空のゲームオブジェクトを作成し、それぞれにTestスクリプトをアタッチしています

Debug.Logで確認する方法

それぞれにアタッチされている同じスクリプトになります
違いを確認するための方法を2つ紹介します

テストコードの作成

確認したい処理(デバッグしたい処理)のところに次のコードを挿入します

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Debug.Log($"{gameObject.name}のスクリプト");

        // 確認したい処理など
    }
}


gameObject.name
は、ゲームオブジェクトの名前を参照するためのプロパティです。Unityでは、すべてのシーン内のエンティティがゲームオブジェクト(GameObject)として表されます。これには、可視オブジェクト(スプライト、メッシュ等)、カメラ、ライト、さらにはゲームのロジックを担う空のコンテナなどが含まれます。

gameObject.nameの概要

  • 用途gameObject.nameは、スクリプトからゲームオブジェクトの名前を取得または設定するために使用します。これにより、スクリプトは特定のゲームオブジェクトを識別、参照することができます。
  • アクセス方法:UnityのMonoBehaviourクラスを継承したクラス内から、gameObjectプロパティを介してアクセスします。gameObjectはそのスクリプトがアタッチされているゲームオブジェクト自身を指します。
  • 名前の変更と影響:スクリプト内でgameObject.nameの値を変更することで、Unityエディタのヒエラルキーウィンドウ上でのゲームオブジェクトの名前を動的に変更することが可能です。ただし、名前は一意である必要はなく、同じ名前のゲームオブジェクトが複数存在することが可能です。
  • 使用上の注意:名前によるゲームオブジェクトの検索(GameObject.Findメソッドを使用)は、大規模なシーンやゲームではパフォーマンスに影響を与える可能性があるため、推奨されません。可能な限り、他の方法(例えば、直接の参照渡しやタグによる検索)を利用することが望ましいです。

実行結果

ObjAのスクリプト
ObjBのスクリプト

VisualStudioでUnityエディターのデバッグをする方法

テスト用のコードは上記のDebug.Logで確認する方法のものを使います

ブレークポイントを設定

  1. 確認したいコード箇所にブレークポイントを設定します
  2. Unityエディターでブレークポイントを有効に知るため「Unityにアタッチ」で実行しておきます

ブレークポイントで停止したところで確認する方法

ブレークポイントで停止を確認したら、ローカルタブを確認します

値の列に現在実行されているゲームオブジェクトが表示されています
これで、同じスクリプトが複数のゲームオブジェクトにアタッチされていてもデバックすることができます

特定のゲームオブジェクトの処理時のみ、ブレークポイントがヒットするようにする

上記は、すべてのところでブレークポイントがヒットしてしまい、目的のゲームオブジェクトが出てくるまで何回の続行ボタンをクリックする必要があります
ここでは、特定の条件でのみブレークポイントがヒットする設定をみていきます

特定条件の設定画面を表示

  1. ブレークポイントの赤丸アイコンを右クリックしてメニューを出します
  2. 設定を選択します

条件の登録

サンプルとして、ObjBにアタッチされているスクリプトの時のみブレークポイントで停止するようにします

  1. 条件として、gameObject.name == “ObjB"が trueの時を設定します
  2. この条件式は必要の応じて変更変更することができます

実行して確認

通常のブレークポイントでの確認のように、ローカルタブで確認してみます

実際、ObjBにアタッチされているスクリプトのインスタンスの時のみ停止されるのが確認できます

参考

Prefabからゲームオブジェクトを生成する場合では名前が同じになります
次の方法で対応できます

Unity

Posted by hidepon