Edited at

UnityをC#で超入門してみる #2 ゲームオブジェクトの章

More than 1 year has passed since last update.

UnityをC#で超入門してみる #1 Unity入門の章

http://qiita.com/hiroyuki_hon/items/0718a50e6569b6c5037a

の続きです。


目次 超入門#2 ゲームオブジェクトの章

カメラ・移動・変形・削除・色・やりとり

継承関係

Object → GameObject

Object → Component  → Behaviour


カメラ

 カメラを調整しよう

 カメラでターゲットを追ってみよう


ゲームオブジェクト

 ゲームオブジェクトの情報を取得しよう

 スクリプトの有効、無効を設定してみよう

 ゲームオブジェクトのタグをチェックしよう

 Find()でゲームオブジェクトを取得しよう

 スクリプトでコンポーネントを追加しよう

 スクリプトからプリミティブオブジェクトを生成しよう

  違うプリミティブオブジェクトを表示してみよう

 スクリプトでオブジェクトのtransformを取得しよう

  個別にx,y,zの値を取得しよう

 移動させてみよう

 Cubeを回転させ、Inspectorから数値を変更しよう

 ゲームオブジェクトを削除しよう

  自分自身(スクリプト)を削除しよう

  一定時間後に削除されるようにしよう

 スクリプト色を付けよう

  色をRGBAで指定しよう

  ランダムに色をつけてみよう

 他のオブジェクトとのやりとりについて

 自身と違うオブジェクトを取得して操作しよう

 インスタンスを生成しよう

  nameについて

 ここまでをまとめ

 ボタンクリックでインスタンスを生成しよう

 画面外に出たインスタンスは削除しよう

  WebCamTextureを使ってみよう

 ゲームオブジェクトを無限に生成しよう

 ゲームオブジェクトを回転させよう

 ボタン押下でゲームオブジェクトを回転させよう

 x秒後にゲームオブジェクトを破棄しよう

 カラーを指定してマテリアルを生成しよう

 プレハブをスクリプトから生成しよう

 触れたものを破壊するオブジェクトを作ろう


カメラ


カメラを調整しよう

Sceneビューでカメラの向きを決めます。

カメラを選択状態にして、

GameObject > Align With View

でカメラをSceneビューの視点に設定できます。


カメラでターゲットを追ってみよう

例えば.LookAtを用いることでカメラなりの向きを追従させることが出来ます。

public Transform target;

void Update () {
transform.LookAt (target);
}
}


ゲームオブジェクト

Unityは一つ一つの塊をゲームオブジェクトと呼びます。

ゲームオブジェクトにコンポーネントをつけることで

様々な挙動をさせることが出来ます。

ゲームオブジェクトを人、コンポーネントを帽子や

アクセサリーに例えると理解が進みます。


ゲームオブジェクトの情報を取得しよう

主な変数

transform

rigidbody

camera

renderer

audio

guiText

collider

gameobject

tag

    void Start () {

print(gameObject.transform);
print(gameObject.audio);
print(gameObject.guiText);
print(gameObject.gameObject);
print(gameObject.tag);
}
//頭のgameObject.は省略可能


スクリプトの有効、無効を設定してみよう

変数、enabled を操作することで

スクリプトの有効、無効を設定できます。

    void Start () {

print(enabled);

enabled = false;

print(enabled);

/*出力 True
エディタのゲームオブジェクトのスクリプトのチェックが外れる
*/
出力 False
}


ゲームオブジェクトのタグをチェックしよう

CompareTag()を用います。

//タグがblockだったらコンソールにblockを出す。

if(CompareTag("block")){
print("block");
}


Find()でゲームオブジェクトを取得しよう

Find()を用いることで"ゲームオブジェクト名"から

ゲームオブジェクトを取得できます。

適当なPlaneを作ったとします。


//適当なGameObject型の変数 gを作成
public GameObject g;
void Start () {

//g に最初に見つかった名前が Plane のゲームオブジェクトを取得する
g = GameObject.Find("Plane");

print ( g );
print ( g.audio);
//出力 Plane
//出力 null
}


スクリプトでコンポーネントを追加しよう

例えばScript2を作成してScript1に追加するとします。

以下のようにすることでStart時にScript1にScript2が追加され、

Script2が実行されます。

    void Start () {

gameObject.AddComponent<Script2>();
}


スクリプトからプリミティブオブジェクトを生成しよう

GameObject cube1 = GameObject.CreatePrimitive(PrimitiveType.Cube); と書いてみます。



空のゲームオブジェクトを作って、これにつけて再生すると出ます。


違うプリミティブオブジェクトを表示してみよう

.Cubeを.Sphere に書き換えてみます。



