[Unity]オブジェクト名からオブジェクトを取得

オブジェクト名からオブジェクトを取得

オブジェクトの検索・取得

Hierarchyのパス

Hierarchyに配置されるオブジェクトは、ディレクトリと同じようにパスで表現することが出来ます。例えば以下の様なHierarchyがあった場合、それぞれのパスは表のようになります。

find_path

オブジェクト名 パス
Child(A) /Child
Directional light /Directional light
GameObject /GameObject
Main Camera /Main Camera
root /root
Parent /root/Parent
Child(B) /root/Parent/Child

このように、最初の”/”はHierarchyの一番上の階層を示し、「親/子」で親子関係を表します。

深さ

コンピュータでこのような構造(ツリー構造)を表すとき、根(root)が最も浅く、子
は深さと表現します。孫、ひ孫となるとどんどん深くなります。上図ではrootオブジェクトにはParent、その下にChildと子供が連なっています。rootオブジェクトが最も浅く、Childオブジェクトが最も深いオブジェクトとなります。

名前からオブジェクトを取得

Unityでオブジェクトを検索し、取得する一番簡単な方法は、GameObjectクラスにメソッドとしてまとめられています。

http://docs-jp.unity3d.com/Documentation/ScriptReference/GameObject.html

http://docs-jp.unity3d.com/Documentation/ScriptReference/GameObject.html

GameObjectクラスの以下のメソッドを利用します。

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

引数にオブジェクト名を文字列で与えることでGameObjectを取得することができます。この時、引数に与える文字列にいくつかの方法があります。

名前だけ指定

名前だけ指定した場合、Hierarchy中にある同名のオブジェクトを返します。この時、複数同じ名前があった場合、いずれかが返ります。例 “Child”

親子関係を指定

親と子、もしくはそれ以上の関係を書いて子のオブジェクトを取得します。複数同名のオブジェクトがある場合、構造で絞れますので、ある程度限定したオブジェクトを選択することができます。例 “Parent/Child”

ルートから指定

上記の表にあるように、すべてのパスを指定する方法です。上記2つの方法で、もっとも厳密にオブジェクトを選択することができます。全く同じ構造のオブジェクトがある場合もありますので、絶対ではありません。例 “/root/Parent/Child”

実例

今回は、名前を指定したオブジェクトが実行時に赤くなるシーンを作成しました。

HierarchyとAsset

今回用意したHierarchyは以下の図の通りです。

find_path

オブジェクト名 種類
Child(A)
Directional light 光源
GameObject ゲームオブジェクト
Main Camera カメラ
root ゲームオブジェクト
Parent カプセル
Child(B) 立方体

これを配置した実行画面は以下のとおりです。

find_default

Assetはオブジェクトを検索し、マテリアルを割り当てるスクリプト「SetColor」と、割り当てるマテリアル「red」を容易し、「SetColor」はHierarchyにあるGameObjectに対し付加しています。

find_assets
find_inspector

SetColorスクリプトを付加すると、MatとObjnameを入力できるようになっています。Matにはマテリアル「red」を割り当て、Objenameにはオブジェクト名を入力します。

スクリプト

using UnityEngine;
using System.Collections;

public class SetColor : MonoBehaviour {
	public Material mat = null; // Inspectorから指定
	public string objname = ""; // Inspectorから指定
	// Use this for initialization
	void Start () {
		if(mat == null){
			return;
		}
		GameObject obj = GameObject.Find(objname);
		if(obj) // オブジェクトが取得できたら以下を実行
			// マテリアルを割り当て
			obj.renderer.material = mat;
	}
}

このスクリプトをGameObjectに割り当てています。

実行

今回はGameObjectに付加したSetColorにInspectorからObjnameにオブジェクト名を指定して実行します。

名前だけ指定

find_child_inspector
find_child

親子関係を指定

find_relative_hierarchyfind_relative_hierarchy_color

ルートから指定

find_absolute
find_relative_hierarchy_color

おわりに

今回はHierarchy中のオブジェクトを名前で検索して取得する方法を試してみました。子オブジェクトを取得する方法や、タグで取得する方法もありますが、またいずれ。