【Unity】Tagを使用した高速なオブジェクトの参照方法「FindWithTag」

Unity

はじめに

この記事ではオブジェクトの参照方法を紹介します。

— YouTubeなら8分18秒で学べます ―

 

準備

Hierarchy上で右クリックして、

「Create Empty」より空オブジェクトを生成し、

「Parent」という名前に変更しました。

 

次に、Parentの子オブジェクトにCubeを設置してください。

Cubeを子オブジェクトにするには、

CubeをドラッグしてParentの上でドロップしてください。

 

今回は「Test.cs」スクリプトにコードを記入し、

GameObjectにアタッチしてCubeを取得していきます。

 

GameObject.Findを使った参照方法

 

Hierarchy上のオブジェクトを取得するときは、

のように記入します。

 

今回のように子オブジェクトを取得するときは、

のようにスラッシュで区切って下の階層に降りてください。

 

 

ただし、子オブジェクトが非アクティブの場合は

この方法ではエラー(NullReferenceException)になります。

 

 

SetActive = false 等で非アクティブにした場合は

以下のコードで取得できます。

上記のように、一度アクティブなオブジェクトを取得し、

transform.Find(“オブジェクト名”)と記入すると、

非アクティブなオブジェクトも取得できます。

 

これが最も基本的な参照方法ですが、

 

GameObject.Findは比較的処理が重く、

多用は推奨されておりません。

 

 

 

そこで、以下のように、

Hierarchyから直接参照するか、

Tagを使って参照する方法があります。

 

Hierarchyから直接参照する方法

 

処理の遅い「GameObject.Find」を使わずに参照するには、

のようにpublic変数で宣言してください

 

スクリプトをアタッチしたオブジェクトをクリックすると、

public変数はInspectorに表示されていると思います。

 

その変数に参照したいオブジェクトを

ドラッグ&ドロップしてください。

 

これで、Findを使わずに参照できます。

 

これはシーンをロードしたときから取得しているので、

比較的負荷が軽いみたいです。

 

注意点として、private変数はInspectorには表示されません

 

そこで、

のように[SerializeField]を頭につけてください。

これでInspector上に表示されます。

 

private や [SerializeField] について知りたい方はこちらの記事もおすすめです。

グローバル変数とローカル変数の違いと「Serializefirld」でインスペクター上に変数を表示させる方法

 

 

Tagを使った参照方法「FindWithTag」

 

Tagを使ってFindする場合は、

まず、オブジェクトにTagを付ける必要があります。

 

CubeのInspectorのTagをクリックし、「Add Tag」をクリック。

 

Tagsの右下にある+ボタンをクリックし、

New Tag Name に Cubeと入力してSaveしてください。

Tag名は何でも構いません。

 

これでCube Tagが現れるので選択します。

 

これで、以下のコードを入力すると、

Tagを使ったFindが可能になります。

 

ちなみに、Tagを使えば直接参照できるので、

親子の関係を考慮する必要が無くなります

 

しかも、通常のFindと比較して低負荷で取得できます。

 

各種Findで速度テストをした記事があるので、

興味がある方はどうぞ。

 

— コガネブログ ―

【Unity】GameObject.Find 系関数の処理速度の検証結果

 

 

しかしながら、このFindには1つ注意点があります。

 

それは、Cube Tagが複数のオブジェクトについているとき、

上記のコードではどのオブジェクトを取得するか分からない点です。

 

もし、似たようなオブジェクトの中から

特定の1つを指定したい場合は、

TagをCube1、Cube2のように分けるか、

普通のFindを使用してください。

 

 

Tagが付いた複数のオブジェクトを同時に取得する方法

 

HierarchにCube1とCube2を追加し、

両方ともTagにCubeを設定します。

 

Cubeタグが付いているオブジェクトを全て取得したい場合、

のように記入します。

 

配列データとして取得しているので、

使用する際は以下のようになります。

 

ただし、これもどういう順番で配列に格納されるかは分からないので、

上記のように番号を指定して使用するのは難しいです。

 

これはforeachを使って、

全てのオブジェクトを消したり、

移動させるといった使い方がほとんどです。

 

例えば、爆風に巻き込まれて

Cubeタグが付いているオブジェクトは全て消す、

といった場合は以下のように消します。

 

忙しい人のためのUnity入門講座へ戻る

タイトルとURLをコピーしました