質問編集履歴

1

文の修正

2018/06/07 03:36

投稿

Astin
Astin

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,479 +1,13 @@
1
- 現在カメラからRayを飛ばしRayが当たったオブジェクトをコピーしてクリックでコピーしたオブジェクト複製するというゲームをっています。
1
+ 現在Unityでゲーム作っいるのです当たり判定のない半透明なオブジェクトをPlayerの前に出してクリックしたらそれ実体化(当たり判定を付けて半透明ではなく普通の色に戻)するということをしたいのですが、うまいことプログラムを書けず困っています。
2
2
 
3
3
 
4
4
 
5
- コピーできる状態と複製できるモードに分かれていて、複製できる状態の時に
6
-
7
- **現在コピーしているオブジェクトをホログラムように前に出し、どこに複製されるかわかるようにしたい**
5
+ 今やっているのはRayをカメラから飛ばして特定のオブジェクトに当たりボタンを押したらそのオブジェクトを記憶、記憶している状態で(記憶とは別の)ボタンを押すと記憶したオブジェクトを複製する ということをやっているですが、記憶している状態の時記憶したオブジェクトをPlayerの前に出し、どこに複製されるかを視覚化見やすくしたいと考えております。
8
-
9
- のですがこれはどのように実装すればいいかがわかりません。
10
6
 
11
7
 
12
8
 
13
- 思いついたのはコピーたオブジェクトの名前(もしくはタグ)を見てそれに対応したテクスチャ前にせばいいのかな、と思ったのですが、
9
+ 最初インスペクターでPrefabを指定してコピー状態になったオブジェクトに対応するPrefab呼びそうと思ったのですが、量が多くなってしまい現実的ではないかなと思いやめました。
14
-
15
- 複製できる状態のときにオブジェクトの大きさ、角度を変えることができ、それをホログラムにも反映されるようにしたいのでテクスチャだと不向きかな、と思ったことと正直どのようにプログラムを書けばいいのかが思いつかないために断念しました…。
16
10
 
17
11
 
18
12
 
