とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

【Unity 入門】子オブジェクトとして生成して、回転させる

よくわからないタイトルになりましたが、
要はタイトル画面の背景として簡単なマップをジェネレートしたものを上空カメラがぐるぐる回る感じで
こんなマップだよ!と紹介したい訳です。

完成デモはこちら
タイトルとか入れたかったんだけど、時間が無かったのでマップをぐるぐる回す奴のみ。

1.floorオブジェクトの子としてマップを生成する
マップに関しては前にやったのでこちらを参照してください

でこのままだと回転させる時に複製したオブジェクトは回らない事になってしまうのでこれを
floorの下にCloneされたオブジェクトが入る様にしたいですなのでスクリプトを変更します

using UnityEngine;
using System.Collections;

public class TitleMapGenerator : MonoBehaviour {
	
	/**
	 * @public propaties
	 */
	public GameObject wallPrefab;
	public GameObject defaultWallPrefab;
	
	/**
	 * @private propaties
	 */
        //先に宣言しておく
	private GameObject clone;
	private GameObject floor;
	private int default_x_max = 19;
	private int default_z_max = 19;
	
	

	// Use this for initialization
	void Start () {
		//Floorを取得
		floor = GameObject.Find("floor");
		//initData
		string map_matrix  = "222000222000000000:222111222111110000:252000522000010000:000000010000011110:000000011000000010:000000001000000010:000000522200000010:000000222200000010:000000222200000010:000000255200000110:000000000000000100:000000000000001100:000000000000001000:000000000000001000:000000000000001000:000000000000022222:000000000000023222:000000000000022222";
		
		
		//wakucreate
		CreateMapWaku();
		
		// mapcreate
		CreateMap(map_matrix);
	}
	
	//CreateWaku
	void CreateMapWaku()
	{
		for(int dx = 0; dx <= default_x_max; dx++){
                        //複製したプレハブをGameObjectに型キャストして入れます
			clone = (GameObject) Instantiate(defaultWallPrefab, new Vector3(dx, 0, 0), Quaternion.identity);
                        //親オブジェクトの指定はこんな感じでできます。これを以下プレハブ複製箇所に全部適応
			clone.transform.parent = floor.transform;
			clone = (GameObject) Instantiate(defaultWallPrefab, new Vector3(dx, 0, default_z_max), Quaternion.identity);
			clone.transform.parent = floor.transform;
		}
		
		for(int dz = 0; dz <= default_z_max; dz++){
			clone = (GameObject) Instantiate(defaultWallPrefab, new Vector3(0, 0, dz), Quaternion.identity);
			clone.transform.parent = floor.transform;
			clone = (GameObject) Instantiate(defaultWallPrefab, new Vector3(default_x_max, 0, dz), Quaternion.identity);
			clone.transform.parent = floor.transform;
		}
		
	}
	
	//Createmap
	void CreateMap(string map_matrix)
	{
		string[] map_matrix_arr = map_matrix.Split(':');
		for(int x = 0; x < map_matrix_arr.Length; x++){
			string x_map = map_matrix_arr[x];
			for(int z = 0; z < x_map.Length; z++){
				int obj = int.Parse(x_map.Substring(z, 1));
				
				if(obj == 0){
					clone = (GameObject) Instantiate(wallPrefab, new Vector3(x + 1, 0, z  + 1), Quaternion.identity);
					clone.transform.parent = floor.transform;
				}
			}
		}
		
	}
}

そうするとこんな感じの階層でマップが出来上がります。

これで準備完了。


2.カメラを回すんじゃない、マップを回すんだ。
最初マップじゃなくてカメラ回そうと思ったんですけど、
それより断然カメラ位置を固定してマップを回した方が楽だよね。という事でマップを回す事にしました。

カメラをマップを見下ろせる適当な位置にセットして

マップを回転させるスクリプトをfloorにアタッチします。

using UnityEngine;
using System.Collections;

public class TitleCameraWork : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
                //これだけで回転する
		transform.Rotate(0, 25 * Time.deltaTime, 0);
	}
}

これでこんな感じで背景マップが回転します。
あとはロゴをNGUIで重ねたり、ログイン処理をここに入れたりし無いと行けないなぁ。。