回答編集履歴

3

編集

2020/09/13 16:37

投稿

tsuki01
tsuki01

スコア1751

test CHANGED
@@ -1,3 +1,105 @@
1
+ 実装方法は複数パターンあるかもしれませんが、以下の様な方法はいかがでしょうか。
2
+
3
+
4
+
5
+ **処理概要**
6
+
7
+ 1、子オブジェクトのpositionを格納するためのListを宣言
8
+
9
+ 2、Start()関数内で、子オブジェクトの初期位置をListに格納
10
+
11
+ 3、AllPosiReset()関数実行時に、Listで保持しているpositionを子オブジェクトに再設定
12
+
13
+
14
+
15
+ **気になる点**
16
+
17
+ foreachで子オブジェクトを取得する際、Start()関数とAllPosiReset()関数で必ず同じ順番で取得できるかは私も分かっておりません。。
18
+
19
+ もし順番が異なることがある場合、別の子オブジェクトのpositionが適用されてしまうことがあるかもです。
20
+
21
+ なので、もしそうなった場合はコメント頂ければと思います。
22
+
23
+
24
+
25
+
26
+
27
+ ```C#
28
+
29
+ using System.Collections;
30
+
31
+ using System.Collections.Generic;
32
+
33
+ using UnityEngine;
34
+
35
+
36
+
37
+ public class ResetSample : MonoBehaviour
38
+
39
+ {
40
+
41
+ public Transform ParentModel; // 親オブジェクト格納用
42
+
43
+ private List<Vector3> originalPosList; // 元のPosition格納用
44
+
45
+
46
+
47
+ void Start()
48
+
49
+ {
50
+
51
+ // リスト生成
52
+
53
+ originalPosList = new List<Vector3>();
54
+
55
+
56
+
57
+ // 子オブジェクトの初期位置をリストに格納
58
+
59
+ foreach (Transform child in ParentModel)
60
+
61
+ {
62
+
63
+ originalPosList.Add(child.transform.localPosition);
64
+
65
+ }
66
+
67
+ }
68
+
69
+
70
+
71
+
72
+
73
+ public void AllPosiReset()
74
+
75
+ {
76
+
77
+ // 子オブジェクトの位置をリセット
78
+
79
+ int i = 0;
80
+
81
+ foreach (Transform child in ParentModel)
82
+
83
+ {
84
+
85
+ child.transform.localPosition = originalPosList[i];
86
+
87
+ i++;
88
+
89
+ }
90
+
91
+ }
92
+
93
+ }
94
+
95
+ ```
96
+
97
+
98
+
99
+ ---
100
+
101
+
102
+
1
103
  ### 2020.09.14追記
2
104
 
