▼そのUnityの作業、依頼しませんか?
ゲーム開発に使える素材・知識

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

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にアタッチされているスクリプトに記述していく。スクリプト名は【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サンプルゲーム】うちのポチが危ないところでフリスビーを要求する理由を教えてくれの本記事
【Unity3Dサンプルゲーム・チュートリアル】「フリスビーを犬に届けよ!」の概要【Unityチュートリアル・サンプルゲーム】Unityで3Dゲームを作りたいと考えている人、本やネットにあるUnityのチュートリアルをやってみたけど、いまいちゲームらしくないと思っている人、テキストでも動画でも学びたい人におすすめのチュートリアルです。...
ABOUT ME
さぎのみや
さぎのみや
超書手。現在はUnityメディア「ユニシャー」の運営とゲーム開発がメインです。Unity、ライティング関係のお仕事お待ちしております。 >>詳しいプロフィール >>Amazonほしいものリスト
【Unity3D】新しいサンプルゲーム(チュートリアル)を作りました!!!
Unity有料サンプルゲーム

「Unityで3Dゲームを本格的に作っていきたい!」という人におすすめのチュートリアルとなっています。

画像のようなゲームの作り方を販売しています。色々と応用できるサンプルゲームとなっています。ぜひ、作ってみてください。

詳細
>>【Unity3Dサンプルゲーム・チュートリアル】「フリスビーを犬に届けよ!」の概要

>>BOOTHでこのチュートリアルを見る

【RT・フォローであなたのスキルが上がる】

シェアフォローする

さぎのみやのモチベが上がる

コンテンツの質が上がる

あなたの能力も上がる

あなたの
Twitterでのシェア

であなたの能力が上がります。

>>さぎのみやのツイッター(@saginomiya8)

 

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


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