ここでは、Unityスクリプトを用いたGameObjectの基本的な操作方法として、GameObject名の変更や、座標・回転の指定、色の指定方法を説明します。
開発環境
- Unity 2019.4.1f1
GameObjectの準備
まず、ゲーム全体を管理するマネージャースクリプト(=空(カラ)のGameObjectにアタッチしたスクリプト)を作成しましょう。
次に、マネージャースクリプト上でGameObjectを取得し、変数として保持しておきます。
Hierarchyビューに存在するGameObjectをスクリプトから検索するには、GameObjectクラスのFindメソッドを使用しましょう。例えばCubeSampleというGameObjectを取得するなら、次のようにします。
GameObject gameObject = GameObject.Find("CubeSample");
GameObjectからのComponentの取得
そのGameObjectのGetComponentメソッドを用いることで、アタッチされたComponentを取得することができます。
例えば、GameObjectのインスタンス(gameObject)から、そのComponentのうちRendererを取得する場合は次のようにします。
Renderer renderer = gameObject.GetComponent<Renderer>();
GameObjectの操作
GameObject名の取得・変更
GameObjectの名前はObjectクラスから継承したnameフィールドに格納されています。
GameObjectのインスタンス(gameObject)からの名前の取得・変更はそれぞれ次のようになります。
//gameObjectの名前を取得して、コンソールに表示する
Debug.Log(gameObject.name);
//gameObjectの名前をnewObjectNameに設定する
gameObject.name = "newObjectName";
GameObjectの座標・回転を指定する
GameObjectの座標・回転はGameObjectにアタッチされたTransformに格納されています。通常はスクリプトからGameObjectにアタッチされたComponentを取得する際はGetComponentメソッドを用いますが、TransformはすべてのGameObjectにアタッチされている基本的なComponentであるため、GameObjectクラスにtransformフィールドとして用意されています。
なお、そのComponentがアタッチされたGameObjectのTransformは、Componentクラスのtransformフィールドで取得することもできます。
GameObjectの座標の指定
TransformクラスのpositionフィールドにVector3構造体のインスタンスを指定することで座標を指定します。
例えば、Cubeのプリミティブオブジェクトを生成し、座標を(1, 0, 0)に指定するには次のようにします。
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.position = new Vector3(1, 0, 0);
GameObjectの回転の指定
GameObjectの回転はTransformクラスのrotationフィールドにQuaternion構造体のインスタンスを指定することで指定します。UnityのInspector上で表示される回転角と同じ数値をスクリプト上から指定するには、Quaternion構造体のEulerメソッドで3次元ベクトルを指定します。
例えば、Cubeのプリミティブオブジェクトを生成し、その回転を(45, 0, 0)に指定するには次のようにします。
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.rotation = Quaternion.Euler(45, 0, 0);
GameObjectの色を変える
GameObjectの色はアタッチされているMesh RendererのMaterialsの中で指定されています。スクリプト上で操作するには、まずGetComponentメソッドで、アタッチされているRendererのインスタンスを取得します。RendererクラスのmaterialフィールドにMaterialインスタンスが格納されているので、そのcolorフィールドで色を指定します。なお、色の指定はColor構造体のインスタンスで行います。
例えば、Cubeのプリミティブオブジェクトを生成し、その色を赤に指定するには次のようにします。
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.GetComponent<Renderer>().material.color = Color.red;
まとめ
それでは、以上のことをまとめて、座標と回転、色を変化させた4個のCubeオブジェクトを表示するスクリプトを作成してみましょう。
ゲーム全体を管理するマネージャースクリプトを以下のようにします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Manager : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
GameObject obj1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj1.name = "Cube1";
obj1.transform.position = new Vector3(-3, 0, 0);
obj1.transform.rotation = Quaternion.Euler(10, 0, 0);
obj1.GetComponent<Renderer>().material.color = Color.red;
GameObject obj2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj2.name = "Cube2";
obj2.transform.position = new Vector3(-1, 0, 0);
obj2.transform.rotation = Quaternion.Euler(20, 0, 0);
obj2.GetComponent<Renderer>().material.color = Color.blue;
GameObject obj3 = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj3.name = "Cube3";
obj3.transform.position = new Vector3(1, 0, 0);
obj3.transform.rotation = Quaternion.Euler(30, 0, 0);
obj3.GetComponent<Renderer>().material.color = Color.green;
GameObject obj4 = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj4.name = "Cube4";
obj4.transform.position = new Vector3(3, 0, 0);
obj4.transform.rotation = Quaternion.Euler(40, 0, 0);
obj4.GetComponent<Renderer>().material.color = Color.yellow;
}
// Update is called once per frame
void Update()
{
}
}
ゲームを再生すると、以下のように4個のCubeオブジェクトが作成されます。
コメント