出ました。



このようにしてプリミティブオブジェクトをスクリプトで生成することが可能です。


スクリプトでオブジェクトのtransformを取得しよう

Unity内の全てのオブジェクトはtransformというプロパティを持っており、

これから位置や角度等を取得することが可能です。

例えばこう書きます。

Debug.Log(transform.position);



このスクリプトをつけて再生すると、transform.position がコンソールに出力されます。

このようになります。

Inspectorにあるtransformの数値の簡略化されたものが表示されています。


個別にx,y,zの値を取得しよう

個別にx,y,zの値を取得することも可能です。

Debug.Log(transform.localPosition.x);

Debug.Log(transform.localPosition.y);

Debug.Log(transform.localPosition.z); と書きます。

すると、このように別々に取得出来ます。


移動させてみよう

こう書きます。



これを貼り付けると移動します。

矢印キーで動かしてみます。

    public float x = 0.0f;

public float z = 0.0f;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

if (Input.GetKey(KeyCode.RightArrow)) {
x = 0.2f;
z = 0.0f;

}
if (Input.GetKey(KeyCode.LeftArrow)) {
x = -0.2f;
z = 0.0f;
}

transform.Translate(x, 0, 0, Space.World);

if (Input.GetKey(KeyCode.UpArrow)) {
z = 0.2f;
x = 0.0f;

}
if (Input.GetKey(KeyCode.DownArrow)) {
z = -0.2f;
x = 0.0f;
}

transform.Translate(0, 0, z, Space.World);


Cubeを回転させ、Inspectorから数値を変更しよう

Cubeを生成し、

transform.Rotate(0, 1, 0); とスクリプトを書きます。



回ります。

Inspectorから数値を変更出来るようにします。

このように書いてみます。

public float x = 0;

public float y = 0;

public float z = 0;

void Update () {

transform.Rotate(x, y, z);



するとInspectorから数値を入力できるようになります。

こうなっています。


スクリプトでゲームオブジェクトを削除しよう

ゲームオブジェクトを削除します。

Destroy(gameObject);



プリミティブのシリンダーを試しに作り、

Destroy(gameObject); のスクリプトを付けます。

これを再生すると、



消えます。


自分自身(スクリプト)を削除しよう

Destroy(this);

これが消えます。


一定時間後に削除されるようにしよう

一定時間後にに消えるように指定します。

以下のように書くと5.0秒で消えます。

5.0の部分を書き換えることで時間を指定出来ます。

Destroy(gameObject, 5.0f);


スクリプトで色を付けよう

試しにCylinderを作成します。

create > Cylinder です。

renderer.material.color = Color.red; と書きます。



こうなります。


色をRGBAで指定しよう

色はRGBAを0.0~1.0の値で指定します。

型はfloat型です。

第四引数を指定しない場合は、α値が1.0となります。

例えばこう書きます。

Color col = new Color(0.0f, 0.0f, 0.0f, 1.0f);

renderer.material.color = col;



とすると黒になります。

緑にしたい場合は

RGBAですから第二引数を1にすれば良いので

Color col = new Color(0, 1, 0, 1);

renderer.material.color = col; と書いてみます。

するとこうなります。


ランダムに色をつけてみよう

Color rand = new Color(Random.value, Random.value, Random.value, 1.0f);

renderer.material.color = rand;

と、書いてみます。

randが変数名です。



ランダムに色が付きます。






他のオブジェクトとのやりとりについて

GetComponent()や、SendMessage("関数名")を用います。


自身と違うオブジェクトを取得して操作しよう

では名前を利用します。

スクリプトは自分自身をgameObjectから取得できました。

では自身と違うオブジェクトを取得するにはどうすれば良いでしょうか。

まずCubeと空のゲームオブジェクトを作ってみます。

このように書きます。

GameObject kaiten;

void Start () {}に

kaiten = GameObject.Find("Cube");

void Update () {}に

kaiten.transform.Rotate(0, 1, 0);

こうなります。

そしてこれを空のゲームオブジェクトに貼付ます。

そして再生をすると



回ります。

回転の制御は

kaiten.transform.Rotate(0, 1, 0); です。

このように GameObject.Find("名前"); を用いることで

自分自身以外のオブジェクトから操作を行うことが可能になります。


インスタンスを生成しよう

ゲームオブジェクトに、

このように書いたものをつけて再生してみます。

GameObject obj1 = new GameObject();

obj1.name = "neko";

GameObject obj2 = new GameObject("inu");

GameObject obj3 = new GameObject();

するとこれが、

こうなります。

inu と neko と New Game Object のゲームオブジェクト生成されています。

このことから、インスタンスを生成した時、

後から名前をつける(obj1.name = "neko";)ことも可能であるし、

同時に名前を付けることも出来るし、名無しで生成することも可能であることが分かります。


nameについて

ところで、ゲームオブジェクトの名前については

nameで取得出来ます。

今まではDebug.Logを用いてきましたが、今回はprintを使用してみます。

printも文字列などの表示に使えます。

print(name); と書いたスクリプトをMainCameraとCubeにつけてみます。



名前が取得出来ました。


ここまでをまとめ

さてそれでは、ここまでを一度まとめます。

プロジェクトを新規に開きます。

ここまでのものを詰め込んで色々と作ってみます。

再生するとこうなりました。



Cubeが回転したり、ランダムで色が付いたり、スクリプトでオブジェクトが生成されたり、

時間が経つとオブジェクトが消えたり、コンソールに文字列が表示されたりといったことが

出来るようになりました。


ボタンクリックでインスタンスを生成しよう

GameObjectのターゲットを作成しCubePrefabをエディタから設定します。

Input.GetMouseButtonDown(0) 0=左クリックでインスタンスを生成します。

Rigidbodyを付けておくことで自動落下します。

public GameObject CubePrefab;

// Update is called once per frame
void Update () {
if(Input.GetMouseButtonDown(0)){
Instantiate(CubePrefab);
}
}
}