3
105
  階層構造になっているGameObjectのリセット方法はいくつかありますが、今回は [こちら](https://stackoverflow.com/questions/38898035/unity-gameobjects-with-tag-reset-to-start-location-position) を利用した方法を共有させて頂きます。
@@ -225,105 +327,3 @@
225
327
 
226
328
 
227
329
  ```
228
-
229
-
230
-
231
- ---
232
-
233
-
234
-
235
- 実装方法は複数パターンあるかもしれませんが、以下の様な方法はいかがでしょうか。
236
-
237
-
238
-
239
- **処理概要**
240
-
241
- 1、子オブジェクトのpositionを格納するためのListを宣言
242
-
243
- 2、Start()関数内で、子オブジェクトの初期位置をListに格納
244
-
245
- 3、AllPosiReset()関数実行時に、Listで保持しているpositionを子オブジェクトに再設定
246
-
247
-
248
-
249
- **気になる点**
250
-
251
- foreachで子オブジェクトを取得する際、Start()関数とAllPosiReset()関数で必ず同じ順番で取得できるかは私も分かっておりません。。
252
-
253
- もし順番が異なることがある場合、別の子オブジェクトのpositionが適用されてしまうことがあるかもです。
254
-
255
- なので、もしそうなった場合はコメント頂ければと思います。
256
-
257
-
258
-
259
-
260
-
261
- ```C#
262
-
263
- using System.Collections;
264
-
265
- using System.Collections.Generic;
266
-
267
- using UnityEngine;
268
-
269
-
270
-
271
- public class ResetSample : MonoBehaviour
272
-
273
- {
274
-
275
- public Transform ParentModel; // 親オブジェクト格納用
276
-
277
- private List<Vector3> originalPosList; // 元のPosition格納用
278
-
279
-
280
-
281
- void Start()
282
-
283
- {
284
-
285
- // リスト生成
286
-
287
- originalPosList = new List<Vector3>();
288
-
289
-
290
-
291
- // 子オブジェクトの初期位置をリストに格納
292
-
293
- foreach (Transform child in ParentModel)
294
-
295
- {
296
-
297
- originalPosList.Add(child.transform.localPosition);
298
-
299
- }
300
-
301
- }
302
-
303
-
304
-
305
-
306
-
307
- public void AllPosiReset()
308
-
309
- {
310
-
311
- // 子オブジェクトの位置をリセット
312
-
313
- int i = 0;
314
-
315
- foreach (Transform child in ParentModel)
316
-
317
- {
318
-
319
- child.transform.localPosition = originalPosList[i];
320
-
321
- i++;
322
-
323
- }
324
-
325
- }
326
-
327
- }
328
-
329
- ```

2

追記

2020/09/13 16:36

投稿

tsuki01
tsuki01

スコア1751

test CHANGED
@@ -1,3 +1,237 @@
1
+ ### 2020.09.14追記
2
+
3
+ 階層構造になっているGameObjectのリセット方法はいくつかありますが、今回は [こちら](https://stackoverflow.com/questions/38898035/unity-gameobjects-with-tag-reset-to-start-location-position) を利用した方法を共有させて頂きます。
4
+
5
+
6
+
7
+ **大まかな手順**
8
+
9
+ 1、全てのGameObjcectを表示状態にする
10
+
11
+ 2、対象のGameObjectに対し、独自のタグを設定する(インスペクターからあらかじめ独自のタグを追加しておく必要あり)
12
+
13
+ 3、アプリ開始直後のTransformを保持する
14
+
15
+ 4、右クリックメニュー内などのイベント内で(任意のイベントで)、Transformを元に戻す
16
+
17
+
18
+
19
+ **以下サンプル**
20
+
21
+ ```C#
22
+
23
+ using System.Collections;
24
+
25
+ using System.Collections.Generic;
26
+
27
+ using UnityEngine;
28
+
29
+
30
+
31
+ public class StateChangeSample : MonoBehaviour
32
+
33
+ {
34
+
35
+ // ルートとなるGameObject格納用
36
+
37
+ public GameObject rootObj;
38
+
39
+
40
+
41
+ // GameObjectのTransform類格納用(リセット処理にて利用する)
42
+
43
+ private Vector3[] defaultPos;
44
+
45
+ private Vector3[] defaultScale;
46
+
47
+ private Quaternion[] defaultRot;
48
+
49
+ private Transform[] models;
50
+
51
+
52
+
53
+
54
+
55
+ void Start()
56
+
57
+ {
58
+
59
+ // 全オブジェクトを表示する
60
+
61
+ SetActiveRecursively(rootObj, true);
62
+
63
+
64
+
65
+ // GameObject検索用に、GameObjectに独自のタグを設定する
66
+
67
+ // ※インスペクターから、タグを追加しておく必要あり
68
+
69
+ SetOriginalTag(rootObj, "Parts");
70
+
71
+
72
+
73
+ // 開始時のTransformを保持する
74
+
75
+ BackUpTransform();
76
+
77
+ }
78
+
79
+
80
+
81
+
82
+
83
+ // リセットボタン押下時処理
84
+
85
+ // ※こちらではボタン押下時のイベントとして設定
86
+
87
+ // 質問者さんの方では、右クリックメニューのイベントなどで「ResetTransform」メソッドを呼んでください
88
+
89
+ public void ResetBtnClick()
90
+
91
+ {
92
+
93
+ // Transformをリセットする
94
+
95
+ ResetTransform();
96
+
97
+ }
98
+
99
+
100
+
101
+
102
+
103
+ // オブジェクトの表示・非表示切り替え処理
104
+
105
+ // ※再帰処理にて、全オブジェクトを対象とする
106
+
107
+ public void SetActiveRecursively(GameObject obj, bool state)
108
+
109
+ {
110
+
111
+ obj.SetActive(state);
112
+
113
+ foreach (Transform child in obj.transform)
114
+
115
+ {
116
+
117
+ SetActiveRecursively(child.gameObject, state);
118
+
119
+ }
120
+
121
+ }
122
+
123
+
124
+
125
+
126
+
127
+ // タグの追加処理
128
+
129
+ void SetOriginalTag(GameObject obj, string tagStr) {
130
+
131
+ obj.tag = tagStr;
132
+
133
+ foreach (Transform child in obj.transform)
134
+
135
+ {
136
+
137
+ SetOriginalTag(child.gameObject, tagStr);
138
+
139
+ }
140
+
141
+ }
142
+
143
+
144
+
145
+
146
+
147
+ // バックアップ処理
148
+
149
+ // ※開始直後のTransformを保持する
150
+
151
+ void BackUpTransform()
152
+
153
+ {
154
+
155
+ //Find GameObjects with Model tag
156
+
157
+ GameObject[] tempModels = GameObject.FindGameObjectsWithTag("Parts");
158
+
159
+
160
+
161
+ //Create pos, scale and rot, Transform array size based on sixe of Objects found
162
+
163
+ defaultPos = new Vector3[tempModels.Length];
164
+
165
+ defaultScale = new Vector3[tempModels.Length];
166
+
167
+ defaultRot = new Quaternion[tempModels.Length];
168
+
169
+
170
+
171
+ models = new Transform[tempModels.Length];
172
+
173
+
174
+
175
+ //Get original the pos, scale and rot of each Object on the transform
176
+
177
+ for (int i = 0; i < tempModels.Length; i++)
178
+
179
+ {
180
+
181
+ models[i] = tempModels[i].GetComponent<Transform>();
182
+
183
+
184
+
185
+ defaultPos[i] = models[i].position;
186
+
187
+ defaultScale[i] = models[i].localScale;
188
+
189
+ defaultRot[i] = models[i].rotation;
190
+
191
+ }
192
+
193
+ }
194
+
195
+
196
+
197
+
198
+
199
+ // リセット処理
200
+
201
+ // ※Transformを、開始直後の状態にリセットする
202
+
203
+ void ResetTransform()
204
+
205
+ {
206
+
207
+ //Restore the all the original pos, scale and rot of each GameOBject
208
+
209
+ for (int i = 0; i < models.Length; i++)
210
+
211
+ {
212
+
213
+ models[i].position = defaultPos[i];
214
+
215
+ models[i].localScale = defaultScale[i];
216
+
217
+ models[i].rotation = defaultRot[i];
218
+
219
+ }
220
+
221
+ }
222
+
223
+ }
224
+
225
+
226
+
227
+ ```
228
+
229
+
230
+
231
+ ---
232
+
233
+
234
+
1
235
  実装方法は複数パターンあるかもしれませんが、以下の様な方法はいかがでしょうか。
2
236
 
3
237
 

1

修正

2020/09/13 16:32

投稿

tsuki01
tsuki01

スコア1751

test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
  {
62
62
 
63
- originalPosList.Add(child.transform.position);
63
+ originalPosList.Add(child.transform.localPosition);
64
64
 
65
65
  }
66
66
 
@@ -82,7 +82,7 @@
82
82
 
83
83
  {
84
84
 
85
- child.transform.position = originalPosList[i];
85
+ child.transform.localPosition = originalPosList[i];
86
86
 
87
87
  i++;
88
88