【Unity】Findメソッドの説明・使い方をお伝えする【オブジェクトを取得できる】

Findメソッドの説明・使い方の記事になっている。「GameObject.Find」から「transform.Find」の説明まで行っている。

GameObject.FindとTransform.Findの違いも知りたい人には特に見ていただきたい。

目次

Findメソッドとはオブジェクトを見つけることができる

 スクリプト上でオブジェクトを見つれるのがFideメソッドだ。名前を指定してオブジェクトを探すことができるので「Player」という名前のオブジェクトを取得したり、「Cube」という名前のオブジェクトすることもできる。

▼GameObject系▼

GameObject.Find("オブジェクト名");
シーン中からオブジェクト名と一致するゲームオブジェクトを1つ取得。
GameObject.FindWithTag("タグ名");
シーン中からタグ名と一致するゲームオブジェクトを1つ取得。
GameObject.FindGameObjectsWithTag("タグ名");
シーン中からタグ名と一致するゲームオブジェクトを複数取得。返り値がGameObjectの配列。

▼Transform系▼

親オブジェクト.transform.Find("オブジェクト名"); 子オブジェクトを取得(Transform型)

Findメソッドには「GameObject系」と「Transform系」の2種類がある。なおこの言い方はわかりやすく説明するために、名付けた名前にすぎない。

GameObject系【Find】

GameObject.Find("オブジェクト名");
シーン中からオブジェクト名と一致するゲームオブジェクトを1つ取得。
GameObject.FindWithTag("タグ名");
シーン中からタグ名と一致するゲームオブジェクトを1つ取得。
GameObject.FindGameObjectsWithTag("タグ名");
シーン中からタグ名と一致するゲームオブジェクトを複数取得。返り値がGameObjectの配列。

他にもあるので後々追記。

GameObject.Find("オブジェクト名")

シーン中からオブジェクト名と一致するゲームオブジェクトを1つ取得できる。

現在の状況

GameObject.Find("オブジェクト名")を使う

  • Cubeが設置してある
  • Cubeにスクリプトがアタッチしてある

Cubeにアタッチされているスクリプトに記述していく。スクリプト名は【Sample.cs】にしてある。

スクリプト例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    GameObject objGet;

    void Start()
    {
        objGet = GameObject.Find("Cube");
        Debug.Log(objGet.name);
    }
}
GameObject.Find("オブジェクト名");
シーン中からオブジェクト名と一致するゲームオブジェクトを1つ取得。

オブジェクトの名前を指定して、オブジェクトを取得できる。そして取得したオブジェクト名をコンソールに表示するようにしてる。

これを実行して取得したオブジェクトの名前がコンソールに表示されればOK。

GameObject.FindWithTag("タグ名")

シーン中からタグ名と一致するゲームオブジェクトを1つ取得できる。

現在の状況

GameObject.FindWithTag("タグ名")を使う

  • Cubeが設置してある
  • Cubeにスクリプトがアタッチしてある
  • Cubeのタグが「Player」

Cubeにアタッチされているスクリプトに記述していく。スクリプト名は【Sample.cs】にしてある。タグがわからない場合はUnityで使われるタグ。タグによって処理の変更、スクリプトから検索できるご覧いただきたい。

スクリプト例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    GameObject objGet;

    void Start()
    {
        objGet = GameObject.FindWithTag("Player");
        Debug.Log(objGet.name);
    }
}
GameObject.FindWithTag("タグ名");
シーン中からタグ名と一致するゲームオブジェクトを1つ取得。

タグ名を指定してオブジェクトを取得できる。そして取得したオブジェクト名をコンソールに表示するようにしてる。

これを実行して取得したオブジェクトの名前がコンソールに表示されればOK。

GameObject.FindGameObjectsWithTag("タグ名");

シーン中からタグ名と一致するゲームオブジェクトを複数取得できる。返り値がGameObjectの配列。

現在の状況

GameObject.FindGameObjectsWithTag("タグ名");を使う

  • CubeとSphereが設置してある
  • Cubeにスクリプトがアタッチしてある
  • CubeとSphereのタグが「Player」

Cubeにアタッチされているスクリプトに記述していく。スクリプト名は【Sample.cs】にしてある。タグがわからない場合はUnityで使われるタグ。タグによって処理の変更、スクリプトから検索できるご覧いただきたい。

スクリプト例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    GameObject[] objGets;

    void Start()
    {
        objGets = GameObject.FindGameObjectsWithTag("Player");
        Debug.Log(objGets[0].name);
        Debug.Log(objGets[1].name);
    }
}
GameObject.FindGameObjectsWithTag("タグ名");
シーン中からタグ名と一致するゲームオブジェクトを複数取得。返り値がGameObjectの配列。

指定したタグ名をもっているオブジェクトを取得できる。そして取得したオブジェクト名をコンソールに表示するようにしてる。

これを実行して取得したオブジェクトの名前がコンソールに表示されればOK。

GameObject系の注意点

  • 基本的に重くなるので使わない
  • Updateメソッド内では使わない
  • オブジェクトが非アクティブだと取得負荷

基本的に重くなるので使わない

まず重くなるのであまり使わないほうが良い。【Unity】オブジェクトを見つける(取得する)2つの方法こちらに書いてある「public」を使って、オブジェクトを取得するほうが軽い。

・どうしても使わないといけない場合

  • 一回しか使わない
  • 「FindGameObjectWithTag」か「Transform.Find」を利用する

どうしても使わないといけない場合は上のことを守ることをおすすめする。「Transform.Find」については後半に説明する。

