Developer

【初心者Unity】GameObject.Findを具体例付きで解説
2020.12.29
Lv1

【初心者Unity】GameObject.Findを具体例付きで解説


GameObject.Find()とは

GameObject.Find()はその名の通り、GameObjectクラスのFind()というメソッドです。「Find」とは日本語に翻訳すると「見つける」という意味。つまり何かを見つけるためのメソッドなんですね!その何かとは何か。。。それはこちら!ゲームオブジェクトです!
皆さんおなじみのCapsule(左)・Sphere(中央)・Cube(右)といった子たちです。

え、そんなのFindしてどうすんの?とお思いの方もいらっしゃるでしょう。そんなあなたも。そもそもここまで何言ってんのかよくわからないそこのあなたも。この記事でFindマスターになってもらいましょう!
この記事では、実際にC#でスクリプトを書いてGameObject.Find()について解説していきます!


どこから探すの?

GameObject.Find()がゲームオブジェクトを探してくれるというのは何となくわかっていただけたかと思います。では、いったいどこから探すのでしょうか?それはズバリ!「Hierarchy」の中からです!
「Hierarchy」は下のやつです。

見たことありますよね?(笑)

「Hierarchy」について復習したい方はこちらの記事を参照

【Unity連載】おさえておきたいヒエラルキービューの使い方


実際に使ってみる

さて、いよいよここから実際にスクリプト上でGameObject.Find()を使いながら説明していきます。
今回のスクリプトでは、「Sphere」(オブジェクト)が一定の距離に近づいてくると左によけるという動きをスクリプトで書いて、板の形をしたオブジェクトに付けたいと思います。まあ要するにSphereが近づいてくるとよける自動ドアを作りたいってことですね(笑)

ここで、Sphereの位置をスクリプト上で得る必要が出てきました。はいここ!ここです!「Sphereの」ってとこです!つまり板のスクリプトに「Sphereの」ということを書かなければならないのですね。これをFind()で見つけます。
以下のスクリプトにおいては8行目に記述されています。
行目で「Sphere」を見つけたことで15行目でSphereの座標について記述することができます。この8行目がなかった場合、スクリプトは、Sphereの座標ではなく、「板の座標のことだな!」となってしまうのです。

    //ゲームオブジェクトを指す変数定義
    GameObject sphere;
    //座標の変数定義
    Vector3 pos;
    void Start()
    {
        //ゲームオブジェクト「Sphere」を見つける
        sphere=GameObject.Find("Sphere");
        //板の現在の座標を入手
        pos = transform.position;
    }
    void Update()
    {
        //「Sphere」の座標が板に近くなった時(zが-2より大きくなった時)のみ実行
        if (sphere.transform.position.z > -2)
        {
            //変数「pos」のx軸における座標を毎フレーム毎に0.02増加
            pos.x += 0.02f;
            //変数「pos」の値を板の座標に反映させる(横にスライドする)
            transform.position = pos;
        }
    }
スクリプトに書いてある「Start」・「Update」がよくわからないよ!という方はこちらの記事を参照

【Unity連載】UnityとC#におけるメソッド一覧

無事スクリプトが完成し、再生すると以下の様に動きます。
再生前

再生途中


おまけ

因みに、今回のSphereの動きを記述したスクリプトは以下。
Transformの値をスクリプトで変化させることで移動させています。

    //座標の変数定義
    Vector3 pos;
    void Start()
    {
        //オブジェクトの現在の座標を入手
        pos = transform.position;
    }
    void Update()
    {
        //変数「pos」のx軸における座標を毎フレーム毎に0.01増加
        pos.x += 0.01f;
        //変数「pos」の値をオブジェクトの座標に反映させる
        transform.position = pos;
    }
「Transform」について復習したい方はこちらの記事を参照

【Unity連載】はじめに知っておくべきTransformコンポーネントの概要


注意点

対象のオブジェクトの名前が重複しているとHierarchyで最も上にあるオブジェクトが指定されるため目的のオブジェクトを取得できなかったり、オブジェクトが膨大にあると検索に時間がかかってしまったりといったデメリットがあります。
対象のオブジェクトにタグをつけ、「GameObject.FindGameObjectWithTag(“タグの名前”)」メソッドによってタグの検索を行うことで上記のデメリットを克服することができます。

 
 

連載目次リンク

「初心者のための」Unityゲーム制作 目次
 

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次