teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

タグの追加

2021/03/07 12:45

投稿

BRAK
BRAK

スコア98

title CHANGED
File without changes
body CHANGED
File without changes

5

中身の修正

2021/03/07 12:45

投稿

BRAK
BRAK

スコア98

title CHANGED
File without changes
body CHANGED
@@ -307,4 +307,4 @@
307
307
  この順番だと、Moveまで生成されます。しかし、EnemyやMoveもJsonを参照しているので訳が分かりません。
308
308
 
309
309
 
310
- ![イメージ説明](fab8b613a487d50b428ed4d458800465.png)
310
+ ![イメージ説明](4982ec700671807d77313f92e8c359a4.png)

4

中身の修正

2021/03/07 12:19

投稿

BRAK
BRAK

スコア98

title CHANGED
File without changes
body CHANGED
@@ -304,4 +304,7 @@
304
304
  SwitchJump,//ジャンプ台を生成
305
305
  SwitchMove,//フロア移動
306
306
 
307
- この順番だと、Moveまで生成されます。しかし、EnemyやMoveもJsonを参照しているので訳が分かりません。
307
+ この順番だと、Moveまで生成されます。しかし、EnemyやMoveもJsonを参照しているので訳が分かりません。
308
+
309
+
310
+ ![イメージ説明](fab8b613a487d50b428ed4d458800465.png)

3

中身の修正

2021/03/07 10:48

投稿

BRAK
BRAK

スコア98

title CHANGED
File without changes
body CHANGED
@@ -292,4 +292,16 @@
292
292
  counter = 0;
293
293
  arrowCounter = 0;
294
294
  }
295
- ```
295
+ ```
296
+
297
+ もしかしたら、JSONのデータから値を割り当てる際にUnity上では正常に動いていたけど、ビルドすると壊れることが起こっているのかもしれません。
298
+
299
+ フロア生成順の際にJsonから参照するブロックを生成したときにブロックのみ生成されてそこでfor文が死んだような現象が起こったので、わからないですが。。
300
+
301
+       SwicthWALL,//壁を生成
302
+ SwitchPlayerGoal,//プレイヤーとゴールを生成
303
+ SwitchEnemy,//敵を生成
304
+ SwitchJump,//ジャンプ台を生成
305
+ SwitchMove,//フロア移動
306
+
307
+ この順番だと、Moveまで生成されます。しかし、EnemyやMoveもJsonを参照しているので訳が分かりません。

2

中身の修正

2021/03/07 10:42

投稿

BRAK
BRAK

スコア98

title CHANGED
File without changes
body CHANGED
@@ -12,4 +12,284 @@
12
12
  ・描画するマップ位置のみ生成する(書いてきたコードがすべて破綻してしまうので厳しいです)
13
13
  しか思いつきません
14
14
 
