質問編集履歴

7

自己解決した旨を書き、タイトルも質問ではなくできたことに変更しました。

2020/03/30 01:41

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
@@ -1 +1 @@
1
- スクリプトA通る記述がスクリプトBでエなる【NavMeshAgent2D版使用】
1
+ Unity2D環境NPCキャラにNavを実装【NavMeshAgent2D版使用】
test CHANGED
@@ -1,3 +1,7 @@
1
+ ★3月30日 自己解決しました。自己解決欄に結論スクリプトを載せておきます。
2
+
3
+
4
+
1
5
  ###当該スクリプト
2
6
 
3
7
  いきさつを書くと長くなるので、先に問題点だけ書きます。

6

エラーの出るスクリプトに記述もれがあったため直しました。エラー自体は解決していません。

2020/03/30 01:41

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
  transform.position = new Vector3(
88
88
 
89
- Ri_Nav_pos.transform.position.x, Ri_Nav_pos.y, transform.position.z);
89
+ Ri_Nav_pos.transform.position.x, Ri_Nav_pos.transform.position.y, transform.position.z);
90
90
 
91
91
  }
92
92
 

5

NavMeshAgent2D版についての質問ページでしたが、問題点が変わったので書き換えました。

2020/03/29 04:37

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
@@ -1 +1 @@
1
- Unity2Dタテスクロール障害物競争 Z軸のない環境、CPUキャラにAI的な移動をさせたい
1
+ スクリプトA通る記述がスクリプトBでエなる【NavMeshAgent2D版使用】
test CHANGED
@@ -1,72 +1,650 @@
1
- ### 前提
2
-
3
-
4
-
5
- ★2月11日追記 CPUキャラに空子オブジェクトを持たせるいうかたち模索中で→[こちら](https://teratail.com/questions/240565)
6
-
7
-
8
-
9
- Unity、C#とも初心者なので至らぬ点あかと思いますがご容赦ください。
10
-
11
- Unityの3Dモードでタテスクロールの、障害物競争のようなゲームを作っています。
12
-
13
- 3Dモードですがz軸は使用していません。
14
-
15
- 具体的に書くと「自機キャラがいて、他に3人ほどCPUがいて、ゴールを目指す。
16
-
17
- スタート→ゴールの走行はy軸。
18
-
19
- 途中、①障害物(当たり判定使用)、②加速アイテム(一定時間速くなる)、そして③アビリティアイテムがある。
20
-
21
- アビリティアイテム→取るととそのキャラごとの必殺技が使えて、他キャラへの妨害などができる。
22
-
23
- CPUも障害物を避けたり加速アイテムやアビリティアイテムを狙ってきたりする。」といったところです。
24
-
25
-
26
-
27
- 今回は「CPUのAI的な移動」について質問致します。
28
-
29
- ### 参考サイト様
30
-
31
- [テラシュール様、当該記事へ](http://tsubakit1.hateblo.jp/entry/2019/11/10/180825)
32
-
33
- ### 発生している問題・エラーメッセージ
34
-
35
- テラシュール様の記事でNavMeshAgentの2D版があると知り、インポートしました。
36
-
37
- 「TileMapで作ったフィールドで地形がBakeできる」とのことで、
38
-
39
- 記事の通りに実装を進めたのですが、以下の問題が発生しています。
40
-
41
-
42
-
43
- 問題1:「TileMapにTileMapCollider2Dをつけること」とあったのでつけた上、
44
-
45
- ・キャラクター達(自機キャラ1人+CPU7人)
46
-
47
- ・ランダム生成されるオブジェクト(障害物、動く障害物、加速アイテム)
48
-
49
- これら全てをkinematicに設定。
50
-
51
- すると全て動くものの、キャラ達とオブジェクトの当たり判定が作用しなくなりました。
52
-
53
- そこでオブジェクトをdynamicしたところ、当たり判定は作用すものの動かなくなりました。
54
-
55
- 結局TileMapCollider2Dをオフにしないと、タイルを敷く前と同じ挙動を取りません。
56
-
57
-
58
-
59
- 問題2:そもそも地形としてベイクできない
60
-
61
- Grid,TileMapをstaticにしていますが、記事の通りベイクを実行しても、タイルが地形としてベイクされません。
62
-
63
- ###実現したいこと
64
-
65
- 「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
66
-
67
- NavMeshAgent以外でもいいと思い、「Unity 敵 AI 2D」などで検索して模索中です。
68
-
69
- もし「作ったことがある」「記事を見かけたことがある」という方がいらっしゃいましたら、お知恵をお借り致したく存じます。
1
+ ###当該スクリプト
2
+
3
+ いきさつを書くと長くなるので、先に問題点だけ書きます。
4
+
5
+ 以下リプAではエラーが出ないのに、BだUnityエラーが出ま
6
+
7
+
8
+
9
+ スクリプトA(メインカメラつけるプレイヤを追いかけスクリプト)
10
+
11
+ ```C#
12
+
13
+ using System.Collections;
14
+
15
+ using System.Collections.Generic;
16
+
17
+ using UnityEngine;
18
+
19
+
20
+
21
+ public class camera : MonoBehaviour
22
+
23
+ {
24
+
25
+ GameObject _player;
26
+
27
+ void Start()
28
+
29
+ {
30
+
31
+ this._player = GameObject.Find("Player");
32
+
33
+ }
34
+
35
+ void Update()
36
+
37
+ {
38
+
39
+ Vector3 _playerPos = this._forCamera.transform.position;
40
+
41
+ transform.position = new Vector3(
42
+
43
+ transform.position.x, _player.transform.position.y, transform.position.z);
44
+
45
+ }
46
+
47
+ }
48
+
49
+ ```
50
+
51
+
52
+
53
+ リプB(A参考にして書いもの。NavMeshAgent2D版を使うにあたり、エージェントオブジェクト←2D画像 と追尾させために書きました。2D画像にアタッチ)
54
+
55
+ ```C#
56
+
57
+ using System.Collections;
58
+
59
+ using System.Collections.Generic;
60
+
61
+ using UnityEngine;
62
+
63
+
64
+
65
+ public class NPC_Surface : MonoBehaviour
66
+
67
+ {
68
+
69
+ GameObject Ri_Nav;//エージェントオブジェクト
70
+
71
+
72
+
73
+ void Start()
74
+
75
+ {
76
+
77
+ this.Ri_Nav = GameObject.Find("Risotto_Nav");//エージェントオブジェクト
78
+
79
+ }
80
+
81
+ void Update()
82
+
83
+ {
84
+
85
+ Vector3 Ri_Nav_pos = this.Ri_Nav.transform.position;
86
+
87
+ transform.position = new Vector3(
88
+
89
+ Ri_Nav_pos.transform.position.x, Ri_Nav_pos.y, transform.position.z);
90
+
91
+ }
92
+
93
+ }
94
+
95
+ ```
96
+
97
+ エラー内容
98
+
99
+ ```
100
+
101
+ CS1061: 'Vector3' does not contain a definition for 'transform' and no accessible extension method 'transform' accepting a first argument of type 'Vector3' could be found
102
+
103
+ ```
104
+
105
+ 同じゲーム内で、Aではエラーが出ないのに、Bではエラーが出ます。
106
+
107
+ 他の方の目をお借りしたく質問致しました。タイポレベルのミスだったらごめんなさい。
108
+
109
+
110
+
111
+ ### 以下、いきさつを書きます
112
+
113
+ 作っているのは非営利目的のあるマンガの二次創作ゲームです。
114
+
115
+ 2Dタテスクロールの障害物競争です。
116
+
117
+ NPCキャラに「障害物を避けつつゴールまで走る」という挙動を取らせたく、
118
+
119
+ [こちら様](http://tsubakit1.hateblo.jp/entry/2019/11/10/180825)を参考に実装しました。
120
+
121
+ NavMeshAgent2D版=タイルマップをもとに地形をベイクし、エージェントで走らせるというものです。
122
+
123
+ 画像のように、地形のベイク及びエージェントの移動までは実装できました。
124
+
125
+ 左の画像の左下のお茶がゴールで、右の画像の左下の緑の四角(見えづらいです)がエージェント本体です。
126
+
127
+ ![イメージ説明](a67dc996b520804a4e5f98347c56cbce.png) ![イメージ説明](dea2a443fd40e68b0c4d0ef16628b2dc.png)
128
+
129
+ 参考サイト様の最後にも書かれているのですが、
130
+
131
+ マップは2Dでもエージェント自体は3Dの扱いなので、
132
+
133
+ 移動に伴い2D環境では必要のない回転などが加わってしまいます。
134
+
135
+ なので、
136
+
137
+ ・キャラの画像(2DUI)にエージェントをつける
138
+
139
+ ・キャラの画像をエージェントオブジェクトの子にする
140
+
141
+ という方法では、キャラの画像がクルクル回ってしまうという不具合が発生しました。
142
+
143
+
144
+
145
+ そこで上記の質問に至るのですが、
146
+
147
+ エージェントオブジェクト←キャラ画像(スクリプトでエージェントオブジェクトの座標を取得し同期)
148
+
149
+ という方法をとりたく、上記のスクリプトを書いたところエラーが出ました。
150
+
151
+ 以下、関係ありそうなスクリプト3つを載せます。
152
+
153
+
154
+
155
+ エージェントオブジェクトのスクリプト
156
+
157
+ ```C#
158
+
159
+ using System.Collections;
160
+
161
+ using System.Collections.Generic;
162
+
163
+ using UnityEngine;
164
+
165
+ using UnityEngine.AI;
166
+
167
+
168
+
169
+ public class NPC_Nav : MonoBehaviour
170
+
171
+ {
172
+
173
+
174
+
175
+ public NavMeshAgent Ri;//エージェントオブジェクト
176
+
177
+ public GameObject target;//ゴール
178
+
179
+
180
+
181
+ void Start()
182
+
183
+ {
184
+
185
+ Ri = gameObject.GetComponent<NavMeshAgent>();
186
+
187
+ }
188
+
189
+
190
+
191
+ void Update()
192
+
193
+ {
194
+
195
+ if (target != null)
196
+
197
+ {
198
+
199
+ Ri.destination = target.transform.position;
200
+
201
+ }
202
+
203
+ }
204
+
205
+ }
206
+
207
+ ```
208
+
209
+
210
+
211
+ NavMeshAgent2D版の、タイルマップにアタッチするスクリプト(自作ではありません)
212
+
213
+ ```C#
214
+
215
+ using UnityEngine;
216
+
217
+ using UnityEngine.AI;
218
+
219
+ using System.Collections.Generic;
220
+
221
+
222
+
223
+ [DefaultExecutionOrder(-200)]
224
+
225
+ [ExecuteAlways]
226
+
227
+ public class NavMeshSourceTag2D : MonoBehaviour
228
+
229
+ {
230
+
231
+ public static List<NavMeshSourceTag2D> tags = new List<NavMeshSourceTag2D>();
232
+
233
+
234
+
235
+ public int area;
236
+
237
+ Collider2D collider2D;
238
+
239
+
240
+
241
+ Mesh cachedMesh;
242
+
243
+ uint shapeHash;
244
+
245
+
246
+
247
+ void OnEnable()
248
+
249
+ {
250
+
251
+ collider2D = GetComponent<Collider2D>();
252
+
253
+ tags.Add(this);
254
+
255
+ }
256
+
257
+
258
+
259
+ void OnDisable()
260
+
261
+ {
262
+
263
+ tags.Remove(this);
264
+
265
+ DestroyMesh();
266
+
267
+ }
268
+
269
+
270
+
271
+ void UpdateCachedMesh()
272
+
273
+ {
274
+
275
+ if (collider2D == null)
276
+
277
+ {
278
+
279
+ DestroyMesh();
280
+
281
+ return;
282
+
283
+ }
284
+
285
+ if (cachedMesh == null)
286
+
287
+ {
288
+
289
+ CreateMesh();
290
+
291
+ return;
292
+
293
+ }
294
+
295
+ if (collider2D.GetShapeHash() != shapeHash)
296
+
297
+ {
298
+
299
+ DestroyMesh();
300
+
301
+ CreateMesh();
302
+
303
+ }
304
+
305
+ }
306
+
307
+
308
+
309
+ void CreateMesh()
310
+
311
+ {
312
+
313
+ cachedMesh = collider2D.CreateMesh(false, false);
314
+
315
+ shapeHash = collider2D.GetShapeHash();
316
+
317
+ }
318
+
319
+
320
+
321
+ void DestroyMesh()
322
+
323
+ {
324
+
325
+ if (cachedMesh == null)
326
+
327
+ return;
328
+
329
+
330
+
331
+ if (Application.isPlaying)
332
+
333
+ {
334
+
335
+ Destroy(cachedMesh);
336
+
337
+ }
338
+
339
+ else
340
+
341
+ {
342
+
343
+ DestroyImmediate(cachedMesh);
344
+
345
+ }
346
+
347
+ shapeHash = 0;
348
+
349
+ }
350
+
351
+
352
+
353
+ // Collect all the navmesh build sources for enabled objects tagged by this component
354
+
355
+ public static void Collect(ref List<NavMeshBuildSource> sources, ref Bounds bounds)
356
+
357
+ {
358
+
359
+ sources.Clear();
360
+
361
+ for (var i = 0; i < tags.Count; ++i)
362
+
363
+ {
364
+
365
+ var tag = tags[i];
366
+
367
+ if (tag == null) continue;
368
+
369
+
370
+
371
+ var collider2D = tag.collider2D;
372
+
373
+ if (collider2D == null) continue;
374
+
375
+ if (!collider2D.enabled) continue;
376
+
377
+
378
+
379
+ tag.UpdateCachedMesh();
380
+
381
+
382
+
383
+ if (tag.cachedMesh == null)
384
+
385
+ continue;
386
+
387
+
388
+
389
+ var colliderBounds = collider2D.bounds;
390
+
391
+ bounds.Encapsulate(colliderBounds.min);
392
+
393
+ bounds.Encapsulate(colliderBounds.max);
394
+
395
+ //bounds.Encapsulate(colliderBounds);
396
+
397
+
398
+
399
+ var buildSource = new NavMeshBuildSource();
400
+
401
+ buildSource.shape = NavMeshBuildSourceShape.Mesh;
402
+
403
+ buildSource.sourceObject = tag.cachedMesh;
404
+
405
+ if (collider2D.attachedRigidbody)
406
+
407
+ {
408
+
409
+ buildSource.transform = Matrix4x4.TRS(collider2D.transform.position, collider2D.transform.rotation, Vector3.one);
410
+
411
+ }
412
+
413
+ else
414
+
415
+ {
416
+
417
+ buildSource.transform = Matrix4x4.identity;
418
+
419
+ }
420
+
421
+ buildSource.area = tag.area;
422
+
423
+ sources.Add(buildSource);
424
+
425
+
426
+
427
+ }
428
+
429
+ }
430
+
431
+ }
432
+
433
+
434
+
435
+ ```
436
+
437
+
438
+
439
+ NavMeshAgent2D版の、マネージャのような空のオブジェクトにアタッチするスクリプト(自作ではありません)
440
+
441
+ ```C#
442
+
443
+ using System.Collections;
444
+
445
+ using System.Collections.Generic;
446
+
447
+ using UnityEngine;
448
+
449
+ using UnityEngine.AI;
450
+
451
+
452
+
453
+ [ExecuteAlways]
454
+
455
+ public class NavMeshBuilder2D : MonoBehaviour
456
+
457
+ {
458
+
459
+ public enum UpdateMethod
460
+
461
+ {
462
+
463
+ Manual,
464
+
465
+ Update,
466
+
467
+ FixedUpdate,
468
+
469
+ }
470
+
471
+
472
+
473
+ public bool bakeOnEnable;
474
+
475
+ public UpdateMethod updateMethod;
476
+
477
+ public bool updateAsync;
478
+
479
+
480
+
481
+ Collider2D[] collider2Ds;
482
+
483
+
484
+
485
+ List<NavMeshBuildSource> buildSources = new List<NavMeshBuildSource>();
486
+
487
+ NavMeshData data;
488
+
489
+ NavMeshDataInstance dataInstance;
490
+
491
+
492
+
493
+ static readonly Quaternion Plane2DRotation = Quaternion.AngleAxis(-90f, Vector3.right);
494
+
495
+ static readonly Quaternion Plane2DRotationInverse = Quaternion.Inverse(Plane2DRotation);
496
+
497
+
498
+
499
+ AsyncOperation buildOperation;
500
+
501
+
502
+
503
+ private void OnEnable()
504
+
505
+ {
506
+
507
+ if (bakeOnEnable)
508
+
509
+ RebuildNavmesh(false);
510
+
511
+ }
512
+
513
+
514
+
515
+ private void OnDisable()
516
+
517
+ {
518
+
519
+ buildOperation = null;
520
+
521
+ dataInstance.Remove();
522
+
523
+ }
524
+
525
+
526
+
527
+ private void Update()
528
+
529
+ {
530
+
531
+ var shouldUpdate = updateMethod == UpdateMethod.Update;
532
+
533
+ #if UNITY_EDITOR
534
+
535
+ shouldUpdate |= (updateMethod == UpdateMethod.FixedUpdate) && !Application.isPlaying;
536
+
537
+ #endif
538
+
539
+ if (shouldUpdate)
540
+
541
+ RebuildNavmesh(updateAsync);
542
+
543
+ }
544
+
545
+
546
+
547
+ private void FixedUpdate()
548
+
549
+ {
550
+
551
+ if (updateMethod == UpdateMethod.FixedUpdate)
552
+
553
+ RebuildNavmesh(updateAsync);
554
+
555
+ }
556
+
557
+
558
+
559
+ public void RebuildNavmesh(bool async)
560
+
561
+ {
562
+
563
+ if (async && buildOperation != null && !buildOperation.isDone)
564
+
565
+ return;
566
+
567
+
568
+
569
+ buildOperation = null;
570
+
571
+
572
+
573
+ var totalBounds = new Bounds();
574
+
575
+ NavMeshSourceTag2D.Collect(ref buildSources, ref totalBounds);
576
+
577
+ var buildSettings = NavMesh.GetSettingsByID(0);
578
+
579
+ var totalBoundsReversed = new Bounds(Plane2DRotationInverse * totalBounds.center, Plane2DRotationInverse * totalBounds.size); // We need to reverse the rotation that's going to be used for baking to get proper bounds
580
+
581
+ var buildBounds = new Bounds(Vector3.zero, Vector3.one * float.MaxValue); //Using enclosing and empty bounds is bugged at the moment - use arbitrarily big one
582
+
583
+ if (!data)
584
+
585
+ {
586
+
587
+ data = NavMeshBuilder.BuildNavMeshData(buildSettings, buildSources, buildBounds, totalBounds.center, Plane2DRotation);
588
+
589
+ }
590
+
591
+ else
592
+
593
+ {
594
+
595
+ if (async)
596
+
597
+ {
598
+
599
+ buildOperation = NavMeshBuilder.UpdateNavMeshDataAsync(data, buildSettings, buildSources, buildBounds);
600
+
601
+ }
602
+
603
+ else
604
+
605
+ {
606
+
607
+ NavMeshBuilder.UpdateNavMeshData(data, buildSettings, buildSources, buildBounds);
608
+
609
+ }
610
+
611
+ }
612
+
613
+
614
+
615
+ dataInstance.Remove();
616
+
617
+ dataInstance = NavMesh.AddNavMeshData(data);
618
+
619
+ }
620
+
621
+
622
+
623
+ private void OnDrawGizmosSelected()
624
+
625
+ {
626
+
627
+ if (!data)
628
+
629
+ return;
630
+
631
+
632
+
633
+ Gizmos.color = Color.cyan;
634
+
635
+ Gizmos.matrix = Matrix4x4.Rotate(data.rotation);
636
+
637
+ Gizmos.DrawWireCube(data.sourceBounds.center, data.sourceBounds.size);
638
+
639
+ }
640
+
641
+ }
642
+
643
+
644
+
645
+ ```
646
+
647
+
70
648
 
71
649
  ### 補足情報(FW/ツールのバージョンなど)
72
650
 
@@ -80,7 +658,7 @@
80
658
 
81
659
  ■ここまで出来ていること
82
660
 
83
- ・プレイヤーキャラクターの移動(AddForce)及びアニメ遷移
661
+ ・プレイヤーキャラクターの移動(AddForce)
84
662
 
85
663
  ・カメラのプレイヤー追従(y軸のみ)
86
664
 
@@ -88,7 +666,7 @@
88
666
 
89
667
  ・加速アイテム実装
90
668
 
91
- Gridを使いTileMapで背景を塗りました。当ゲームおいてはこれがフィールドという概念になります。
669
+ UIよる必殺技カットイン実装
92
670
 
93
671
 
94
672
 

4

自分で模索中に問題が発生し別の質問ページを立てたのでリンクを貼りました。

2020/03/26 00:16

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,8 @@
1
1
  ### 前提
2
+
3
+
4
+
5
+ ★2月11日追記 CPUキャラに空の子オブジェクトを持たせるというかたちで模索中です→[こちら](https://teratail.com/questions/240565)
2
6
 
3
7
 
4
8
 

3

手元で試行したところ問題点が変わったので書き換えました。

2020/02/11 06:48

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
File without changes
test CHANGED
@@ -24,9 +24,7 @@
24
24
 
25
25
  ### 参考サイト様
26
26
 
27
- [テラシュール様](http://tsubakit1.hateblo.jp/entry/2019/11/10/180825)
27
+ [テラシュール様、当該記事へ](http://tsubakit1.hateblo.jp/entry/2019/11/10/180825)
28
-
29
- ②[こちら様](https://qiita.com/aimy-07/items/d1fea617ab9cbb3bd1ed)
30
28
 
31
29
  ### 発生している問題・エラーメッセージ
32
30
 
@@ -38,101 +36,33 @@
38
36
 
39
37
 
40
38
 
41
- 問題1:「TileMapにTileMapCollider2Dをつけること」とあったのでつけた
39
+ 問題1:「TileMapにTileMapCollider2Dをつけること」とあったのでつけた
42
40
 
43
- つけると自機キャラCPUキャラも移動できなくなる。
41
+ ・キャラクター達(自機キャラ1人+CPU7人)
42
+
43
+ ・ランダム生成されるオブジェクト(障害物、動く障害物、加速アイテム)
44
+
45
+ これら全てをkinematicに設定。
46
+
47
+ すると全て動くものの、キャラ達とオブジェクトの当たり判定が作用しなくなりました。
48
+
49
+ そこでオブジェクトをdynamicに戻したところ、当たり判定は作用するものの動かなくなりました。
50
+
51
+ 結局TileMapCollider2Dをオフにしないと、タイルを敷く前と同じ挙動を取りません。
44
52
 
45
53
 
46
54
 
47
- なので、りあえずオフにたところ全キャラ移動できるようにはりました。
55
+ 問題2:そもそも地形としてベイクできな
48
56
 
49
- し、
57
+ Grid,TileMapをstaticにていますが、記事の通りベイクを実行てもタイルが地形としてベイクされません。
50
58
 
59
+ ###実現したいこと
51
60
 
61
+ 「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
52
62
 
53
- 問題2:NavMeshAgentで期待できる挙動を
63
+ NavMeshAgent以外もいい思い、「Unity 敵 AI 2D」どで検索して模索中です
54
64
 
55
-  ・ゴール(画像ファイル)をターゲットにし、staticにチェックも入れているが、初期位置から移動しない。
56
-
57
-   ゴール同じ位置に仮でキューブ作りstaticにてターゲットに指定したそれでも移動ない
65
+ もし「作ったこがある」「記事見かけたことがある」という方がいらっゃいましたお知恵をお借り致たく存じます
58
-
59
-  ・②のサイト様を参考に、ランダム生成する障害物のプレハブにはNavMeshObstacleをつけ、staticにチェックを入れているが、避けようとしない。ぶつかるとそこで止まってしまう。
60
-
61
-
62
-
63
- 問題3:ゲームは動作するものの、
64
-
65
- 「"SetDestination" can only be called on an active agent that has been placed on a NavMesh.UnityEngine.AI.NavMeshAgent:set_destination(Vector3)」
66
-
67
- のエラーメッセージが消えない。
68
-
69
- 元来Vector3で計算されているNavMeshAgentを2Dでやろうとしているからか? とは思うのですが…
70
-
71
- ### CPUキャラにつけているスクリプト
72
-
73
- ```C#
74
-
75
- using System.Collections;
76
-
77
- using System.Collections.Generic;
78
-
79
- using UnityEngine;
80
-
81
- using UnityEngine.AI;
82
-
83
-
84
-
85
- public class CPU02: MonoBehaviour
86
-
87
- {
88
-
89
-
90
-
91
- public NavMeshAgent player;
92
-
93
- public GameObject target;
94
-
95
-
96
-
97
- void Start()
98
-
99
- {
100
-
101
- player = gameObject.GetComponent<NavMeshAgent>();
102
-
103
- }
104
-
105
-
106
-
107
- void Update()
108
-
109
- {
110
-
111
- if (target != null)
112
-
113
- {
114
-
115
- player.destination = target.transform.position;
116
-
117
- }
118
-
119
- }
120
-
121
- }
122
-
123
- ```
124
-
125
- 参考サイト様②のものを丸コピです。
126
-
127
- おそらく「2D仕様でタイルを敷き地形をBakeした環境」に「元来のNavMeshAgent仕様(3D仕様)のスクリプトを持ったキャラ」を走らせているのでうまくいかないのかとは思うのですが、参考サイト様のどちらにも「NavMeshComponent2D版でNavMeshAgentを2Dで使う場合、キャラにつけるスクリプト」は載っていません。
128
-
129
-
130
-
131
- ですが、なんとかして「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
132
-
133
- NavMeshAgent以外の手段があるならそれをとります。
134
-
135
- どうか皆様のお知恵をお借り致したく存じます。
136
66
 
137
67
  ### 補足情報(FW/ツールのバージョンなど)
138
68
 

2

回答がつかないので、質問のしかたを変えました。

2020/02/08 14:34

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
@@ -1 +1 @@
1
- Unity2D CPUキャラ移動に、NavMeshAgentの2D版使いたいが不具合が生じる
1
+ Unity2Dタテスクロール障害物競争 Z軸のない環境で、CPUキャラにAI的な移動をさせたい
test CHANGED
@@ -6,7 +6,11 @@
6
6
 
7
7
  Unityの3Dモードでタテスクロールの、障害物競争のようなゲームを作っています。
8
8
 
9
+ 3Dモードですがz軸は使用していません。
10
+
9
11
  具体的に書くと「自機キャラがいて、他に3人ほどCPUがいて、ゴールを目指す。
12
+
13
+ スタート→ゴールの走行はy軸。
10
14
 
11
15
  途中、①障害物(当たり判定使用)、②加速アイテム(一定時間速くなる)、そして③アビリティアイテムがある。
12
16
 
@@ -28,7 +32,9 @@
28
32
 
29
33
  テラシュール様の記事でNavMeshAgentの2D版があると知り、インポートしました。
30
34
 
35
+ 「TileMapで作ったフィールドで地形がBakeできる」とのことで、
36
+
31
- 記事の通りに実装を進めたのですが、
37
+ 記事の通りに実装を進めたのですが、以下の問題が発生しています。
32
38
 
33
39
 
34
40
 
@@ -62,7 +68,7 @@
62
68
 
63
69
  元来Vector3で計算されているNavMeshAgentを2Dでやろうとしているからか? とは思うのですが…
64
70
 
65
- ### 当該CPUキャラにつけているスクリプト
71
+ ### CPUキャラにつけているスクリプト
66
72
 
67
73
  ```C#
68
74
 
@@ -120,9 +126,13 @@
120
126
 
121
127
  おそらく「2D仕様でタイルを敷き地形をBakeした環境」に「元来のNavMeshAgent仕様(3D仕様)のスクリプトを持ったキャラ」を走らせているのでうまくいかないのかとは思うのですが、参考サイト様のどちらにも「NavMeshComponent2D版でNavMeshAgentを2Dで使う場合、キャラにつけるスクリプト」は載っていません。
122
128
 
123
- ですがなんとかして「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
124
129
 
130
+
131
+ ですが、なんとかして「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
132
+
133
+ NavMeshAgent以外の手段があるならそれをとります。
134
+
125
- 皆様のお知恵をお借り致したく存じます。
135
+ どうか皆様のお知恵をお借り致したく存じます。
126
136
 
127
137
  ### 補足情報(FW/ツールのバージョンなど)
128
138
 
@@ -144,7 +154,7 @@
144
154
 
145
155
  ・加速アイテム実装
146
156
 
147
- ・Gridを使いTileMapで背景を塗りました。当ゲームにおいてはこれが地形という概念になります。
157
+ ・Gridを使いTileMapで背景を塗りました。当ゲームにおいてはこれがフィールドという概念になります。
148
158
 
149
159
 
150
160
 

1

回答がつかないので、タイトルを変えてみました

2020/02/07 02:31

投稿

Kageyama_23457
Kageyama_23457

スコア21

test CHANGED
@@ -1 +1 @@
1
- Unityタテスクロール障害物競争 CPUキャラの移動に、NavMeshComponentsの2D版を使いたい
1
+ Unity2D CPUキャラの移動に、NavMeshAgentの2D版を使いたいが不具合が生じる
test CHANGED
File without changes