マップ生成時のfor文の処理について
2Dゲームでマップ生成時に縦11横18の文字コード × 9 回を読み込んでfor文を回してマップを生成したのですが、ビルドしたら
マップが生成されなかったのですが、これは処理が間に合わなかったということでしょうか。
処理順を変えたら、プレイヤーが生成される時とされない時があったので、恐らく処理が間に合わなかったのだと思います。
また、読み終わるまで処理を続けたいのですが、どうすればよろしいでしょうか。
考えていることは、
・スクリプトを9個に分けて個々で処理をさせる
・描画するマップ位置のみ生成する(書いてきたコードがすべて破綻してしまうので厳しいです)
しか思いつきません
他に良い方法はないでしょうか。
ものすごい長いですが
定義(特に見る必要はなし)
C#
1コード 2 /// <summary> 3 /// イベントブロック説明をJsonから取得します 4 /// </summary> 5 JsonInfo ji; 6 7 /// <summary> 8 /// 生成する初期位置 9 /// </summary> 10 readonly Vector2 createInitPos = new Vector2(-8.5f, 5.5f); 11 12 #region 生成するオブジェクト 13 14 #region ステージごとに変わるタイル 15 16 //----------WALL----------// 17 [Header("Wall")] 18 /// <summary> 19 /// 壁 20 /// </summary> 21 [SerializeField] WallsClass[] wc; 22 23 //----------BackGround----------// 24 [Header("BackGround")] 25 /// <summary> 26 /// 背景 27 /// </summary> 28 [SerializeField] BackGroundClass[] bc; 29 30 //----------Decoration----------// 31 [Header("Decoration")] 32 /// <summary> 33 /// 装飾 34 /// </summary> 35 [SerializeField] DecorationClass[] dc; 36 37 #endregion 38 39 #region 全ステージ共通のタイル 40 41 //----------PLAYER ENEMY GOAL----------// 42 [Header("Player/Goal")] 43 /// <summary> 44 /// プレイヤー 45 /// </summary> 46 [SerializeField] GameObject player; 47 [SerializeField] GameObject goal; 48 [Header("Enemy")] 49 /// <summary> 50 /// エネミー 51 /// </summary> 52 [SerializeField] GameObject[] enemy; 53 54 //----------JUMP----------// 55 [Header("Jump")] 56 /// <summary> 57 /// 初期位置 58 /// </summary> 59 [SerializeField] GameObject initPos; 60 61 /// <summary> 62 /// ジャンプ台 63 /// </summary> 64 [SerializeField] GameObject[] jumpObj; 65 66 //----------EventItem----------// 67 [Header("EventItem")] 68 [SerializeField] GameObject[] item; 69 70 //----------EventBlock----------// 71 [Header("EventBlock")] 72 [SerializeField] GameObject[] block; 73 74 //----------EventBlock----------// 75 [Header("Move")] 76 [SerializeField] GameObject moveObj; 77 [SerializeField] GameObject[] catArrow; 78 79 #endregion 80 81 #endregion 82 83 /// <summary> 84 /// 各ステージフロア作成 85 /// </summary> 86 /// <param name="tileNum">タイルナンバー</param> 87 /// <param name="pos">生成位置</param> 88 /// <param name="floor">生成元の親オブジェクト</param> 89 /// <param name="floorNum">現在のフロア数</param> 90 delegate void TileMap(string tileNum, Vector2 pos, GameObject floor, int floorNum); 91 TileMap[] tileList; 92 TileMap tile; 93 readonly string[] pathName = { "Wall", "PlayerGoal", "Enemy", "Jump", "Move", "EventItem", "EventBlock", "BackGround", "Decoration" }; 94 /// <summary> 95 /// 生成カウント 96 /// </summary> 97 int counter = 0; 98 /// <summary> 99 /// 矢印用カウンタ― 100 /// </summary> 101 int arrowCounter = 0; 102 /// <summary> 103 /// ステージ番号 104 /// ステージ選択時にセットします 105 /// </summary> 106 static int fileNum = 0; 107 /// <summary> 108 /// ステージ内のフロア数 109 /// </summary> 110 readonly static int[] floorCount = { 3, 8 }; 111 /// <summary> 112 /// 現在のステージのフロア数を返します 113 /// </summary> 114 public static int FloorCount 115 { 116 get 117 { 118 return floorCount[fileNum]; 119 } 120 } 121 122 /// <summary> 123 /// 各ステージのX,Y長さ 124 /// </summary> 125 readonly Vector2[] stageVec = { new Vector2(19 - 1, 11 + 1), new Vector2(20 - 1, 11) }; 126 127 /// <summary> 128 /// 横のステージのフロア数 129 /// </summary> 130 readonly static int[] stageX = { 3, 4 }; 131 public static int StageX 132 { 133 get 134 { 135 return stageX[fileNum]; 136 } 137 } 138 139 /// <summary> 140 /// ステージ番号 141 /// </summary> 142 public static string stageID = ""; 143
Awake時、読み込む関数を格納
CreateStage()
フロアによって位置を変えて各フロアの位置を出します
C#
1コード 2 private void Awake() 3 { 4 //ステージ番号のステージを作成します 5 fileNum = GameManager.Instance.StageNo; 6 //fileNum = 0; 7 8 //現在のステージ番号を指定します 9 stageID = string.Format("stage{0}", fileNum + 1); 10 11 ji = new JsonInfo(); 12 ji.MapJson(); 13 14 tileList = new TileMap[] 15 { 16 SwicthWALL,//壁を生成 17 SwitchPlayerGoal,//プレイヤーとゴールを生成 18 SwitchEnemy,//敵を生成 19 SwitchJump,//ジャンプ台を生成 20 SwitchMove,//フロア移動 21 SwitchEventItem,//イベントアイテムを生成 22 SwitchEventBlock,//イベントブロックを生成 23 SwitchBack,//背景生成 24 SwitchDecoration//デコレーション生成 25 }; 26 27 //ステージ作成 28 CreateStage(); 29 30 //オブジェクトを破棄します 31 //Destroy(gameObject); 32 } 33 34 #region マップ生成読み込み 35 36 /// <summary> 37 /// ステージの作成 38 /// </summary> 39 void CreateStage() 40 { 41 //CSVからデータを読み込む 42 for (int sNum = 0; sNum < FloorCount; sNum++) 43 { 44 //余りが横 45 float stageVecX = sNum % StageX; 46 //商が縦 47 float stageVecY = sNum / StageX; 48 49 var vec = Vector2.zero; 50 //このステージの横縦長さ * ステージのx(横のフロア)とy(縦のフロア)の何番目か + 作成する初期位置 51 vec.x = stageVec[fileNum].x * stageVecX + createInitPos.x; 52 vec.y = (-stageVec[fileNum].y) * stageVecY + createInitPos.y; 53 54 55 //ステージを格納する空のオブジェクトを作成(フロアごとに分けてここに入れます) 56 var obj = Resources.Load<GameObject>("StageEmpty"); 57 var floor = Instantiate(obj, transform.position, Quaternion.identity); 58 floor.name = sNum.ToString(); 59 60 for (int i = 0; i < tileList.Length; i++) 61 { 62 var stageNo = fileNum + 1; 63 var filePath = string.Format("Stage/Stage{0}/{1}/{2}", stageNo, sNum + 1, pathName[i]); 64 CSVRead(filePath, i, floor, vec, sNum); 65 } 66 } 67 }
CSVRead() CSVからの読み込み(JSON)
C#
1コード 2 /// <summary> 3 /// CSVファイルの読み込み 4 /// </summary> 5 void CSVRead(string stageTagName, int num, GameObject floor, Vector2 createPos, int floorNum) 6 { 7 //csvファイルの検索 8 var csvFile = Resources.Load(stageTagName) as TextAsset; 9 10 if (csvFile == null) return; 11 12 //csvファイルの読み込み 13 var reader = new StringReader(csvFile.text); 14 15 //数字文字を解析しステージを作成します 16 StringMozi(reader, num, floor, createPos, floorNum); 17 }
StringMozi() CSVの文字 (例え)横11行縦18列の読み込み
C#
1コード 2 /// <summary> 3 /// ファイルの内の","で文字を区切ります 4 /// </summary> 5 void StringMozi(StringReader reader, int num, GameObject floor, Vector2 createPos, int floorNum) 6 { 7 var pos = createPos; 8 tile = tileList[num]; 9 //読み取り対象がなくなるまで繰り返します 10 while (reader.Peek() != -1) 11 { 12 //一行づつ読み込みます 13 string line = reader.ReadLine(); 14 15 string[] split = line.Split(',');//,で区切ります 16 foreach (var tileNum in split) 17 { 18 //現在の作成物 19 tile(tileNum, pos, floor, floorNum); 20 //生成位置を変更します 21 pos.x += 1; 22 } 23 //xを初期位置yを-1下げたところから生成を再開しします 24 pos.x = createPos.x; 25 pos.y -= 1; 26 } 27 //生成カウントの初期化 28 counter = 0; 29 arrowCounter = 0; 30 }
もしかしたら、JSONのデータから値を割り当てる際にUnity上では正常に動いていたけど、ビルドすると壊れることが起こっているのかもしれません。
フロア生成順の際にJsonから参照するブロックを生成したときにブロックのみ生成されてそこでfor文が死んだような現象が起こったので、わからないですが。。
SwicthWALL,//壁を生成
SwitchPlayerGoal,//プレイヤーとゴールを生成
SwitchEnemy,//敵を生成
SwitchJump,//ジャンプ台を生成
SwitchMove,//フロア移動
この順番だと、Moveまで生成されます。しかし、EnemyやMoveもJsonを参照しているので訳が分かりません。
回答1件
あなたの回答
tips
プレビュー