Unityでスクリプトからゲームオブジェクトを見つける方法

Unityオブジェクトの取得

 こんにちは。ロクと申します。

 今回の記事では、Unityにおいてスクリプトからゲームオブジェクトを取得する方法について書いていきます。

 ゲーム作りにチャレンジされている方のお役に立てれば幸いです。

オブジェクトの取得には主に3つの方法がある

 ゲーム中にゲームオブジェクトを見つける方法は3つほどあります。

 まずはこれら3つについて箇条書きで書いておきます。

  • Find関数を使う方法
  • Find関数のタグバージョンを使う方法
  • publicでオブジェクトを宣言する方法

 これらのうち、もっともよくつかわれるのはFind関数です。

 また、Find関数のタグをつかうバージョンでは、一度に多くのオブジェクトを取得することができます。

 その他、最も簡単に実装できる方法はpublicで宣言し、直で取得する方法となっています。

 それぞれの方法に特徴や向き不向きがありますので、順に説明していきます。

1:Find関数を使って取得

 この方法は、Unity中にあるゲームオブジェクトを一つひとつ見ていき、該当するオブジェクトが見つかれば、それを結果として返すものです。

 書式は以下の通りです。

 まずは以下の通りに変数を宣言します。名前(goの部分)はなんでもいいです。

GameObject go;

 そして次に、Start関数内に以下のコードを書いてください

go=GameObject.Find("オブジェクトの名前");

 「オブジェクトの名前」については、Unityのプロジェクト内にあるオブジェクトの名前をそのまま入れてください。また、名前をダブルコーテーション(“"←のこと)で囲うのを忘れずに。

 この方法により、goという名前で宣言したゲームオブジェクト型の変数に、探してほしいオブジェクトを取得することができます。

 ちなみに、Start関数の中に書く理由ですが、実はFind関数は処理が重く、Update関数の中に書くと処理が追いつかなくなりプレイどころではなくなります

 また、Findは一度行えば変数の中身を入れかえない限り永久的にオブジェクトが保持されたままになりますので、初めに一度だけ行うStart関数中に書けば事たりるのです。

2:タグを利用して複数オブジェクトを取得

 Find関数の派生版のような方法ですが、タグを利用して一度に多くのオブジェクトを取得するという方法もあります。

 まず、そもそもタグとは何かということについてです。

 ゲームを作っていくうちに、ゲームオブジェクトを区別するための、名前とは別の目印のようなものが欲しいと思う場合があります。

 例えば、敵キャラとして「ゾンビ」と「オオカミ」を作ったとしましょう。この時、これら二つのオブジェクトは敵キャラなので、"teki"のようなタグを二つとも共通してつければ、敵キャラの管理が楽になります。

 このタグを使ってオブジェクトたちの検索を行うのが本項の方法です。

タグがどれのことを言うのか示した画像

 なお、タグを使う方法は複数のオブジェクトを取得するので、配列を宣言してその中に取得していくようになっています。

 書式についてですが、まずは配列を宣言しましょう。この場合はgosを配列名として宣言しています。

GameObject[] gos;

 次に、またもStart関数の中に下のコードを書きましょう。理由は先ほどと同じでUpdateだと処理が重いからです。タグは"go"という名前で付けているとします。

gos=GameObject.FindGameObjectsWithTag("go");

 ここで一つ注意ですが、上の一文中の「GameObjects」は一番後ろにsがついていることに注意です!

 また、気になるかもしれませんが、gosは配列で宣言されているとはいえ、上の関数を使う場合は特別にgosに[]をつけずに書くことになっています。

 理由としては、[]の添え字での指定は一つの保存場所を指すのに対し、この関数では一度に複数のオブジェクトを保存する必要があるため、添え字による指定の意味がないからです。

 この方法で一気に取得すれば、例えばゲームセット時に敵キャラをクリーンする際、この関数で取得してDestroy関数を使えば、ステージ上を一掃できます笑。

3:Publicでの宣言を利用して即取得

 この方法は、上記2つの方法を試してみたが、あまりうまくいかなかったという場合に取るべき最終手段です。

 Find関数は使い方について深く理解していない場合、すぐにエラーが表示されてしまいますので、その時の応急処置としてこの方法を覚えておきましょう。

 イメージとしては、「いちいちすべてのオブジェクトを検索していくのではなく、取得したいオブジェクトを初めから自分でぶち込む」といった感じにとらえてくれればOKです。

 では、これから書式を書いていきます。

public GameObject go;

 スクリプトについてはこれでOKです(( ゚Д゚)!?

 とりあえず、いつも変数を宣言しているところに上のコードを書きましょう。

 一文で終わったのですこし拍子抜けかもしれませんが、もう一つ作業があります。

 このスクリプトを保存して、そのあとインスペクターを確認すると、以下の画像のようになっていると思います。

publicで変数宣言したときのインスペクター

 この、Noneと書かれている部分にあなたが取得したいと思っているオブジェクトをそのままドラッグして当てはめるようにしてください。この作業を忘れると当然ながらエラーですよ。

 これでオブジェクトの取得は終わりです。とても簡単で確実性がありますね。

 ただ、オブジェクト取得の時に、一つひとつ手動で当てはめていく必要があることと、ゲームの実行中に途中で出現するオブジェクトをこの方法で取得することはできないことに注意が必要です。

 ↑シューティングゲームの銃弾(ゲームの途中で出現する)を取得する場合とかのことですね。

 ただ、途中から出てくるオブジェクトに関しては、生成するための大元のオブジェクトがprefabとしてあると思うので、そのprefabのオブジェクトをアタッチすることで代替できます。

最後に

 今回の方法でオブジェクトをスクリプトによって見つけ出すということが可能になりましたね。

 ただ、オブジェクトを取得するだけでは意味がありません。

 取得したオブジェクトについては、通常、用意した変数の中に入れておきますが、この変数をどのように工夫して使っていくかが大事になってきます。

 これについては、また新たな知識やスキルが必要となるので、これからも勉強を忘れないようにしましょう。

 それではまた~。

Unity

Posted by ロク