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

質問編集履歴

2

コードの変更

2021/04/23 09:19

投稿

kuronokei
kuronokei

スコア0

title CHANGED
File without changes
body CHANGED
@@ -15,22 +15,180 @@
15
15
  ### 該当のソースコード
16
16
 
17
17
  ```ここに言語名を入力
18
+ using System.Collections;
19
+ using System.Collections.Generic;
20
+ using UnityEngine;
21
+ using System;
22
+ using System.IO;
23
+
24
+ public class Recorder : MonoBehaviour
25
+ {
26
+
27
+ // 操作キャラクター
28
+ [SerializeField]
29
+ private GhostChara ghostChara;
30
+ // AnimatorController
31
+ private Animator animator;
32
+ // 現在記憶しているかどうか
33
+ private bool isRecord;
34
+ // 保存するデータの最大数
35
+ [SerializeField]
36
+ private int maxDataNum = 2000;
37
+ // 記録間隔
38
+ [SerializeField]
39
+ private float recordDuration = 0.005f;
40
+ // Jumpキー
41
+ //private string animKey = "Jump";
42
+ // 経過時間
43
+ private float elapsedTime = 0f;
44
+ // ゴーストデータ
45
+ private GhostData ghostData;
46
+ // 再生中かどうか
47
+ private bool isPlayBack;
48
+ // ゴースト用キャラ
49
+ [SerializeField]
50
+ private GameObject ghost;
51
+ [SerializeField]
52
+ // 保存先フォルダ
53
+ private string saveDataFolder = "/Projects/Ghost";
54
+ // 保存ファイル名
55
+ private string saveFileName = "/ghostdata.dat";
56
+
57
+
58
+
59
+
60
+
61
+
18
- 記録のコードがこちらで
62
+ void Start()
63
+ {
64
+ ghostChara.rbody = ghostChara.GetComponent<Rigidbody2D>();
65
+
66
+ }
67
+
68
+ // ゴーストデータクラス
69
+ [Serializable]
70
+ private class GhostData
71
+ {
72
+
73
+ // カーソルキーの入力を取得
74
+ public List<float> HorizontalLists = new List<float>();
75
+
76
+ // Update is called once per frame
77
+ void Update()
78
+ {
79
+ var moveHorizontal = Input.GetAxis("Horizontal");
80
+
81
+ if (isRecord)
82
+ {
83
+
84
+ elapsedTime += Time.deltaTime;
85
+
19
- if (elapsedTime >= recordDuration)
86
+ if (elapsedTime >= recordDuration)
20
87
  {
21
88
  if (Input.GetAxis("Horizontal") == 1 || Input.GetAxis("Horizontal") == -1)
22
89
  {
23
90
  ghostData.HorizontalLists.Add(moveHorizontal);
24
91
  Debug.Log("左右記録");
25
92
  }
93
+ elapsedTime = 0f;
94
+ }
95
+ }
96
+ }
26
97
 
98
+ // キャラクターデータの保存
99
+ public void StartRecord()
100
+ {
101
+ // 保存する時はゴーストの再生を停止
27
- 記録した動き再生するコードがこちらです。
102
+ StopAllCoroutines();
103
+ StopGhost();
104
+ isRecord = true;
105
+ elapsedTime = 0f;
106
+ ghostData = new GhostData();
107
+ Debug.Log("StartRecord");
108
+ }
109
+
110
+ // キャラクターデータの保存の停止
111
+ public void StopRecord()
112
+ {
113
+ isRecord = false;
114
+ Debug.Log("StopRecord");
115
+ }
116
+
117
+ // ゴーストの再生ボタンを押した時の処理
118
+ public void StartGhost()
119
+ {
120
+ Debug.Log("StartGhost");
121
+ if (ghostData == null)
122
+ {
123
+ Debug.Log("ゴーストデータがありません");
124
+ }
125
+ else
126
+ {
127
+ isRecord = false;
128
+ isPlayBack = true;
129
+ ghost.SetActive(true);
130
+ StartCoroutine(PlayBack());
131
+ }
132
+ }
133
+
134
+ // ゴーストの停止
135
+ public void StopGhost()
136
+ {
137
+ Debug.Log("StopGhost");
138
+ StopAllCoroutines();
139
+ isPlayBack = false;
140
+ ghost.SetActive(false);
141
+ }
142
+
143
+ // ゴーストの再生
144
+ IEnumerator PlayBack()
145
+ {
146
+ var i = 0;
147
+ while (isPlayBack)
148
+ {
149
+ yield return new WaitForSeconds(recordDuration);
28
- if (ghostData.HorizontalLists[i] != null)
150
+ if (ghostData.HorizontalLists[i] != null)
29
151
  {
30
152
  ghostChara.rbody.velocity = new Vector2(ghostChara.speed * ghostChara.axisH, ghostChara.rbody.velocity.y);
31
153
  Debug.Log("左右移動中");
32
154
  }
155
+ i++;
156
+ }
33
157
 
158
+ public void Save()
159
+ {
160
+ if (ghostData != null)
161
+ {
162
+ // GhostDataクラスをJSONデータに書き換え
163
+ var data = JsonUtility.ToJson(ghostData);
164
+ // ゲームフォルダにファイルを作成
165
+ File.WriteAllText(Application.dataPath + saveDataFolder + saveFileName, data);
166
+ Debug.Log("ゴーストデータをセーブしました");
167
+ }
168
+ }
169
+
170
+ public void Load()
171
+ {
172
+
173
+ if (File.Exists(Application.dataPath + saveDataFolder + saveFileName))
174
+ {
175
+ string readAllText = File.ReadAllText(Application.dataPath + saveDataFolder + saveFileName);
176
+ // ghostDataに読み込んだデータを書き込む
177
+ if (ghostData == null)
178
+ {
179
+ ghostData = new GhostData();
180
+ }
181
+ JsonUtility.FromJsonOverwrite(readAllText, ghostData);
182
+ Debug.Log("ゴーストデータをロードしました。");
183
+ }
184
+ }
185
+
186
+ void OnApplicationQuit()
187
+ {
188
+ Debug.Log("アプリケーション終了");
189
+ Save();
190
+ }
191
+ }
34
192
  ```
