質問編集履歴

1

ソースコードで関係のない部分を省略

2019/07/12 04:09

投稿

MrDAUSX
MrDAUSX

スコア13

test CHANGED
File without changes
test CHANGED
@@ -22,7 +22,9 @@
22
22
 
23
23
  ***Player.cs***
24
24
 
25
+
26
+
25
- ~略~
27
+ '''~略~
26
28
 
27
29
 
28
30
 
@@ -32,53 +34,11 @@
32
34
 
33
35
  ~略~
34
36
 
35
- public Text foodText; //食料を表示するテキスト
36
-
37
- public int wallDamage = 1; //壁へのダメージ量
38
-
39
- public int pointsPerFood = 10; //食べ物の回復量
40
-
41
- public int pointsPerSoda = 20; //ソーダの回復量
42
-
43
- public float restartLevelDeray = 1f; //ステージ移動時の時間
44
-
45
-
46
-
47
- private Animator animator; //アニメーション用変数
48
-
49
- private int food; //食料
50
-
51
-
52
-
53
- ~略~
54
-
55
-
56
-
57
- //PlayerのfoodをGameManageに保存する
58
-
59
- public void OnDisable()
60
-
61
- {
62
-
63
- GameManager.instance.playerFoodPoints = food;
64
-
65
- }
66
-
67
-
68
-
69
37
  protected override void AttemptMove<T>(int xDir, int yDir)
70
38
 
71
39
  {
72
40
 
73
- //移動するたびに食料が減る
74
-
75
- food--;
41
+ ~略~
76
-
77
-
78
-
79
- //減らした食料をUIに表示する
80
-
81
- foodText.text = "Food: " + food;
82
42
 
83
43
 
84
44
 
@@ -92,344 +52,182 @@
92
52
 
93
53
 
94
54
 
55
+
56
+
57
+     ~~略~~
58
+
59
+
60
+
61
+ //ゲームオーバーか確認
62
+
63
+ CheckIfGameOver();
64
+
65
+ //プレイヤーのターン終了
66
+
67
+ GameManager.instance.playerTurn = false;
68
+
69
+ }
70
+
71
+
72
+
73
+ //プレイヤーが壁にぶつかった場合、壁をチョップする
74
+
75
+ protected override void OnCantMove<T>(T component)
76
+
77
+ {
78
+
79
+ //Wallスクリプトを使えるように設定
80
+
81
+ Wall hitWall = component as Wall;
82
+
83
+ //壁にダメージを与える
84
+
85
+ '''hitWall.DamageWall(wallDamage);//'''
86
+
87
+ //↑もうまくいっていない
88
+
89
+ //チョップするアニメーションを呼び出す
90
+
91
+ animator.SetTrigger("PlayerChop");
92
+
93
+ }
94
+
95
+
96
+
97
+
98
+
99
+ ~~略~~
100
+
101
+
102
+
103
+
104
+
105
+ // Update is called once per frame
106
+
107
+ void Update()
108
+
109
+ {
110
+
111
+ //プレイヤーのターンではない場合、何も実行しない
112
+
113
+ if (!GameManager.instance.playerTurn)
114
+
115
+ return;
116
+
117
+
118
+
119
+ //左右の移動
120
+
121
+ int horizontal = 0;
122
+
123
+ //上下の移動
124
+
125
+ int vertical = 0;
126
+
95
- //動いた時の効果音鳴らす
127
+ //左右の移受け取る
128
+
96
-
129
+ horizontal = (int)(Input.GetAxisRaw("Horizontal"));
130
+
131
+ //上下の移動量を受け取る
132
+
133
+ vertical = (int)(Input.GetAxisRaw("Vertical"));
134
+
135
+
136
+
137
+
138
+
139
+ //上下左右のいずれかに移動を制限する
140
+
97
- if (Move(xDir, yDir, out hit))
141
+ if (horizontal != 0)
98
142
 
99
143
  {
100
144
 
101
- SoundManager.instance.RandomizeSFx(moveSound1, moveSound2);
145
+ vertical = 0;
102
146
 
103
147
  }
104
148
 
105
149
 
106
150
 
107
-
108
-
109
- //ゲームオーバーか確認
110
-
111
- CheckIfGameOver();
112
-
113
- //プレイヤーのターン終了
114
-
115
- GameManager.instance.playerTurn = false;
116
-
117
- }
118
-
119
-
120
-
121
- //プレイヤーが壁にぶつかった場合、壁をチョップする
122
-
123
- protected override void OnCantMove<T>(T component)
124
-
125
- {
126
-
127
- //Wallスクリプトを使えるように設定
128
-
129
- Wall hitWall = component as Wall;
130
-
131
- //壁にダメージを与える
132
-
133
- hitWall.DamageWall(wallDamage);
134
-
135
- //チョップするアニメーションを呼び出す
136
-
137
- animator.SetTrigger("PlayerChop");
138
-
139
- }
140
-
141
-
142
-
143
- //プレイヤーが、Exit、Food、Sodaと接触した場合に呼び出す
144
-
145
- private void OnTriggerEnter2D(Collider2D other)
146
-
147
- {
148
-
149
- //Exitと接触した場合
151
+ //左右上下のいずれかに移動する場合
150
-
152
+
151
- if (other.tag == "Exit")
153
+ if (horizontal != 0 || vertical != 0)
152
154
 
153
155
  {
154
156
 
155
- //ステジ移動時間分待ってから、次のツテージ移動す
157
+ //プレイヤーの侵攻方向壁があか確認
156
-
158
+
157
- Invoke("Restart", restartLevelDeray);
159
+ AttemptMove<Wall>(horizontal, vertical);
158
-
159
- //Disable the player object since level is over.
160
-
161
- enabled = false;
162
160
 
163
161
  }
164
162
 
163
+ }
164
+
165
+
166
+
167
+ ~~略~~
168
+
169
+ }
170
+
171
+
172
+
173
+ ****MovingObject***
174
+
175
+
176
+
165
- else if (other.tag == "Food")
177
+ public abstract class MovingObject : MonoBehaviour
178
+
166
-
179
+ {
180
+
181
+ ~~略~~
182
+
183
+
184
+
185
+ //移動可能か判断する ※blockingLayerに衝突する場合、移動しない
186
+
187
+ //boolはtrueかfalseを返す
188
+
167
- { //食料と接触した場合
189
+ //outで指定した変数は、取得可能になる
190
+
168
-
191
+ protected bool Move(int xDir, int yDir, out RaycastHit2D hit)
192
+
193
+ {
194
+
169
- //食料回復
195
+ //現在地取得
170
-
196
+
171
- food += pointsPerFood;
197
+ Vector2 start = transform.position;
172
-
173
- //増えた食料をUIに表示する
198
+
174
-
175
- foodText.text = "+" + pointsPerFood + " Food: " + food;
176
-
177
- //食べた時の効果音を鳴らす
178
-
179
- SoundManager.instance.RandomizeSFx(eatSound1, eatSound2);
180
-
181
-
182
-
183
- //食料削除
199
+ //移動先取得
200
+
184
-
201
+ Vector2 end = start + new Vector2(xDir, yDir);
202
+
203
+ //自身のColliderを一旦無効化する ※startとendの間にblockingLayerがあるか確認するときに不要なため
204
+
185
- other.gameObject.SetActive(false);
205
+ boxCollider.enabled = false;
206
+
207
+ //現在地と移動先の間にblockingLayerがあるか確認、ある場合取得
208
+
209
+ hit = Physics2D.Linecast(start, end, blockingLayer);
210
+
211
+ //確認が終わったため、Colliderを有効化する
212
+
213
+ boxCollider.enabled = true;
214
+
215
+
216
+
217
+ //現在地と移動先の間に、BlockingLayerがなければ移動する
218
+
219
+ if (hit.transform == false)
220
+
221
+ {
222
+
223
+ StartCoroutine(SmoothMovement(end));
224
+
225
+ //移動可能
226
+
227
+ return true;
186
228
 
187
229
  }
188
230
 
189
- else if (other.tag == "Soda")
190
-
191
- {
192
-
193
- //食料を回復
194
-
195
- food += pointsPerSoda;
196
-
197
- //増えた食料をUIに表示する
198
-
199
- foodText.text = "+" + pointsPerFood + " Food: " + food;
200
-
201
- //飲んだ時の効果音を鳴らす
202
-
203
- SoundManager.instance.RandomizeSFx(drinkSound1, drinkSound2);
204
-
205
- //ソーダを削除
206
-
207
- other.gameObject.SetActive(false);
208
-
209
- }
210
-
211
- }
212
-
213
-
214
-
215
- //プレイヤーが敵に攻撃された場合、食料を減らす
216
-
217
- internal void LoseFood(int loss)
218
-
219
- {
220
-
221
- //攻撃を受けたアニメーションを呼び出す
222
-
223
- animator.SetTrigger("PlayerHit");
224
-
225
- //食料を減らす
226
-
227
- food -= loss;
228
-
229
- //減らした食料をUIに表示する
230
-
231
- foodText.text = "-" + loss + " Food: " + food;
232
-
233
- //ゲームオーバーか判定
234
-
235
- CheckIfGameOver();
236
-
237
- }
238
-
239
-
240
-
241
- ~~略~~
242
-
243
-
244
-
245
-
246
-
247
- // Update is called once per frame
248
-
249
- void Update()
250
-
251
- {
252
-
253
- //プレイヤーのターンではない場合、何も実行しない
254
-
255
- if (!GameManager.instance.playerTurn)
256
-
257
- return;
258
-
259
-
260
-
261
- //左右の移動
262
-
263
- int horizontal = 0;
264
-
265
- //上下の移動
266
-
267
- int vertical = 0;
268
-
269
- //左右の移動量を受け取る
270
-
271
- horizontal = (int)(Input.GetAxisRaw("Horizontal"));
272
-
273
- //上下の移動量を受け取る
274
-
275
- vertical = (int)(Input.GetAxisRaw("Vertical"));
276
-
277
-
278
-
279
-
280
-
281
- //上下左右のいずれかに移動を制限する
282
-
283
- if (horizontal != 0)
284
-
285
- {
286
-
287
- vertical = 0;
288
-
289
- }
290
-
291
-
292
-
293
- //左右上下のいずれかに移動する場合
294
-
295
- if (horizontal != 0 || vertical != 0)
296
-
297
- {
298
-
299
- //プレイヤーの侵攻方向に壁があるか確認
300
-
301
- AttemptMove<Wall>(horizontal, vertical);
302
-
303
- }
304
-
305
- }
306
-
307
-
308
-
309
- //食料が0いかになった場合、ゲームオーバーにする
310
-
311
- private void CheckIfGameOver()
312
-
313
- {
314
-
315
- if (food <= 0)
316
-
317
- {
318
-
319
- //ゲームオーバーの時の効果音を鳴らす
320
-
321
- SoundManager.instance.PlaySingle(gameoverSound);
322
-
323
- SoundManager.instance.musicSource.Stop();
324
-
325
-
326
-
327
- //GameManagerのGameOverを呼び出す
328
-
329
- GameManager.instance.GameOver();
330
-
331
- }
332
-
333
- }
334
-
335
- }
336
-
337
-
338
-
339
- ****MovingObject***
340
-
341
- using System.Collections;
342
-
343
- using System.Collections.Generic;
344
-
345
- using UnityEngine;
346
-
347
-
348
-
349
- public abstract class MovingObject : MonoBehaviour
350
-
351
- {
352
-
353
- public float moveTime = 0.1f; // //動く時間
354
-
355
- public LayerMask blockingLayer;
356
-
357
-
358
-
359
- private BoxCollider2D boxCollider; //コンポーネント
360
-
361
- private Rigidbody2D rd2D; //コンポーネント
362
-
363
- private float inverseMoveTime;
364
-
365
-
366
-
367
- // Use this for initialization
368
-
369
- //継承クラスでオーバーライドできるようにする
370
-
371
- protected virtual void Start()
372
-
373
- {
374
-
375
- //コンポーネントを取得する
376
-
377
- boxCollider = GetComponent<BoxCollider2D>();
378
-
379
- rd2D = GetComponent<Rigidbody2D>();
380
-
381
- inverseMoveTime = 1f / moveTime;
382
-
383
- }
384
-
385
-
386
-
387
- //移動可能か判断する ※blockingLayerに衝突する場合、移動しない
388
-
389
- //boolはtrueかfalseを返す
390
-
391
- //outで指定した変数は、取得可能になる
392
-
393
- protected bool Move(int xDir, int yDir, out RaycastHit2D hit)
394
-
395
- {
396
-
397
- //現在地を取得
398
-
399
- Vector2 start = transform.position;
400
-
401
- //移動先を取得
402
-
403
- Vector2 end = start + new Vector2(xDir, yDir);
404
-
405
- //自身のColliderを一旦無効化する ※startとendの間にblockingLayerがあるか確認するときに不要なため
406
-
407
- boxCollider.enabled = false;
408
-
409
- //現在地と移動先の間にblockingLayerがあるか確認、ある場合取得
410
-
411
- hit = Physics2D.Linecast(start, end, blockingLayer);
412
-
413
- //確認が終わったため、Colliderを有効化する
414
-
415
- boxCollider.enabled = true;
416
-
417
-
418
-
419
- //現在地と移動先の間に、BlockingLayerがなければ移動する
420
-
421
- if (hit.transform == false)
422
-
423
- {
424
-
425
- StartCoroutine(SmoothMovement(end));
426
-
427
- //移動可能
428
-
429
- return true;
430
-
431
- }
432
-
433
231
 
434
232
 
435
233
  //移動不可
@@ -440,107 +238,7 @@
440
238
 
441
239
 
442
240
 
443
- //継承クラスでオーバーライドできるようにする
444
-
445
- //移動を試し、書が異物がある場合、移動不可の場合の処理を呼び出す
446
-
447
- protected virtual void AttemptMove<T>(int xDir, int yDir)
448
-
449
- where T : Component //後からコンポーネントを決める
450
-
451
- {
452
-
453
- RaycastHit2D hit;
454
-
455
- //Moveメソッドを実行し、移動可能か判定する
456
-
457
- bool canMove = Move(xDir, yDir, out hit);
458
-
459
- Debug.Log(canMove);
460
-
461
- //hitがnullの場合 ※現在地から目的地の間にblockingLayerに該当するものがない場合
462
-
463
- if (hit.transform == null)
464
-
465
- {
466
-
467
- return;
241
+ ~~以下略~~
468
-
469
- }
470
-
471
- //現在地から目的地の間にblockingLayerに該当するものがある場合
472
-
473
- //障害物のコンポーネントを取得
474
-
475
- T hitComponet = hit.transform.GetComponent<T>();
476
-
477
-
478
-
479
- //障害物がある場合、移動不可の場合の処理を呼び出す
480
-
481
- if (!canMove && hitComponet != null)
482
-
483
- {
484
-
485
- OnCantMove(hitComponet);
486
-
487
- }
488
-
489
-
490
-
491
- }
492
-
493
-
494
-
495
- //現在地から目的地までの距離を求めて移動する
496
-
497
- protected IEnumerator SmoothMovement(Vector3 end)
498
-
499
- {
500
-
501
- //目的地までの距離を計算 ※現在地:transform.position、目的地:end、距離を求める:.sqrMagnitude
502
-
503
- float sqrRemainingDistance = (transform.position - end).sqrMagnitude;
504
-
505
-
506
-
507
- //目的地に限りなく近くまで繰り返し実行する
508
-
509
- while (sqrRemainingDistance > float.Epsilon)
510
-
511
- {
512
-
513
- //1フレームあたりの移動距離を計算する ※Time.deltaTime:1フレームあたりの時間
514
-
515
- Vector3 newPosition = Vector3.MoveTowards(rd2D.position, end, inverseMoveTime * Time.deltaTime);
516
-
517
- //移動距離分、移動する
518
-
519
- rd2D.MovePosition(newPosition);
520
-
521
- //移動した場所から、目的地までの距離を再計算する
522
-
523
- sqrRemainingDistance = (transform.position - end).sqrMagnitude;
524
-
525
- //移動するのに1フレーム使うため、1フレーム待機
526
-
527
- yield return null;
528
-
529
- }
530
-
531
- }
532
-
533
-
534
-
535
- //抽象クラス
536
-
537
- protected abstract void OnCantMove<T>(T component)
538
-
539
- where T : Component;
540
-
541
- }
542
-
543
-
544
242
 
545
243
 
546
244