19
-
20
-
21
- ↓がPlayerのコピー・複製関連のコードです。 (全部書くと500行越えちゃっているのでコピーと複写だけに削りました。)
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
-
38
-
39
-
40
-
41
- enum ObjectSize
42
-
43
- {
44
-
45
- Small, /* 小 */
46
-
47
- Medium, /* 中 */
48
-
49
- Large /* 大 */
50
-
51
- }
52
-
53
-
54
-
55
-
56
-
57
- public enum State
58
-
59
- {
60
-
61
- Copystate,
62
-
63
- ReprintingState,
64
-
65
- }
66
-
67
-
68
-
69
-
70
-
71
- public class player : MonoBehaviour
72
-
73
- {
74
-
75
- ObjectSize objectSize;
76
-
77
- Vector3 Axis_Rotate = new Vector3(0, 0, 0);
78
-
79
- State state;
80
-
81
-
82
-
83
- GameObject copyObj;
84
-
85
- int SizeTrne = 0;
86
-
87
- float Selected_Size = 0;
88
-
89
- int CurrentAxis = 0;
90
-
91
-
92
-
93
- MemorySlot memorySlot;
94
-
95
-
96
-
97
- void Update()
98
-
99
- {
100
-
101
- //カメラの前方向にRayをとばす
102
-
103
- Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
104
-
105
-
106
-
107
- RaycastHit hit; //ヒットした情報
108
-
109
-
110
-
111
- objectSize = CopyObjeSize(); //オブジェクトのサイズ変更メソッド
112
-
113
- Axis_Rotate = ObjRotate(); // 回転変更
114
-
115
-
116
-
117
- if (Physics.Raycast(ray, out hit) && Input.GetMouseButtonDown(0))
118
-
119
- {
120
-
121
- string hitTag = hit.collider.tag;
122
-
123
- string hitName = hit.collider.name;
124
-
125
-
126
-
127
- //コピーできるモードで右クリックされたら
128
-
129
- if (state == State.Copystate)
130
-
131
- {
132
-
133
- //オリジナルだけ複製できるようにしたいので名前にCloneが入っていたら何もしない。
134
-
135
- if (hitName.Contains("Clone")) return;
136
-
137
-
138
-
139
- switch (hitTag)
140
-
141
- {
142
-
143
- //コピー(listに追加)
144
-
145
- case "Object1":
146
-
147
- memorySlot.SetGimmick(Gimmick.Object1);
148
-
149
- break;
150
-
151
- case "Object2":
152
-
153
- memorySlot.SetGimmick(Gimmick.Object2);
154
-
155
- break;
156
-
157
-
158
-
159
- }
160
-
161
- }
162
-
163
- else //複製できる状態で右クリックされたら
164
-
165
- reprinting(hit.point, objectSize, Axis_Rotate);
166
-
167
- }
168
-
169
- }
170
-
171
- //複製
172
-
173
- void reprinting(Vector3 point, ObjectSize _SelectSize, Vector3 _ObjectRotate)
174
-
175
- {
176
-
177
-
178
-
179
- GameObject Tmp_Object;
180
-
181
- point.y += 0.3f; //陥没回避のために若干上に生成
182
-
183
- objectSize = _SelectSize;
184
-
185
- Vector3 ObjectRotate = _ObjectRotate;
186
-
187
-
188
-
189
- Tmp_Object = Instantiate(copyObj /*コピーされているオブジェクト */, point, Quaternion.identity);
190
-
191
-
192
-
193
- Tmp_Object.transform.localEulerAngles += Axis_Rotate;
194
-
195
-
196
-
197
- switch (objectSize)
198
-
199
- {
200
-
201
- case ObjectSize.Small:
202
-
203
- break;
204
-
205
- case ObjectSize.Medium:
206
-
207
- Tmp_Object.transform.localScale *= 2f;
208
-
209
- break;
210
-
211
- case ObjectSize.Large:
212
-
213
- Tmp_Object.transform.localScale *= 3f;
214
-
215
- break;
216
-
217
- }
218
-
219
- }
220
-
221
-
222
-
223
- //大きさを変える
224
-
225
- private ObjectSize CopyObjeSize()
226
-
227
- {
228
-
229
-
230
-
231
- if (Input.GetKeyDown(KeyCode.Alpha2))
232
-
233
- {
234
-
235
- if (SizeTrne >= 2) SizeTrne = 0;
236
-
237
-
238
-
239
- else SizeTrne++;
240
-
241
-
242
-
243
- }
244
-
245
- else if (Input.GetKeyDown(KeyCode.Alpha1))
246
-
247
- {
248
-
249
- if (SizeTrne <= 0) SizeTrne = 2;
250
-
251
- else SizeTrne--;
252
-
253
- }
254
-
255
-
256
-
257
- if (SizeTrne == 0) objectSize = ObjectSize.Small; //元の大きさ
258
-
259
- else if (SizeTrne == 1) objectSize = ObjectSize.Medium; //中:1.2倍
260
-
261
- else if (SizeTrne == 2) objectSize = ObjectSize.Large; //大:1.4倍
262
-
263
-
264
-
265
- // Debug.Log("サイズ:" + SizeTrne);
266
-
267
- return objectSize;
268
-
269
- }
270
-
271
-
272
-
273
- private Vector3 ObjRotate()
274
-
275
- {
276
-
277
- if (Input.GetKeyDown(KeyCode.RightShift))
278
-
279
- {
280
-
281
- /* 0:x 1:y 2:z */
282
-
283
- if (CurrentAxis >= 2) CurrentAxis = 0;
284
-
285
- else CurrentAxis++;
286
-
287
- }
288
-
289
-
290
-
291
- if (Input.GetKeyDown(KeyCode.LeftShift))
13
+ こんなの(Listとか)使ったらいいよとかありましたら教えてくださいm(__)m
292
-
293
- {
294
-
295
- if (CurrentAxis == 0) Axis_Rotate = new Vector3(90, 0, 0);
296
-
297
- else if (CurrentAxis == 1) Axis_Rotate = new Vector3(0, 90, 0);
298
-
299
- else if (CurrentAxis == 2) Axis_Rotate = new Vector3(0, 0, 90);
300
-
301
- }
302
-
303
-
304
-
305
- return Axis_Rotate;
306
-
307
- }
308
-
309
-
310
-
311
- }
312
-
313
- ```
314
-
315
-
316
-
317
- 記憶したオブジェクトはリストに入れてます
318
-
319
- ```C#
320
-
321
- using System.Collections;
322
-
323
- using System.Collections.Generic;
324
-
325
- using UnityEngine;
326
-
327
-
328
-
329
-
330
-
331
- //複製オブジェクトはここに追加
332
-
333
- public enum Gimmick
334
-
335
- {
336
-
337
- Empty,
338
-
339
- Object1,
340
-
341
- Object2,
342
-
343
- Object3,
344
-
345
- }
346
-
347
-
348
-
349
- //記憶したオブジェクトをリストに保存
350
-
351
- public class MemorySlot : MonoBehaviour
352
-
353
- {
354
-
355
- //最大スロット数
356
-
357
- const int MaxSlotSize = 3;
358
-
359
-
360
-
361
- //記憶スロット
362
-
363
- List<Gimmick> m_Slot = new List<Gimmick>();
364
-
365
-
366
-
367
- //今選択中のスロットの番号
368
-
369
- int m_CurrentSlectedIndex = 0;
370
-
371
-
372
-
373
-
374
-
375
- void Start()
376
-
377
- {
378
-
379
- m_Slot.Add(Gimmick.Empty);
380
-
381
- }
382
-
383
-
384
-
385
- //スロット追加
386
-
387
- public void AddSlot()
388
-
389
- {
390
-
391
- //スロット数がすでにマックス
392
-
393
- if (m_Slot.Count >= MaxSlotSize) return;
394
-
395
-
396
-
397
- //空っぽのスロットを追加
398
-
399
- m_Slot.Add(Gimmick.Empty);
400
-
401
- }
402
-
403
-
404
-
405
- //ギミックをスロットに追加
406
-
407
- public void SetGimmick(Gimmick gimmick)
408
-
409
- {
410
-
411
- m_Slot.Insert(0, gimmick);
412
-
413
- m_Slot.RemoveAt(m_Slot.Count - 1);
414
-
415
- }
416
-
417
-
418
-
419
- //選択項目をずらす
420
-
421
- public void ChangeSelected()
422
-
423
- {
424
-
425
- m_CurrentSlectedIndex = (m_CurrentSlectedIndex + 1) % m_Slot.Count;
426
-
427
- }
428
-
429
-
430
-
431
- //現在選択されているGimmickを選択する
432
-
433
- public Gimmick CurrentSelected
434
-
435
- {
436
-
437
- get
438
-
439
- {
440
-
441
- return m_Slot[m_CurrentSlectedIndex];
442
-
443
- }
444
-
445
- }
446
-
447
-
448
-
449
- //デバッグ用
450
-
451
- public void DebugDump()
452
-
453
- {
454
-
455
- print("-------------");
456
-
457
- for (int i = 0; i < m_Slot.Count; i++)
458
-
459
- {
460
-
461
- print("[" + i + "] " + m_Slot[i]);
462
-
463
- //print(m_Slot.Count);
464
-
465
- }
466
-
467
- print("-------------");
468
-
469
- }
470
-
471
- }
472
-
473
-
474
-
475
- ```
476
-
477
-
478
-
479
- ごちゃごちゃして長くなってしまいましたが簡単に言うと現在コピーしているオブジェクトを前に出し、どこに複製されるかわかるようにしたいです。 こちらのプログラム力も文章力もなく難しいとは思いますが、よろしくお願いします。