ゲームオブジェクトの取得

概要

スクリプト内でゲームオブジェクトを取得する方法は
「GameObjectのFind関数を使用する」「Assetsフォルダから読み込む」
「ゲームオブジェクトをメンバ変数とし、Unity上で設定する」等があります。

Find関数使用による取得

GameObjectクラスにはFind関数が用意されており、
その関数を使用することでHierarchyにあるゲームオブジェクトを取得することができます。

手順

以下はHierarchyにあるBallオブジェクトをBallControllerスクリプトで Findを使用して取得をし、操作するまでの手順です。 ①.HierarchyにSphereを作成し、名前を「Ball」にする ②.Hierarchyに空のGameObjectを作成し、「BallController」にする ③.スクリプト「BallController」を作成する ④.スクリプトに以下の内容をコーディングする public class BallController : MonoBehaviour { private GameObject m_Ball; // Use this for initialization void Start () { // BallをHierarchyからみつける m_Ball = GameObject.Find ("Ball"); } // Update is called once per frame void Update () { // ボールをこのスクリプトで動かす Vector3 pos = m_Ball.transform.localPosition; if (Input.GetKey (KeyCode.UpArrow)) { pos.y += Time.deltaTime; } else if (Input.GetKey (KeyCode.DownArrow)) { pos.y -= Time.deltaTime; } if (Input.GetKey (KeyCode.LeftArrow)) { pos.x -= Time.deltaTime; } else if (Input.GetKey (KeyCode.RightArrow)) { pos.x += Time.deltaTime; } m_Ball.transform.position = pos; } } ⑤.スクリプト「BallController」をゲームオブジェクト   「BallConroller」に関連付ける ⑥.実行して挙動を確認する   ※矢印キーを押してBallが動いたら成功

Findメソッド

メソッド名: Find 戻り値: 成功:GameObject 失敗:null 引数: string:ゲームオブジェクトの名前 内容: 指定した名前のゲームオブジェクトがHierarchy上に存在したら そのオブジェクトが返り、存在しなければnullを返す 例: // 「Cube」という名前のオブジェクトを探す GameObject obj = GameObject.Find("Cube");

Assetsフォルダから読み込む

AssetsフォルダにあるPrefabやテクスチャなどのリソースの読み込みは
ResourcesクラスのLoad関数を使用して読み込むことができます。

手順

以下の手順はプレハブ化したBoxをLoad関数を使用して読み込み Instantiate関数で複製を行うまでの手順です。 ①.プロジェクトビューにResourcesフォルダを作成する ②.HierarchyでCubeを作成し、名前を「Box」にする ③.Boxをプレハブ化する ※プレハブ化したBoxはResourcesフォルダに入れる ④.HierarchyにあるBoxを削除する ⑤.Hierarchyに空のGameObjectを作成し、名前を「BoxController」にする ⑥.スクリプト「BoxController」を作成する ⑦.BoxControllerに以下の内容をコーディングする public class BoxController : MonoBehaviour { private GameObject m_Box; private float m_Timer; // Use this for initialization void Start () { // ResourcesフォルダからBoxプレハブを読み込み m_Box = Resources.Load("Box") as GameObject; m_Timer = 0; } // Update is called once per frame void Update () { m_Timer += Time.deltaTime; if (m_Timer > 1.0f) { Instantiate ( m_Box, new Vector3 (Random.Range (-5.0f, 5.0f), Random.Range (-5.0f, 5.0f), Random.Range (-5.0f, 5.0f)), Quaternion.identity); m_Timer = 0.0f; } } ⑧.スクリプト「BoxController」をゲームオブジェクト   「BoxController」に関連付けする ⑨.実行する   Boxが一定間隔で生成されていれば成功

前提条件、知識

Resourcesフォルダ

Assetsフォルダにあるリソースを読み込むためには 「Resourcesフォルダ」が必要です。 フォルダの作成はプロジェクトビューのAssets内で 右クリック => Create => Folderで作成できます。

as演算子

as演算子はC#の機能でダウンキャストを行う際に使用する演算子です。 基底クラスを派生クラスに型変換できたら、 そのままキャストが行われ、型変換で不可能な場合はnullを返します。 これによりダウンキャストが失敗した際のフリーズのリスクを 回避することが可能です。 書式: 派生クラス 変数名 = 基底クラス as 派生クラス 具体例: namespace AsTest { class Animal { public Animal() { } } class Dog : Animal { public Dog() {} } class Cat : Animal { public Cat() {} } class Program { static void Main(string[] args) { Cat test = new Cat(); // アップキャスト Animal animal = (Animal)test; // ダウンキャスト Cat cat = animal as Cat; // ダウンキャスト Dog dog = animal as Dog; string str = ""; if (cat != null) { str = "Catのダウンキャスト成功"; Console.WriteLine(); } else { str = "Catのダウンキャスト失敗"; } Console.WriteLine(str); if (dog != null) { str = "Dogのダウンキャスト成功"; } else { str = "Dogのダウンキャスト失敗"; } Console.WriteLine(str); while (true) ; } } } 実行結果: Catのダウンキャスト成功

ゲームオブジェクトをメンバ変数とし、Unity上で設定する

ゲームオブジェクトのメンバ変数を作成し、その変数に対して
Unity上でプレハブ、またはHierarchy上のゲームオブジェクトを指定することで
指定したゲームオブジェクトをスクリプト上でアクセスすることができます。

手順例

①.ゲームオブジェクトをPrefab化する Hierarchy上で「Cube」を作成し、「OriCube」とし、 プロジェクトビューのAssetsフォルダにD&Dする ②.動的作成を行うゲームオブジェクトを作成する 空のゲームオブジェクトを作成し、「CubeFactory」とする ③.スクリプトを作成する C#でスクリプトを作成し、名前を「CubeFactory」とする ④.ゲームオブジェクトのメンバを追加する CubeFactoryをエディタで開き、GameObject型のメンバ変数を作成する ※public必須 public GameObject m_CubeBase; ⑤.②で作成したオブジェクトにスクリプトを関連付ける ゲームオブジェクト「CubeFactory」にスクリプト「CubeFactory」を関連付ける ⑥.メンバ変数にゲームオブジェクトを関連付ける CubeFactoryオブジェクトのInspectorの「CubeFactory(Script)」の ゲームオブジェクトのメンバ変数に①で作成したPrefabを関連付ける 上記の流れを実行することで、ゲーム実行時に「CubeFactory」のメンバ変数には 「OriCube」が設定されているので、このメンバに対してアクセスすることが可能です。

注意点

Load関数を使用した場合やメンバ変数への指定でAssetsのプレハブを指定した場合の
注意点ですが、これらのオブジェクトはそのまま使用することはできません。
これらはオブジェクトはあくまで原本として扱い、Instantiateなどの生成関数で
複製してゲーム上(Hierarchy上)に実体化させる必要があります。
以下の処理はデータの初期設定を行うという意味では効果がありますが、
Hierarchy上に実体がないので画面上には一切効果を発揮していません。

例:
	Vector3 new_scale = new Vector3(2.0f, 1.0f, 1.0f);
	// コピー元の取得
	m_Box = Resources.Load("Box") as GameObject;
	m_Box.transform.localScale = new_scale;