Unityで異なるゲームオブジェクトのコンポーネントにアクセスする技術資料
この技術資料では、Unityで他のゲームオブジェクトのコンポーネントにアクセスするための方法について説明します。Unityでは、シーン内に存在する異なるゲームオブジェクトのコンポーネント(例:Transform, Rigidbody など)にアクセスして、動的にそのプロパティやメソッドを操作することが可能です。ここでは、Unity 6.6(6000.6系、2026年9月時点)を基準に、ゲームオブジェクトやコンポーネントを取得するパターンについて紹介します。

1. Unityでの基本的なコンポーネントアクセス
異なるゲームオブジェクトのコンポーネントにアクセスする基本的な流れは次の通りです。
- 取得したいゲームオブジェクトを指定。
GetComponent<T>()メソッドを使って、そのゲームオブジェクトに付随するコンポーネントを取得。- コンポーネントのプロパティやメソッドにアクセス。
以下のサンプルコードは、targetObject という別のゲームオブジェクトの Transform コンポーネントにアクセスして、その位置を変更する方法を示しています。
using UnityEngine;
public class AccessOtherComponent : MonoBehaviour
{
// 他のオブジェクトをインスペクターから指定
public GameObject targetObject;
void Start()
{
// targetObjectが設定されているか確認
if (targetObject != null)
{
// targetObjectのTransformコンポーネントを取得
Transform targetTransform = targetObject.GetComponent<Transform>();
// targetObjectの位置情報を変更
targetTransform.position = new Vector3(0, 5, 0);
Debug.Log("ターゲットオブジェクトの新しい位置: " + targetTransform.position);
}
else
{
Debug.LogWarning("ターゲットオブジェクトが設定されていません。");
}
}
}
このコードは、Unityエディタのインスペクターからオブジェクトを指定するためのフィールドを宣言しています。具体的には、targetObject という変数を public として宣言し、その型を GameObject にしています。
詳しい説明
public修飾子を使うことで、このフィールドはUnityのインスペクター(エディタ画面の右側)に表示されます。これにより、スクリプトがアタッチされているオブジェクトから、他のオブジェクトを簡単に指定することができます。GameObject型は、Unityの中でシーンに存在するすべてのオブジェクトを指します。例えば、キャラクター、敵、背景、UIなど、すべてがGameObjectとして扱われます。- このフィールドに他のオブジェクトを指定すると、スクリプト内でそのオブジェクトにアクセスできるようになります。
使用方法
- スクリプトをオブジェクトにアタッチすると、インスペクターに
targetObjectというフィールドが表示されます。 - インスペクター上で、ドラッグ&ドロップまたはオブジェクトを選択することで、
targetObjectに他のオブジェクトを割り当てられます。 - 割り当てられたオブジェクトを、スクリプト内でアクセスして操作できます。
このように、targetObject に割り当てたオブジェクトをスクリプトで操作できるのが、この仕組みの便利な点です。
2. ゲームオブジェクトをコードで取得するパターン
Unityでは、異なる方法でゲームオブジェクトを動的に取得することが可能です。ここでは、4つの代表的なパターンを紹介します。
2.1 GameObject.Find を使用する
シーン内で特定の名前を持つゲームオブジェクトを取得します。これは、シーン内に一意の名前を持つゲームオブジェクトが存在する場合に有効です。
void Start()
{
// "TargetObject" という名前のゲームオブジェクトを探す
GameObject targetObject = GameObject.Find("TargetObject");
if (targetObject != null)
{
Transform targetTransform = targetObject.GetComponent<Transform>();
targetTransform.position = new Vector3(0, 5, 0);
Debug.Log("ターゲットオブジェクトの新しい位置: " + targetTransform.position);
}
}
2.2 FindWithTag を使用する
タグを使用して、特定のグループに属するゲームオブジェクトを取得します。タグはシーン内で一意である必要がなく、同じタグを持つ複数のオブジェクトが存在することもあります。
void Start()
{
// "Player" タグを持つオブジェクトを探す
GameObject targetObject = GameObject.FindWithTag("Player");
if (targetObject != null)
{
Transform targetTransform = targetObject.GetComponent<Transform>();
targetTransform.position = new Vector3(0, 5, 0);
Debug.Log("プレイヤーオブジェクトの新しい位置: " + targetTransform.position);
}
}
2.3 FindFirstObjectByType を使用する
指定した型のコンポーネントを1件取得します。以下はアクティブなGameObject上のRigidbodyを検索する例です。対象がない場合は null が返ります。対象が複数あり、どれでもよければ FindAnyObjectByType<Rigidbody>() も使えます。
void Start()
{
// Rigidbodyコンポーネントを持つオブジェクトを探す
Rigidbody targetRigidbody = FindFirstObjectByType<Rigidbody>();
if (targetRigidbody != null)
{
targetRigidbody.transform.position = new Vector3(0, 5, 0);
Debug.Log("Rigidbodyオブジェクトの新しい位置: " + targetRigidbody.transform.position);
}
}
Unity 6.6(6000.6系)では、旧APIの FindObjectOfType は非推奨です。FindFirstObjectByType<T>() は最初の対象を、FindAnyObjectByType<T>() は任意の1件を取得します。FindAnyObjectByTypeは非同期APIではありません。特定の対象を選ぶ必要がなければ、後者を利用できます。
FindAnyObjectByType<T>() の特徴
FindFirstObjectByType<T>()と同様に、特定の型を持つオブジェクトを取得します。- 指定した型の任意の1件を返します。特定のインスタンスを必要としない場合、
FindFirstObjectByType<T>()より高速です。 - 複数存在しても返るのは1件です。呼び出すたびに同じ対象が返る保証はありません。
使用例
以下は、FindAnyObjectByType<T>() を使ったサンプルコードです。
using UnityEngine;
public class FindByNewMethod : MonoBehaviour
{
void Start()
{
// シーン内のアクティブなRigidbodyから任意の1件を取得
Rigidbody targetRigidbody = FindAnyObjectByType<Rigidbody>();
if (targetRigidbody != null)
{
// オブジェクトの位置を変更
targetRigidbody.transform.position = new Vector3(0, 5, 0);
Debug.Log("見つけたRigidbodyオブジェクトの新しい位置: " + targetRigidbody.transform.position);
}
else
{
Debug.LogWarning("Rigidbodyを持つオブジェクトが見つかりませんでした。");
}
}
}
主な違い
FindAnyObjectByType<T>(): パフォーマンスがより最適化され、より効率的に動作します。特に大規模なシーンでは、複数のオブジェクトを探索する際にFindFirstObjectByType<T>()よりも高速です。FindFirstObjectByType<T>(): 指定した型の最初の対象を取得します。Hierarchyの表示順や距離による選択ではありません。特定の対象を確実に操作したい場合は、Inspectorで参照を指定しましょう。
注意点
FindAnyObjectByType<T>()はシーン全体を検索するので、リアルタイムで頻繁に呼び出すとパフォーマンスに影響を与える可能性があります。そのため、キャッシュして使うなどの工夫が必要です。
この新しいメソッドを使うことで、特に大規模なプロジェクトや複雑なシーンにおいて、より効率的にゲームオブジェクトを検索することができます
2.4 FindObjectsByType を使用する
同じ型のコンポーネントを配列で取得します。旧APIの FindObjectsOfType は非推奨です。FindObjectsInactive.Exclude は非アクティブなGameObjectを除外し、含める場合は Include を指定します。FindObjectsSortMode.None は不要な並べ替えを省きます。結果の順序には依存しないでください。
void Start()
{
// アクティブなRigidbodyを並べ替えずにすべて取得
Rigidbody[] rigidbodies = FindObjectsByType<Rigidbody>(
FindObjectsInactive.Exclude,
FindObjectsSortMode.None);
foreach (Rigidbody rb in rigidbodies)
{
rb.transform.position = new Vector3(0, 5, 0);
Debug.Log(rb.name + " の新しい位置: " + rb.transform.position);
}
}
3. 各パターンの用途と注意点
GameObject.Find: 名前でオブジェクトを取得するため簡単ですが、名前が変更されたり、シーンに複数のオブジェクトが存在する場合に正しく動作しない可能性があります。また、パフォーマンスが低下することがあるため、大規模なシーンでは注意が必要です。FindWithTag: 複数のオブジェクトを同じタグでグループ化できるため、柔軟性があります。ただし、FindWithTagが返すのはアクティブな1件です。複数のうち特定の対象が返る保証はありません。FindFirstObjectByType: シーン内で唯一の特定コンポーネントを持つオブジェクトを見つける場合に有効です。ただし、該当オブジェクトが複数ある場合は注意が必要です。FindObjectsByType: 同じコンポーネントを持つ複数のオブジェクトを一度に処理したいときに便利ですが、シーン内のすべてのオブジェクトをチェックするため、パフォーマンスの低下に注意が必要です。
4. まとめ
Unityで異なるゲームオブジェクトのコンポーネントにアクセスするには、さまざまな方法があります。それぞれのパターンには適切な用途があり、シーンの規模や要件に応じて最適な方法を選択することが重要です。
- シーンの構成が小規模 で、明確な名前のオブジェクトがある場合は
GameObject.Findが便利です。 - タグで1件取得する場合は
FindWithTag、同じタグの全件を取得する場合はGameObject.FindGameObjectsWithTagを使います。 - 特定のコンポーネントを持つオブジェクトに 簡単にアクセスしたい場合は、
FindFirstObjectByTypeやFindObjectsByTypeが便利です。
これらの方法を使い分けて、効率的にゲームオブジェクトやコンポーネントを操作しましょう。











ディスカッション
コメント一覧
まだ、コメントがありません