ゲームオブジェクトの取得
概要
スクリプト内でゲームオブジェクトを取得する方法は
「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;