unity入門　その３

# 前回までのおさらい
- unity上にオブジェクトを配置する
- ユーザからの入力によりオブジェクトを操作
- こんな画面まで完成
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/98558/afa1b83b-e9f4-8cd3-6cdc-f27c460307e2.gif)

前回最後に話していた、停止すると２度と動かなくなってしまう問題は、

Edit -> Project Setting -> Physicsで開くInspectorから

![スクリーンショット 2016-02-06 8.29.08.png](https://qiita-image-store.s3.amazonaws.com/0/98558/914690db-f574-8f91-cd5c-bf09ab24cfc1.png)

Sleep Thresholdを０にすることで発生しなくなりました。
詳細は不明ですが、一定以下になるとスリープモードだかに入ってしまう
閾値らしくオブジェクトがスリープに入って動かなくなってたのか？

とりあえず、治ったから良いやというぐらいで、
先に進みます。

# 今日の目標
textからファイルを読み込んで、フィールド上に迷路をつくってみる。
以下参考にしたもの
　[Unity スクリプトからステージを作成](http://qiita.com/junya/items/8ebdbc3d167909f7be65)
　[GameObjectの階層位置を変更](http://ft-lab.ne.jp/cgi-bin-unity/wiki.cgi?page=unity_script_change_hierarchy_gameobject)


##　事前準備１
自動生性させる１つ分の壁と、転がる球をPrefabs化する。
今回は、自動生成で周囲の壁も合わせて作成するので、前回作成した、壁は取り除きました。



![スクリーンショット 2016-02-06 8.39.28.png](https://qiita-image-store.s3.amazonaws.com/0/98558/be741fc2-326e-2d0d-1a2e-107f7d22b009.png)

できたフォルダの名前を「Prefabs」に変更
![スクリーンショット 2016-02-06 8.41.14.png](https://qiita-image-store.s3.amazonaws.com/0/98558/15e4544f-a37b-f70c-748f-9fd311c56a21.png)


Prefabsの中に、球を入れてPrefab化します。

![スクリーンショット 2016-02-06 8.42.09.png](https://qiita-image-store.s3.amazonaws.com/0/98558/f81be9b3-f671-54c1-268c-c8f6a6466a24.png)


同様に、壁になる為のObjectを作ります。
フィールドを生成した時と同じようにして、立方体を生成

さすがに、もう覚えてきました。
![スクリーンショット 2016-02-06 8.45.17.png](https://qiita-image-store.s3.amazonaws.com/0/98558/b1d11a4a-0a50-ebf7-e6db-6346a5c35762.png)

Object名は[wall]としておきました。
球と同じように、Prefab化します。

壁を半透明にして、影のボールも見えるようにします。
壁用のMaterialを作成[wall]としました。
![スクリーンショット 2016-02-06 9.20.10.png](https://qiita-image-store.s3.amazonaws.com/0/98558/df5769aa-2e96-06f6-ade9-d9606d01f68d.png)

今回は、適当に[Sprites/Diffuse]を選択
![スクリーンショット 2016-02-06 9.20.54.png](https://qiita-image-store.s3.amazonaws.com/0/98558/bae767ef-2128-b116-eca2-7465487c226a.png)

カラーパレットで、一番下のAを調整することで、半透明にできます。

![スクリーンショット 2016-02-06 9.21.05.png](https://qiita-image-store.s3.amazonaws.com/0/98558/7037fd64-bffd-6d20-4593-b370dba8cafb.png)

Prefabsのwallを選択して、画像は、登録済みだったので半透明になってしまっています。
![スクリーンショット 2016-02-06 9.22.18.png](https://qiita-image-store.s3.amazonaws.com/0/98558/60012b15-fe0c-66aa-6053-b9ba907ce9d4.png)

materialを登録します。
![スクリーンショット 2016-02-06 9.22.48.png](https://qiita-image-store.s3.amazonaws.com/0/98558/7992d4ce-1511-f509-17df-2873400b0862.png)

#　ステージ読み込み用のスクリプト作成
ステージ読み込みには、C#を使いました。
*jsでもできますが、C#の方が楽そうなのでこっち使ってます。

いつものように、AssetsにC#スクリプトを生成、
ファイル名は、[creatStage]としてください。
![スクリーンショット 2016-02-06 9.25.30.png](https://qiita-image-store.s3.amazonaws.com/0/98558/2f06f374-7e30-afbc-ea40-9356bbfac8b3.png)

読み込み用ファイルを作ります。
[FileReadTest.txt]今回はこの名前で作成

```text:FileReadTest.txt
#########################
#p# #                #  #
# #                  #  #
#   #  # # ######### # ##
#####  # #     #     # ## 
#      #       #       ## 
#      ######  #   #### # 
#      #       #        # 
#              #        # 
#              #        # 
#                       #                                                                          
#                       #                                                                          
#       #               #                                                                          
#                       #                                                                          
#                       #                                                                          
#    ######             #                                                                        
#        #    ####      #                                                                          
#        #    #  #      #                                                                          
#     #  #    #  #      #                                                                          
#        #    #  #      #                                                                          
#        #    #  #      #                                                                          
#      # ######  #  #   #                                                                          
#                       #                                                                          
#                       #                                                                          
######################### 
```
25×25のマップに「＃」を壁、「p」が球を配置します。

```sharp:creatStage.cs
using UnityEngine;
using System.Collections;
using System.IO; //System.IO.FileInfo, System.IO.StreamReader, System.IO.StreamWriter
using System; //Exception
using System.Text; //Encoding


public class creatStage : MonoBehaviour {
	private string guitxt = "";
	public TextAsset textAsset;

	//配置するオブジェクト
	public GameObject block;
	public GameObject player;
	public GameObject parents;

	public Vector3 createPos;
	public Vector3 spaceScale = new Vector3(1.0f,1.0f,1.0f);

	// Use this for initialization
	void Start () {
		createPos = parents.transform.position - parents.transform.lossyScale * 0.5f + block.transform.lossyScale * 0.5f;
		createPos.z = parents.transform.lossyScale.z * 0.5f - block.transform.lossyScale.z * 0.5f;
		CreateStage(createPos);
		createPos = Vector3.zero;
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	void CreateStage(Vector3 pos){
		Vector3 originPos = pos;
		string stageTextData = textAsset.text;
		pos.y = 0;

		foreach(char c in stageTextData){

			GameObject obj = null;

			if(c == '#'){
				obj = Instantiate(block, pos, Quaternion.identity) as GameObject;
				obj.name = block.name;
				pos.x += obj.transform.lossyScale.x;

				obj.transform.parent = parents.transform;

			}else if(c == 'p'){
				obj = Instantiate(player, pos, Quaternion.identity) as GameObject;
				obj.name = player.name;
				pos.x += spaceScale.x;
			}else if(c == '\n'){
				pos.z -= spaceScale.z;
				pos.x = originPos.x;
				Debug.Log (spaceScale.z);
			}else if(c == ' '){
				pos.x += spaceScale.x;
			}
		}


	}

}

```

フィールド読み込み用のシェルをGameObjectに登録します。
空のobjectを作成

![スクリーンショット 2016-02-06 9.30.22.png](https://qiita-image-store.s3.amazonaws.com/0/98558/27eef850-d65f-39ef-c8c6-7ca78c34a7b9.png)


![スクリーンショット 2016-02-06 9.31.32.png](https://qiita-image-store.s3.amazonaws.com/0/98558/8c3c8bce-0787-5ae1-c410-99a30636d196.png)


これで、スタート時にファイル読み込みが実行されます。
読み込みに必要な、以下を設定
 - Text Asset -> FileReadTest.txt
 - Block -> Prefabsのwall
 - Player -> PrefabsのSphere
 - Parents -> Hierarcheのfield

こんな感じになります。
![スクリーンショット 2016-02-06 9.34.31.png](https://qiita-image-store.s3.amazonaws.com/0/98558/6df715ca-a508-38cf-65ab-cd090315adc5.png)


実行するとこんな感じになります。

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/98558/0151a947-9b9c-97a5-17e0-c236da04957c.gif)


FileReadTestを変更すると、生成されるフィールドも変更されます。