質問編集履歴

2

コードの変更

2021/04/23 09:19

投稿

kuronokei
kuronokei

スコア0

test CHANGED
File without changes
test CHANGED
@@ -32,9 +32,143 @@
32
32
 
33
33
  ```ここに言語名を入力
34
34
 
35
+ using System.Collections;
36
+
37
+ using System.Collections.Generic;
38
+
39
+ using UnityEngine;
40
+
41
+ using System;
42
+
43
+ using System.IO;
44
+
45
+
46
+
47
+ public class Recorder : MonoBehaviour
48
+
49
+ {
50
+
51
+
52
+
53
+ // 操作キャラクター
54
+
55
+ [SerializeField]
56
+
57
+ private GhostChara ghostChara;
58
+
59
+ // AnimatorController
60
+
61
+ private Animator animator;
62
+
63
+ // 現在記憶しているかどうか
64
+
65
+ private bool isRecord;
66
+
67
+ // 保存するデータの最大数
68
+
69
+ [SerializeField]
70
+
71
+ private int maxDataNum = 2000;
72
+
73
+ // 記録間隔
74
+
75
+ [SerializeField]
76
+
77
+ private float recordDuration = 0.005f;
78
+
79
+ // Jumpキー
80
+
81
+ //private string animKey = "Jump";
82
+
83
+ // 経過時間
84
+
85
+ private float elapsedTime = 0f;
86
+
87
+ // ゴーストデータ
88
+
89
+ private GhostData ghostData;
90
+
91
+ // 再生中かどうか
92
+
93
+ private bool isPlayBack;
94
+
95
+ // ゴースト用キャラ
96
+
97
+ [SerializeField]
98
+
99
+ private GameObject ghost;
100
+
101
+ [SerializeField]
102
+
103
+ // 保存先フォルダ
104
+
105
+ private string saveDataFolder = "/Projects/Ghost";
106
+
107
+ // 保存ファイル名
108
+
109
+ private string saveFileName = "/ghostdata.dat";
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
35
- 記録のコードがこちらで
123
+ void Start()
124
+
36
-
125
+ {
126
+
127
+ ghostChara.rbody = ghostChara.GetComponent<Rigidbody2D>();
128
+
129
+
130
+
131
+ }
132
+
133
+
134
+
135
+ // ゴーストデータクラス
136
+
137
+ [Serializable]
138
+
139
+ private class GhostData
140
+
141
+ {
142
+
143
+
144
+
145
+ // カーソルキーの入力を取得
146
+
147
+ public List<float> HorizontalLists = new List<float>();
148
+
149
+
150
+
151
+ // Update is called once per frame
152
+
153
+ void Update()
154
+
155
+ {
156
+
157
+ var moveHorizontal = Input.GetAxis("Horizontal");
158
+
159
+
160
+
161
+ if (isRecord)
162
+
163
+ {
164
+
165
+
166
+
167
+ elapsedTime += Time.deltaTime;
168
+
169
+
170
+
37
- if (elapsedTime >= recordDuration)
171
+ if (elapsedTime >= recordDuration)
38
172
 
39
173
  {
40
174
 
@@ -48,11 +182,121 @@
48
182
 
49
183
  }
50
184
 
51
-
185
+ elapsedTime = 0f;
186
+
52
-
187
+ }
188
+
189
+ }
190
+
191
+ }
192
+
193
+
194
+
195
+ // キャラクターデータの保存
196
+
197
+ public void StartRecord()
198
+
199
+ {
200
+
201
+ // 保存する時はゴーストの再生を停止
202
+
53
- 記録した動き再生するコードがこちらです。
203
+ StopAllCoroutines();
204
+
54
-
205
+ StopGhost();
206
+
207
+ isRecord = true;
208
+
209
+ elapsedTime = 0f;
210
+
211
+ ghostData = new GhostData();
212
+
213
+ Debug.Log("StartRecord");
214
+
215
+ }
216
+
217
+
218
+
219
+ // キャラクターデータの保存の停止
220
+
221
+ public void StopRecord()
222
+
223
+ {
224
+
225
+ isRecord = false;
226
+
227
+ Debug.Log("StopRecord");
228
+
229
+ }
230
+
231
+
232
+
233
+ // ゴーストの再生ボタンを押した時の処理
234
+
235
+ public void StartGhost()
236
+
237
+ {
238
+
239
+ Debug.Log("StartGhost");
240
+
241
+ if (ghostData == null)
242
+
243
+ {
244
+
245
+ Debug.Log("ゴーストデータがありません");
246
+
247
+ }
248
+
249
+ else
250
+
251
+ {
252
+
253
+ isRecord = false;
254
+
255
+ isPlayBack = true;
256
+
257
+ ghost.SetActive(true);
258
+
259
+ StartCoroutine(PlayBack());
260
+
261
+ }
262
+
263
+ }
264
+
265
+
266
+
267
+ // ゴーストの停止
268
+
269
+ public void StopGhost()
270
+
271
+ {
272
+
273
+ Debug.Log("StopGhost");
274
+
275
+ StopAllCoroutines();
276
+
277
+ isPlayBack = false;
278
+
279
+ ghost.SetActive(false);
280
+
281
+ }
282
+
283
+
284
+
285
+ // ゴーストの再生
286
+
287
+ IEnumerator PlayBack()
288
+
289
+ {
290
+
291
+ var i = 0;
292
+
293
+ while (isPlayBack)
294
+
295
+ {
296
+
297
+ yield return new WaitForSeconds(recordDuration);
298
+
55
- if (ghostData.HorizontalLists[i] != null)
299
+ if (ghostData.HorizontalLists[i] != null)
56
300
 
57
301
  {
58
302
 
@@ -62,7 +306,79 @@
62
306
 
63
307
  }
64
308
 
65
-
309
+ i++;
310
+
311
+ }
312
+
313
+
314
+
315
+ public void Save()
316
+
317
+ {
318
+
319
+ if (ghostData != null)
320
+
321
+ {
322
+
323
+ // GhostDataクラスをJSONデータに書き換え
324
+
325
+ var data = JsonUtility.ToJson(ghostData);
326
+
327
+ // ゲームフォルダにファイルを作成
328
+
329
+ File.WriteAllText(Application.dataPath + saveDataFolder + saveFileName, data);
330
+
331
+ Debug.Log("ゴーストデータをセーブしました");
332
+
333
+ }
334
+
335
+ }
336
+
337
+
338
+
339
+ public void Load()
340
+
341
+ {
342
+
343
+
344
+
345
+ if (File.Exists(Application.dataPath + saveDataFolder + saveFileName))
346
+
347
+ {
348
+
349
+ string readAllText = File.ReadAllText(Application.dataPath + saveDataFolder + saveFileName);
350
+
351
+ // ghostDataに読み込んだデータを書き込む
352
+
353
+ if (ghostData == null)
354
+
355
+ {
356
+
357
+ ghostData = new GhostData();
358
+
359
+ }
360
+
361
+ JsonUtility.FromJsonOverwrite(readAllText, ghostData);
362
+
363
+ Debug.Log("ゴーストデータをロードしました。");
364
+
365
+ }
366
+
367
+ }
368
+
369
+
370
+
371
+ void OnApplicationQuit()
372
+
373
+ {
374
+
375
+ Debug.Log("アプリケーション終了");
376
+
377
+ Save();
378
+
379
+ }
380
+
381
+ }
66
382
 
67
383
  ```