Updateメソッド内では使わない

重い処理を毎フレームごとに実行するのはさらに重くなる原因になる。Updateメソッド内で使うべきでない。

オブジェクトが非アクティブだと取得不可

FindメソッドのGameObject系は非アクティブであるオブジェクトを取得できない。非アクティブなオブジェクトを取得するにオブジェクトを見つけるに書いてあるpublicや[SerializeField]を使うか、Transform.Findを使うことをおすすめする。

Transform系【Find】

親オブジェクト.transform.Find("オブジェクト名"); 子オブジェクトを取得(Transform型)

子オブジェクトの「Transform」を取得できる。「.gameObject」をつけることでGameObject型に変換できる。

親オブジェクト.transform.Find("オブジェクト名");

子オブジェクトの「Transform」を取得できる。

現在の状況

親オブジェクト.transform.Find("オブジェクト名")を使う

  • Sampleにスクリプトがついてる
  • GrandParent>Parent>Child1、Child2の階層

Sampleにアタッチされているスクリプトに記述していく。スクリプト名は【Sample.cs】にしてある。

スクリプト例【Transform】

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    GameObject grandParent;
    Transform parent;
    Transform child1;
    Transform child2;

    void Start()
    {
        grandParent = GameObject.Find("GrandParent");
        parent = grandParent.transform.Find("Parent");
        child1 = parent.transform.Find("Child1");
        child2 = parent.transform.Find("Child2");

        // これでも同じように取得可能
        child1 = grandParent.transform.Find("Parent/Child1");
        child2 = grandParent.transform.Find("Parent/Child2");

        Debug.Log(grandParent.name);
        Debug.Log(parent.name);
        Debug.Log(child1.name);
        Debug.Log(child2.name);
    }
}
親オブジェクト.transform.Find("オブジェクト名"); 子オブジェクトを取得(ただしTransform型)

GameObject.Findと違って非アクティブのchild2も取得できる。

Parent/Child1のようにして「/」を使える。

ただこの場合だと「Transform」しか取得できない。「GameObject」を取得する方法もお伝えする。

スクリプト例【GameObject】

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    GameObject grandParent;
    GameObject parent;
    GameObject child1;
    GameObject child2;

    void Start()
    {
        grandParent = GameObject.Find("GrandParent");
        parent = grandParent.transform.Find("Parent").gameObject;
        child1 = parent.transform.Find("Child1").gameObject;
        child2 = parent.transform.Find("Child2").gameObject;

        // これでも同じように取得可能
        child1 = grandParent.transform.Find("Parent/Child1").gameObject;
        child2 = grandParent.transform.Find("Parent/Child2").gameObject;

        Debug.Log(grandParent.name);
        Debug.Log(parent.name);
        Debug.Log(child1.name);
        Debug.Log(child2.name);
    }
}
親オブジェクト.transform.Find("オブジェクト名").gameObject; 子オブジェクトを取得(GameObject型)

これで普通にGameObject.Findを使ったときにように非アクティブのオブジェクトを取得できる。

・非アクティブのオブジェクトを取得する流れ

  1. GameObject.Find(GameObject系)メソッドで親オブジェクト取得
  2. Transform.Findで非アクティブのオブジェクトを探す
  3. 取得したオブジェクトをGameObject型に変更

このようにして非アクティブのオブジェクトを探して、GameObject型で取得できる。

GameObject系とTransform系の違い

  GameObject系 Transform系
検索対象 Hierarchyにあるすべて 子オブジェクト
非アクティブを取得できるか 取得できない 取得できる
戻り値(取得する型) GameObject型 Transform型

まとめた。

まとめ

  • Findメソッドでオブジェクトを検索・取得できる
  • Findメソッドの中でもGameObject系のメソッドとTransform系メソッドの2つわけられる(このサイト独自の呼び方)
  • GameObject系は非アクティブのオブジェクトを検索・取得できない
  • Transform系は非アクティブのオブジェクトを検索・取得できない

▼GameObject系▼

GameObject.Find("オブジェクト名");
シーン中からオブジェクト名と一致するゲームオブジェクトを1つ取得。
GameObject.FindWithTag("タグ名");
シーン中からタグ名と一致するゲームオブジェクトを1つ取得。
GameObject.FindGameObjectsWithTag("タグ名");
シーン中からタグ名と一致するゲームオブジェクトを複数取得。返り値がGameObjectの配列。

▼Transform系▼

親オブジェクト.transform.Find("オブジェクト名"); 子オブジェクトを取得(ただしTransform型)

▼GameObject系とTransform系の違い▼

  GameObject系 Transform系
検索対象 Hierarchyにあるすべて 子オブジェクト
非アクティブを取得できるか 取得できない 取得できる
戻り値(取得する型) GameObject型 Transform型

あくまでFindメソッドのGameObject系とかTransform系といっているのは、多分このサイトだけなので要注意。

まだFindメソッドがあるので、追記していく。

以上、オブジェクトが取得できるFindメソッドの説明・使い方だ。

このようなチュートリアルを販売しているので、Unityでゲームを作成している人は購入していただきたい。

>>Unityでもっとゲーム開発する

あわせて読みたい
【Unity3Dサンプルゲーム・チュートリアル】「フリスビーを犬に届けよ!」の概要 【はじめに】 Unityでのゲーム開発を手助けするメディア「Unishar-ユニシャー」のさぎのみやです。「フリスビーを犬に届けよ!」というゲームのチュートリアルを作成し...
Unity】Findメソッドの説明・使い方をお伝えする

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!

コメント

コメント一覧 (2件)

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次