6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[基礎知識]シーン上のデータを取得する方法

Last updated at Posted at 2019-08-07

概要

Unityでシーン上にあるGameObjectや、それにアタッチされているコンポーネントを取得する方法。

GameObjectの取得

Inspectorで設定する

検索をかけるまでもなく、実行前の状態で既にシーン上にあるものにのみ有効な方法。
シリアライズ可能なフィールドを書き、UnityのInspector上で設定する。

Sample.cs
public class Sample : MonoBehaviour
{
    // [SerializeField]を書くことで、シリアライズ可能なフィールドを宣言できる。
    [SerializeField] private GameObject _object;

    // publicなフィールドでも可。
    // public GameObject _object;
}

1.png
2.png

GameObject名で検索する

GameObjectに設定された名前で検索をかけます。

GameObject obj = GameObject.Find("探したいオブジェクト名");

アタッチされているコンポーネントで検索する

特定のコンポーネントをアタッチしていた場合に使用可能だが、パフォーマンスが悪い。

GameObject obj = FindObjectOfType</*指定したいコンポーネント*/>().gameObject;

タグで検索する

UnityではGameObjectにタグを設定でき、そのタグを使って検索をかけます。
ただし探したいタグは、あらかじめタグマネージャーに設定されたものである必要があります。
FindFindObjectOfTypeに比べ、安定した実行速度を誇る。

// 指定したタグを持つGameObjectを 1つ 取得する。
GameObject obj = GameObject.FindWithTag("探したいオブジェクトに設定されたタグ");

// 指定したタグを持つGameObjectを 全て 取得する。
GameObject[] objs = GameObject.FindGameObjectsWithTag("探したいオブジェクトに設定されたタグ");

コンポーネントの取得

Inspectorで設定する

方法はGameObjectの時と同様のため、画像での説明は省略。

Sample.cs
// 欲しいコンポーネントを仮に Example とする
public class Sample : MonoBehaviour
{
    [SerializeField] private Example _object;

    // または
    // public Example _object;
}

GetComponentで取得する

GetComponent関数で取得する。
指定したGameObjectからコンポーネントを取得するものなので、GameObjectの取得と組み合わせることも可。

// 自身を持つGameObjectにアタッチされた、他のコンポーネントを取得する場合
var cmp = this.gameObject.GetComponent</*欲しいコンポーネント*/>();

// CUBE という名前のGameObjectから取得したい場合
var cmp = GameObject.Find("CUBE").GetComponent</*欲しいコンポーネント*/>();

シーン内から取得する

GameObjectの時に使ったFindObjectOfTypeの本来の用途。
頻繁に使うべきではない。

// シーン内にある、指定したコンポーネントの1つを取得する
var cmp = FindObjectOfType</*欲しいコンポーネント*/>();

// シーン内にある指定したコンポーネント全てを取得する
var cmp = FindObjectsOfType</*欲しいコンポーネント*/>();

まとめ

  • 取得一つをとっても様々な方法がある。
  • ものによっては処理が重くなるため以下のような策を講じるべきである。
    1. 初期化時に一回のみ呼び出す。
    2. 頻繁に呼び出すようなものは、あらかじめ配列などで保持できるような設計にするべきである。

実行確認環境

Unity [2018.2 以上]

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?