68
384
 

1

コードを追加しました。

2021/04/23 09:19

投稿

kuronokei
kuronokei

スコア0

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Unityの2Dスクロールゲームで、キャラクターの操作を記録して、その後でそれ同じ動きをするキャラクターを追加したいです。
6
6
 
7
-
7
+ お互い干渉できるようにしたいので、「時間と場所」を記録させるのではなく、「時間と操作入力」を記録させたいです。
8
8
 
9
9
 
10
10
 
@@ -14,11 +14,13 @@
14
14
 
15
15
  ### 発生している問題・エラーメッセージ
16
16
 
17
- 「時間と位置」記録するのではなく、「時間と操作」を記録したいすが、どうればよいか分かりません
17
+ ゲーム始めて動きを記録し、そ動きを開始させようとるとエラー出ます。
18
18
 
19
19
  ```
20
20
 
21
+ Index was out of range. Must be non-negative and less than the size of the collection.
22
+
21
- エラーメッセージ
23
+ Parameter name: index
22
24
 
23
25
  ```
24
26
 
@@ -30,7 +32,37 @@
30
32
 
31
33
  ```ここに言語名を入力
32
34
 
33
- ソースコード
35
+ 記録のコードがこちらで
36
+
37
+ if (elapsedTime >= recordDuration)
38
+
39
+ {
40
+
41
+ if (Input.GetAxis("Horizontal") == 1 || Input.GetAxis("Horizontal") == -1)
42
+
43
+ {
44
+
45
+ ghostData.HorizontalLists.Add(moveHorizontal);
46
+
47
+ Debug.Log("左右記録");
48
+
49
+ }
50
+
51
+
52
+
53
+ 記録した動き再生するコードがこちらです。
54
+
55
+ if (ghostData.HorizontalLists[i] != null)
56
+
57
+ {
58
+
59
+ ghostChara.rbody.velocity = new Vector2(ghostChara.speed * ghostChara.axisH, ghostChara.rbody.velocity.y);
60
+
61
+ Debug.Log("左右移動中");
62
+
63
+ }
64
+
65
+
34
66
 
35
67
  ```
36
68
 
@@ -38,7 +70,9 @@
38
70
 
39
71
  ### 試したこと
40
72
 
73
+ https://gametukurikata.com/program/ghost
41
74
 
75
+ こちらのホームページを参考にして、「時間と操作入力」を記録できるように変更しようとしました。
42
76
 
43
77
 
44
78