画面外に出たインスタンスは削除しよう

OnBecameInvisible()のオーバーライド関数を使うことで

カメラの不可視状態になった時の処理を表現出来ます。

Cubeのプレハブにつけることで、クリックで生成したオブジェクトを

カメラから外れたら自動で破棄することが出来ます。

//カメラから不可視になったら

void OnBecameInvisible(){
//デストロイ
Destroy(gameObject);
}

WebCamTextureを使うことで

カメラの映像をゲームオブジェクトに貼り付けることが出来ます。

    void Start () {

WebCamTexture webcamTexture = new WebCamTexture();
renderer.material.mainTexture = webcamTexture;
webcamTexture.Play();
}


ゲームオブジェクトを無限に生成しよう


using UnityEngine;
using System.Collections;

//指定したゲームオブジェクトを無限スポーンさせるスクリプト
public class InfinitySpawn : MonoBehaviour
{

//発生するオブジェクトをInspectorから指定する用
public GameObject spawnObject;
//発生間隔用
public float interval = 3.0f;

void Start () {
//コルーチンの開始
StartCoroutine("Spawn");
}

IEnumerator Spawn() {
//無限ループの開始
while(true){
//自分をつけたオブジェクトの位置に、発生するオブジェクトをインスタンス化して生成する
Instantiate(spawnObject, transform.position, Quaternion.identity);
yield return new WaitForSeconds(interval);
}
}

}


ゲームオブジェクトを回転させよう


//つけたゲームオブジェクトを回転させるスクリプト
public class TransformRotate : MonoBehaviour {

public float rotateX = 0.0f,
rotateY = 1.0f,
rotateZ = 0.0f;

void Update ()
{
transform.Rotate(rotateX, rotateY, rotateZ);
}
}


ボタン押下でゲームオブジェクトを回転させよう

public class GetMouseButtonRotate : MonoBehaviour {

public int mouseButtonDownSetting = 1;

public float rotateAngleX = 0;
public float rotateAngleY = 90;
public float rotateAngleZ = 0;

void Update ()
{
if ( Input.GetMouseButtonDown(mouseButtonDownSetting) )
{
transform.Rotate(rotateAngleX, rotateAngleY, rotateAngleZ);
}
}
}


x秒後にゲームオブジェクトを破棄しよう


public class GameObjectDestroy : MonoBehaviour
{
public float desTime = 3.0f;

void Start()
{
//3.0秒後にゲームオブジェクトを破棄する
Destroy(gameObject, desTime);
}
}


カラーを指定してマテリアルを生成しよう


public class ColorMaterialMake : MonoBehaviour
{
void Start ()
{
//0.0f~1.0fで指定 Color(R,G,B,α);
Color col = new Color(0.0f, 0.0f, 1.0f, 1.0f);
renderer.material.color = col;
}
}


プレハブをスクリプトから生成しよう


public class PrefabInstantiateCS : MonoBehaviour
{
public GameObject PrefabX;

void Start ()
{
Instantiate(this.PrefabX, new Vector3(0, 0, 0), Quaternion.identity);
}
}


触れたものを破壊するオブジェクトを作ろう


public class UnityOnTriggerEnterDestroyCS : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Destroy(gameObject);
}
}


つづきます

UnityでC#を超入門してみる #3 計算の章

http://qiita.com/hiroyuki_hon/items/3326206dcedb4e5013d4