前回までのおさらい
前回最後に話していた、停止すると2度と動かなくなってしまう問題は、
Edit -> Project Setting -> Physicsで開くInspectorから
Sleep Thresholdを0にすることで発生しなくなりました。
詳細は不明ですが、一定以下になるとスリープモードだかに入ってしまう
閾値らしくオブジェクトがスリープに入って動かなくなってたのか?
とりあえず、治ったから良いやというぐらいで、
先に進みます。
今日の目標
textからファイルを読み込んで、フィールド上に迷路をつくってみる。
以下参考にしたもの
Unity スクリプトからステージを作成
GameObjectの階層位置を変更
事前準備1
自動生性させる1つ分の壁と、転がる球をPrefabs化する。
今回は、自動生成で周囲の壁も合わせて作成するので、前回作成した、壁は取り除きました。
Prefabsの中に、球を入れてPrefab化します。
同様に、壁になる為のObjectを作ります。
フィールドを生成した時と同じようにして、立方体を生成
Object名は[wall]としておきました。
球と同じように、Prefab化します。
壁を半透明にして、影のボールも見えるようにします。
壁用のMaterialを作成[wall]としました。
カラーパレットで、一番下のAを調整することで、半透明にできます。
Prefabsのwallを選択して、画像は、登録済みだったので半透明になってしまっています。
ステージ読み込み用のスクリプト作成
ステージ読み込みには、C#を使いました。
*jsでもできますが、C#の方が楽そうなのでこっち使ってます。
いつものように、AssetsにC#スクリプトを生成、
ファイル名は、[creatStage]としてください。
読み込み用ファイルを作ります。
[FileReadTest.txt]今回はこの名前で作成
#########################
#p# # # #
# # # #
# # # # ######### # ##
##### # # # # ##
# # # ##
# ###### # #### #
# # # #
# # #
# # #
# #
# #
# # #
# #
# #
# ###### #
# # #### #
# # # # #
# # # # # #
# # # # #
# # # # #
# # ###### # # #
# #
# #
#########################
25×25のマップに「#」を壁、「p」が球を配置します。
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を作成
これで、スタート時にファイル読み込みが実行されます。
読み込みに必要な、以下を設定
- Text Asset -> FileReadTest.txt
- Block -> Prefabsのwall
- Player -> PrefabsのSphere
- Parents -> Hierarcheのfield
実行するとこんな感じになります。
FileReadTestを変更すると、生成されるフィールドも変更されます。