スクリプトはどのゲームオブジェクトにアタッチされている?

2022年9月22日

スクリプトはコンポーネントの1つです
シーン上のオブジェクト(ヒエラルキーで一覧が確認できます)のどれかにアタッチされ、実行できるようになっているとします。ただ、オブジェクトを一つずつ選択してからインスペクターを確認しないとどのオブジェクトにアタッチされているかわかりません

事例サンプル

間違えて別のオブジェクトにアタッチしてしまった後、気づかずに本来のオブジェクトにアタッチしてしまった場合の調査に利用できます

シーン構成

PlayerControllerスクリプト

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void Start()
    {
        Debug.Log("プレイヤーのコントロール");
    }
}

実行結果

プレイヤーをコントロールしたいのに2回実行されています

PlayerControllerが2回実行されていることから、このスクリプトが正しくPlayerゲームオブジェクトのみにアタッチされているか調査します

この時重要なのは、勘違いがあるかも?と考えることです
そんなミスをするわけがない!と思ってしまうとエラー解決が遠のいていきます

調査方法①

スクリプトをヒエラルキー上のオブジェクトから検索する方法

一気に検索できる方法です

検索の選択

Projectウィンドウから検索したいスクリプトを選択してFind References in Scene(シーンから参照を探す。複数でも検索できます)を選択します

検索結果

ヒエラルキーを確認するとオブジェクトが絞り込まれているのがわかります

検索結果をクリアーする場合

このままでは、ヒエラルキー全体が見えないので元に戻します
検索窓の右側のXをクリックすると全てのゲームオブジェクトが再度表示されます

調査方法②

ブレークポイントから確認する方法

VisualStudioのデバック機能のブレークポイントを使います

ローカルの情報を確認

今回のように1つのスクリプトが複数のゲームオブジェクトにアタッチされていると、どのゲームオブジェクトで止まったのかがわからないですね。ブレークがかかったオブジェクトを知ることができますので積極的に活用しましょう

必ず実行されるところにブレークポイントを設定します(Startメソッドは実行後に必ず実行されます)

Unityエディターを実行後、ブレークポイントで停止した時に下部ウィンドウのローカル情報を確認します

名前のthis.gameObjectの値が“Player(UnityEngine.GameObject )"となっていますので、今のブレークポイントで止まっているのはPlayerゲームオブジェクトにアタッチされているスクリプトだとわかります

更に続行すると

もう一度ブレークポイントで止まりますが、今度は名前のthis.gameObjectの値が"Enemy(UnityEngine.GameObject )"となっているのがわかります

これで、Enemyゲームオブジェクトにもスクリプトがアタッチされているのが確定です

ブレークポイントでの確認の応用

例えば、EnemyをPrefabを使って大量に発生させた場合、どのEnemyゲームオブジェクトにも同じスクリプトがアタッチされているので、使えない機能と思いがちですが、このようにどのゲームオブジェクトにアタッチされているかがわかると特定の現象の調査ができます

シーンの構成

特定のゲームオブジェクトの時だけ止めたい

Enemy (2)の時だけ、ブレークポイントで止めたいケースを考えます
ブレークポイントには条件も設定できます
gameObject.name がEnemy (2)の時だけ止めるには次のように条件設定します
設定の仕方ですが、ブレークポイントを右クリックして編集メニューで可能です

条件付きブレークポイントの設定

ブレークポイントで右クリック

高度な条件で追記、適用
ここで設定できる条件はブロック内の変数(または、クラスメンバー変数)に限られます
他のブロックで定義されている変数は使えません

結果

Enemy (2)だけ止まります。その他のEnemyにアタッチされているスクリプトも実行されていますが、ブレークポイントでは止まっていないだけです

クラスメンバー変数を条件とした場合

point の値が2になった止まる設定です

ブレークポイントで止まった状態

Unity,デバッグ

Posted by hidepon