15
- 他に良い方法はないでしょうか。
15
+ 他に良い方法はないでしょうか。
16
+
17
+ ものすごい長いですが
18
+
19
+ 定義(特に見る必要はなし)
20
+ ```C#
21
+ コード
22
+ /// <summary>
23
+ /// イベントブロック説明をJsonから取得します
24
+ /// </summary>
25
+ JsonInfo ji;
26
+
27
+ /// <summary>
28
+ /// 生成する初期位置
29
+ /// </summary>
30
+ readonly Vector2 createInitPos = new Vector2(-8.5f, 5.5f);
31
+
32
+ #region 生成するオブジェクト
33
+
34
+ #region ステージごとに変わるタイル
35
+
36
+ //----------WALL----------//
37
+ [Header("Wall")]
38
+ /// <summary>
39
+ /// 壁
40
+ /// </summary>
41
+ [SerializeField] WallsClass[] wc;
42
+
43
+ //----------BackGround----------//
44
+ [Header("BackGround")]
45
+ /// <summary>
46
+ /// 背景
47
+ /// </summary>
48
+ [SerializeField] BackGroundClass[] bc;
49
+
50
+ //----------Decoration----------//
51
+ [Header("Decoration")]
52
+ /// <summary>
53
+ /// 装飾
54
+ /// </summary>
55
+ [SerializeField] DecorationClass[] dc;
56
+
57
+ #endregion
58
+
59
+ #region 全ステージ共通のタイル
60
+
61
+ //----------PLAYER ENEMY GOAL----------//
62
+ [Header("Player/Goal")]
63
+ /// <summary>
64
+ /// プレイヤー
65
+ /// </summary>
66
+ [SerializeField] GameObject player;
67
+ [SerializeField] GameObject goal;
68
+ [Header("Enemy")]
69
+ /// <summary>
70
+ /// エネミー
71
+ /// </summary>
72
+ [SerializeField] GameObject[] enemy;
73
+
74
+ //----------JUMP----------//
75
+ [Header("Jump")]
76
+ /// <summary>
77
+ /// 初期位置
78
+ /// </summary>
79
+ [SerializeField] GameObject initPos;
80
+
81
+ /// <summary>
82
+ /// ジャンプ台
83
+ /// </summary>
84
+ [SerializeField] GameObject[] jumpObj;
85
+
86
+ //----------EventItem----------//
87
+ [Header("EventItem")]
88
+ [SerializeField] GameObject[] item;
89
+
90
+ //----------EventBlock----------//
91
+ [Header("EventBlock")]
92
+ [SerializeField] GameObject[] block;
93
+
94
+ //----------EventBlock----------//
95
+ [Header("Move")]
96
+ [SerializeField] GameObject moveObj;
97
+ [SerializeField] GameObject[] catArrow;
98
+
99
+ #endregion
100
+
101
+ #endregion
102
+
103
+ /// <summary>
104
+ /// 各ステージフロア作成
105
+ /// </summary>
106
+ /// <param name="tileNum">タイルナンバー</param>
107
+ /// <param name="pos">生成位置</param>
108
+ /// <param name="floor">生成元の親オブジェクト</param>
109
+ /// <param name="floorNum">現在のフロア数</param>
110
+ delegate void TileMap(string tileNum, Vector2 pos, GameObject floor, int floorNum);
111
+ TileMap[] tileList;
112
+ TileMap tile;
113
+ readonly string[] pathName = { "Wall", "PlayerGoal", "Enemy", "Jump", "Move", "EventItem", "EventBlock", "BackGround", "Decoration" };
114
+ /// <summary>
115
+ /// 生成カウント
116
+ /// </summary>
117
+ int counter = 0;
118
+ /// <summary>
119
+ /// 矢印用カウンタ―
120
+ /// </summary>
121
+ int arrowCounter = 0;
122
+ /// <summary>
123
+ /// ステージ番号
124
+ /// ステージ選択時にセットします
125
+ /// </summary>
126
+ static int fileNum = 0;
127
+ /// <summary>
128
+ /// ステージ内のフロア数
129
+ /// </summary>
130
+ readonly static int[] floorCount = { 3, 8 };
131
+ /// <summary>
132
+ /// 現在のステージのフロア数を返します
133
+ /// </summary>
134
+ public static int FloorCount
135
+ {
136
+ get
137
+ {
138
+ return floorCount[fileNum];
139
+ }
140
+ }
141
+
142
+ /// <summary>
143
+ /// 各ステージのX,Y長さ
144
+ /// </summary>
145
+ readonly Vector2[] stageVec = { new Vector2(19 - 1, 11 + 1), new Vector2(20 - 1, 11) };
146
+
147
+ /// <summary>
148
+ /// 横のステージのフロア数
149
+ /// </summary>
150
+ readonly static int[] stageX = { 3, 4 };
151
+ public static int StageX
152
+ {
153
+ get
154
+ {
155
+ return stageX[fileNum];
156
+ }
157
+ }
158
+
159
+ /// <summary>
160
+ /// ステージ番号
161
+ /// </summary>
162
+ public static string stageID = "";
163
+
164
+ ```
165
+
166
+ Awake時、読み込む関数を格納
167
+
168
+ CreateStage()
169
+ フロアによって位置を変えて各フロアの位置を出します
170
+
171
+ ```C#
172
+ コード
173
+ private void Awake()
174
+ {
175
+ //ステージ番号のステージを作成します
176
+ fileNum = GameManager.Instance.StageNo;
177
+ //fileNum = 0;
178
+
179
+ //現在のステージ番号を指定します
180
+ stageID = string.Format("stage{0}", fileNum + 1);
181
+
182
+ ji = new JsonInfo();
183
+ ji.MapJson();
184
+
185
+ tileList = new TileMap[]
186
+ {
187
+ SwicthWALL,//壁を生成
188
+ SwitchPlayerGoal,//プレイヤーとゴールを生成
189
+ SwitchEnemy,//敵を生成
190
+ SwitchJump,//ジャンプ台を生成
191
+ SwitchMove,//フロア移動
192
+ SwitchEventItem,//イベントアイテムを生成
193
+ SwitchEventBlock,//イベントブロックを生成
194
+ SwitchBack,//背景生成
195
+ SwitchDecoration//デコレーション生成
196
+ };
197
+
198
+ //ステージ作成
199
+ CreateStage();
200
+
201
+ //オブジェクトを破棄します
202
+ //Destroy(gameObject);
203
+ }
204
+
205
+ #region マップ生成読み込み
206
+
207
+ /// <summary>
208
+ /// ステージの作成
209
+ /// </summary>
210
+ void CreateStage()
211
+ {
212
+ //CSVからデータを読み込む
213
+ for (int sNum = 0; sNum < FloorCount; sNum++)
214
+ {
215
+ //余りが横
216
+ float stageVecX = sNum % StageX;
217
+ //商が縦
218
+ float stageVecY = sNum / StageX;
219
+
220
+ var vec = Vector2.zero;
221
+ //このステージの横縦長さ * ステージのx(横のフロア)とy(縦のフロア)の何番目か + 作成する初期位置
222
+ vec.x = stageVec[fileNum].x * stageVecX + createInitPos.x;
223
+ vec.y = (-stageVec[fileNum].y) * stageVecY + createInitPos.y;
224
+
225
+
226
+ //ステージを格納する空のオブジェクトを作成(フロアごとに分けてここに入れます)
227
+ var obj = Resources.Load<GameObject>("StageEmpty");
228
+ var floor = Instantiate(obj, transform.position, Quaternion.identity);
229
+ floor.name = sNum.ToString();
230
+
231
+ for (int i = 0; i < tileList.Length; i++)
232
+ {
233
+ var stageNo = fileNum + 1;
234
+ var filePath = string.Format("Stage/Stage{0}/{1}/{2}", stageNo, sNum + 1, pathName[i]);
235
+ CSVRead(filePath, i, floor, vec, sNum);
236
+ }
237
+ }
238
+ }
239
+ ```
240
+
241
+ CSVRead() CSVからの読み込み(JSON)
242
+ ```C#
243
+ コード
244
+ /// <summary>
245
+ /// CSVファイルの読み込み
246
+ /// </summary>
247
+ void CSVRead(string stageTagName, int num, GameObject floor, Vector2 createPos, int floorNum)
248
+ {
249
+ //csvファイルの検索
250
+ var csvFile = Resources.Load(stageTagName) as TextAsset;
251
+
252
+ if (csvFile == null) return;
253
+
254
+ //csvファイルの読み込み
255
+ var reader = new StringReader(csvFile.text);
256
+
257
+ //数字文字を解析しステージを作成します
258
+ StringMozi(reader, num, floor, createPos, floorNum);
259
+ }
260
+ ```
261
+
262
+
263
+ StringMozi() CSVの文字 (例え)横11行縦18列の読み込み
264
+ ```C#
265
+ コード
266
+ /// <summary>
267
+ /// ファイルの内の","で文字を区切ります
268
+ /// </summary>
269
+ void StringMozi(StringReader reader, int num, GameObject floor, Vector2 createPos, int floorNum)
270
+ {
271
+ var pos = createPos;
272
+ tile = tileList[num];
273
+ //読み取り対象がなくなるまで繰り返します
274
+ while (reader.Peek() != -1)
275
+ {
276
+ //一行づつ読み込みます
277
+ string line = reader.ReadLine();
278
+
279
+ string[] split = line.Split(',');//,で区切ります
280
+ foreach (var tileNum in split)
281
+ {
282
+ //現在の作成物
283
+ tile(tileNum, pos, floor, floorNum);
284
+ //生成位置を変更します
285
+ pos.x += 1;
286
+ }
287
+ //xを初期位置yを-1下げたところから生成を再開しします
288
+ pos.x = createPos.x;
289
+ pos.y -= 1;
290
+ }
291
+ //生成カウントの初期化
292
+ counter = 0;
293
+ arrowCounter = 0;
294
+ }
295
+ ```

1

中身の修正

2021/03/07 10:36

投稿

BRAK
BRAK

スコア98

title CHANGED
File without changes
body CHANGED
@@ -7,4 +7,9 @@
7
7
 
8
8
  また、読み終わるまで処理を続けたいのですが、どうすればよろしいでしょうか。
9
9
 
10
+ 考えていることは、
10
- 考えていることは、スクリプトを9個に分けて個々で処理をさせることしか思いつきません。
11
+ スクリプトを9個に分けて個々で処理をさせる
12
+ ・描画するマップ位置のみ生成する(書いてきたコードがすべて破綻してしまうので厳しいです)
13
+ しか思いつきません
14
+
15
+ 他に良い方法はないでしょうか。