35
193
 
36
194
  ### 試したこと

1

コードを追加しました。

2021/04/23 09:19

投稿

kuronokei
kuronokei

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,25 +1,42 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
3
  Unityの2Dスクロールゲームで、キャラクターの操作を記録して、その後でそれ同じ動きをするキャラクターを追加したいです。
4
+ お互い干渉できるようにしたいので、「時間と場所」を記録させるのではなく、「時間と操作入力」を記録させたいです。
4
5
 
5
6
 
6
7
 
7
-
8
8
  ### 発生している問題・エラーメッセージ
9
- 「時間と位置」記録するのではなく、「時間と操作」を記録したいのですがうすればよいか分かりせん
9
+ ゲーム始めて動きを記録し、その動きを開始させよるとエラーが出
10
10
  ```
11
+ Index was out of range. Must be non-negative and less than the size of the collection.
11
- エラーメッセージ
12
+ Parameter name: index
12
13
  ```
13
14
 
14
15
  ### 該当のソースコード
15
16
 
16
17
  ```ここに言語名を入力
17
- ソースコード
18
+ 記録のコードがこちらで
19
+ if (elapsedTime >= recordDuration)
20
+ {
21
+ if (Input.GetAxis("Horizontal") == 1 || Input.GetAxis("Horizontal") == -1)
22
+ {
23
+ ghostData.HorizontalLists.Add(moveHorizontal);
24
+ Debug.Log("左右記録");
25
+ }
26
+
27
+ 記録した動き再生するコードがこちらです。
28
+ if (ghostData.HorizontalLists[i] != null)
29
+ {
30
+ ghostChara.rbody.velocity = new Vector2(ghostChara.speed * ghostChara.axisH, ghostChara.rbody.velocity.y);
31
+ Debug.Log("左右移動中");
32
+ }
33
+
18
34
  ```
19
35
 
20
36
  ### 試したこと
37
+ https://gametukurikata.com/program/ghost
38
+ こちらのホームページを参考にして、「時間と操作入力」を記録できるように変更しようとしました。
21
39
 
22
-
23
40
  ### 補足情報(FW/ツールのバージョンなど)
24
41
 
25
42
  マ〇オみたいなシステムで、左右移動とジャンプのみのシンプルな操作です。