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

質問編集履歴

7

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

2020/03/30 01:41

投稿

Kageyama_23457
Kageyama_23457

スコア21

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

6

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

2020/03/30 01:41

投稿

Kageyama_23457
Kageyama_23457

スコア21

title CHANGED
File without changes
body CHANGED
@@ -42,7 +42,7 @@
42
42
  {
43
43
  Vector3 Ri_Nav_pos = this.Ri_Nav.transform.position;
44
44
  transform.position = new Vector3(
45
- Ri_Nav_pos.transform.position.x, Ri_Nav_pos.y, transform.position.z);
45
+ Ri_Nav_pos.transform.position.x, Ri_Nav_pos.transform.position.y, transform.position.z);
46
46
  }
47
47
  }
48
48
  ```

5

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

2020/03/29 04:37

投稿

Kageyama_23457
Kageyama_23457

スコア21

title CHANGED
@@ -1,1 +1,1 @@
1
- Unity2Dタテスクロール障害物競争 Z軸のない環境、CPUキャラにAI的移動をさせたい
1
+ スクリプトA通る記述がスクリプトBでエになる【NavMeshAgent2D版使用】
body CHANGED
@@ -1,49 +1,338 @@
1
- ### 前提
1
+ ###当該スクリプト
2
+ いきさつを書くと長くなるので、先に問題点だけ書きます。
3
+ 以下のスクリプトAではエラーが出ないのに、BだとUnityでエラーが出ます。
2
4
 
5
+ スクリプトA(メインカメラにつける、プレイヤを追いかけるスクリプト)
6
+ ```C#
7
+ using System.Collections;
3
- ★2月11日追記 CPUキャラに空の子オブジェクトを持たせるというかたちで模索中です→[こちら](https://teratail.com/questions/240565)
8
+ using System.Collections.Generic;
9
+ using UnityEngine;
4
10
 
5
- Unity、C#ともに初心者なので、至らぬ点あるかと思いますがご容赦ください。
11
+ public class camera : MonoBehaviour
6
- Unityの3Dモードでタテスクロールの、障害物競争のようなゲームを作っています。
12
+ {
7
- 3Dモードですがz軸は使用していません。
13
+ GameObject _player;
8
- 具体的に書くと「自機キャラがいて、他に3人ほどCPUがいて、ゴールを目指す。
9
- スタート→ゴールの走行はy軸。
14
+ void Start()
15
+ {
10
- 途中、①障害物(当たり判定使用)、②加速アイテム(一定時間速くなる)、そして③アビリティアイテムがある。
16
+ this._player = GameObject.Find("Player");
17
+ }
11
- アビリティアイテム→取るととそのキャラごとの必殺技が使えて、他キャラへの妨害などができる。
18
+ void Update()
19
+ {
12
- CPUも障害物を避けたり加速アイテムやアビリティアイテムを狙ってきたりする。」といったところです。
20
+ Vector3 _playerPos = this._forCamera.transform.position;
21
+ transform.position = new Vector3(
22
+ transform.position.x, _player.transform.position.y, transform.position.z);
23
+ }
24
+ }
25
+ ```
13
26
 
14
- 今回は「CPUのAI的な移動」について質問致します。
15
- ### 参考サイト様
16
- [テラシュール様、当該記事へ](http://tsubakit1.hateblo.jp/entry/2019/11/10/180825)
17
- ### 発生している問題・エラーメッセージ
18
- テラシュール様記事でNavMeshAgentの2Dると知り、インポートました。
27
+ スクリプトB(Aを参考にして書いたも。NavMeshAgent2Dを使うにり、ジェンオブジェクト←2D画像 と追尾させるために書きました。2D画像にアタッチ)
28
+ ```C#
29
+ using System.Collections;
19
- 「TileMapで作ったフィールドで地形がBakeできる」とのことで、
30
+ using System.Collections.Generic;
20
- 記事の通りに実装を進めたのですが、以下の問題が発生しています。
31
+ using UnityEngine;
21
32
 
33
+ public class NPC_Surface : MonoBehaviour
34
+ {
22
- 問題1:「TileMapにTileMapCollider2Dをつけること」とあったのでつけた上、
35
+ GameObject Ri_Nav;//エージェントオブジェクト
23
- ・キャラクター達(自機キャラ1人+CPU7人)
24
- ・ランダム生成されるオブジェクト(障害物、動く障害物、加速アイテム)
25
- これら全てをkinematicに設定。
26
- すると全て動くものの、キャラ達とオブジェクトの当たり判定が作用しなくなりました。
27
- そこでオブジェクトをdynamicに戻したところ、当たり判定は作用するものの動かなくなりました。
28
- 結局TileMapCollider2Dをオフにしないと、タイルを敷く前と同じ挙動を取りません。
29
36
 
30
- 問題2:そもそも地形としてベイクできない
31
- Grid,TileMapをstaticにしていますが、記事の通りベイクを実行しても、タイルが地形としてベイクされません。
32
- ###実現したいこと
33
- 「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
34
- NavMeshAgent以外でもいいと思い、「Unity 敵 AI 2D」などで検索して模索中です。
35
- もし「作ったことがある」「記事を見かけたことがある」という方がいらっしゃいましたら、お知恵をお借り致したく存じます。
37
+ void Start()
38
+ {
39
+ this.Ri_Nav = GameObject.Find("Risotto_Nav");//エージェントオブジェクト
40
+ }
41
+ void Update()
42
+ {
43
+ Vector3 Ri_Nav_pos = this.Ri_Nav.transform.position;
44
+ transform.position = new Vector3(
45
+ Ri_Nav_pos.transform.position.x, Ri_Nav_pos.y, transform.position.z);
46
+ }
47
+ }
48
+ ```
49
+ エラー内容
50
+ ```
51
+ 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
52
+ ```
53
+ 同じゲーム内で、Aではエラーが出ないのに、Bではエラーが出ます。
54
+ 他の方の目をお借りしたく質問致しました。タイポレベルのミスだったらごめんなさい。
55
+
56
+ ### 以下、いきさつを書きます
57
+ 作っているのは非営利目的のあるマンガの二次創作ゲームです。
58
+ 2Dタテスクロールの障害物競争です。
59
+ NPCキャラに「障害物を避けつつゴールまで走る」という挙動を取らせたく、
60
+ [こちら様](http://tsubakit1.hateblo.jp/entry/2019/11/10/180825)を参考に実装しました。
61
+ NavMeshAgent2D版=タイルマップをもとに地形をベイクし、エージェントで走らせるというものです。
62
+ 画像のように、地形のベイク及びエージェントの移動までは実装できました。
63
+ 左の画像の左下のお茶がゴールで、右の画像の左下の緑の四角(見えづらいです)がエージェント本体です。
64
+ ![イメージ説明](a67dc996b520804a4e5f98347c56cbce.png) ![イメージ説明](dea2a443fd40e68b0c4d0ef16628b2dc.png)
65
+ 参考サイト様の最後にも書かれているのですが、
66
+ マップは2Dでもエージェント自体は3Dの扱いなので、
67
+ 移動に伴い2D環境では必要のない回転などが加わってしまいます。
68
+ なので、
69
+ ・キャラの画像(2DUI)にエージェントをつける
70
+ ・キャラの画像をエージェントオブジェクトの子にする
71
+ という方法では、キャラの画像がクルクル回ってしまうという不具合が発生しました。
72
+
73
+ そこで上記の質問に至るのですが、
74
+ エージェントオブジェクト←キャラ画像(スクリプトでエージェントオブジェクトの座標を取得し同期)
75
+ という方法をとりたく、上記のスクリプトを書いたところエラーが出ました。
76
+ 以下、関係ありそうなスクリプト3つを載せます。
77
+
78
+ エージェントオブジェクトのスクリプト
79
+ ```C#
80
+ using System.Collections;
81
+ using System.Collections.Generic;
82
+ using UnityEngine;
83
+ using UnityEngine.AI;
84
+
85
+ public class NPC_Nav : MonoBehaviour
86
+ {
87
+
88
+ public NavMeshAgent Ri;//エージェントオブジェクト
89
+ public GameObject target;//ゴール
90
+
91
+ void Start()
92
+ {
93
+ Ri = gameObject.GetComponent<NavMeshAgent>();
94
+ }
95
+
96
+ void Update()
97
+ {
98
+ if (target != null)
99
+ {
100
+ Ri.destination = target.transform.position;
101
+ }
102
+ }
103
+ }
104
+ ```
105
+
106
+ NavMeshAgent2D版の、タイルマップにアタッチするスクリプト(自作ではありません)
107
+ ```C#
108
+ using UnityEngine;
109
+ using UnityEngine.AI;
110
+ using System.Collections.Generic;
111
+
112
+ [DefaultExecutionOrder(-200)]
113
+ [ExecuteAlways]
114
+ public class NavMeshSourceTag2D : MonoBehaviour
115
+ {
116
+ public static List<NavMeshSourceTag2D> tags = new List<NavMeshSourceTag2D>();
117
+
118
+ public int area;
119
+ Collider2D collider2D;
120
+
121
+ Mesh cachedMesh;
122
+ uint shapeHash;
123
+
124
+ void OnEnable()
125
+ {
126
+ collider2D = GetComponent<Collider2D>();
127
+ tags.Add(this);
128
+ }
129
+
130
+ void OnDisable()
131
+ {
132
+ tags.Remove(this);
133
+ DestroyMesh();
134
+ }
135
+
136
+ void UpdateCachedMesh()
137
+ {
138
+ if (collider2D == null)
139
+ {
140
+ DestroyMesh();
141
+ return;
142
+ }
143
+ if (cachedMesh == null)
144
+ {
145
+ CreateMesh();
146
+ return;
147
+ }
148
+ if (collider2D.GetShapeHash() != shapeHash)
149
+ {
150
+ DestroyMesh();
151
+ CreateMesh();
152
+ }
153
+ }
154
+
155
+ void CreateMesh()
156
+ {
157
+ cachedMesh = collider2D.CreateMesh(false, false);
158
+ shapeHash = collider2D.GetShapeHash();
159
+ }
160
+
161
+ void DestroyMesh()
162
+ {
163
+ if (cachedMesh == null)
164
+ return;
165
+
166
+ if (Application.isPlaying)
167
+ {
168
+ Destroy(cachedMesh);
169
+ }
170
+ else
171
+ {
172
+ DestroyImmediate(cachedMesh);
173
+ }
174
+ shapeHash = 0;
175
+ }
176
+
177
+ // Collect all the navmesh build sources for enabled objects tagged by this component
178
+ public static void Collect(ref List<NavMeshBuildSource> sources, ref Bounds bounds)
179
+ {
180
+ sources.Clear();
181
+ for (var i = 0; i < tags.Count; ++i)
182
+ {
183
+ var tag = tags[i];
184
+ if (tag == null) continue;
185
+
186
+ var collider2D = tag.collider2D;
187
+ if (collider2D == null) continue;
188
+ if (!collider2D.enabled) continue;
189
+
190
+ tag.UpdateCachedMesh();
191
+
192
+ if (tag.cachedMesh == null)
193
+ continue;
194
+
195
+ var colliderBounds = collider2D.bounds;
196
+ bounds.Encapsulate(colliderBounds.min);
197
+ bounds.Encapsulate(colliderBounds.max);
198
+ //bounds.Encapsulate(colliderBounds);
199
+
200
+ var buildSource = new NavMeshBuildSource();
201
+ buildSource.shape = NavMeshBuildSourceShape.Mesh;
202
+ buildSource.sourceObject = tag.cachedMesh;
203
+ if (collider2D.attachedRigidbody)
204
+ {
205
+ buildSource.transform = Matrix4x4.TRS(collider2D.transform.position, collider2D.transform.rotation, Vector3.one);
206
+ }
207
+ else
208
+ {
209
+ buildSource.transform = Matrix4x4.identity;
210
+ }
211
+ buildSource.area = tag.area;
212
+ sources.Add(buildSource);
213
+
214
+ }
215
+ }
216
+ }
217
+
218
+ ```
219
+
220
+ NavMeshAgent2D版の、マネージャのような空のオブジェクトにアタッチするスクリプト(自作ではありません)
221
+ ```C#
222
+ using System.Collections;
223
+ using System.Collections.Generic;
224
+ using UnityEngine;
225
+ using UnityEngine.AI;
226
+
227
+ [ExecuteAlways]
228
+ public class NavMeshBuilder2D : MonoBehaviour
229
+ {
230
+ public enum UpdateMethod
231
+ {
232
+ Manual,
233
+ Update,
234
+ FixedUpdate,
235
+ }
236
+
237
+ public bool bakeOnEnable;
238
+ public UpdateMethod updateMethod;
239
+ public bool updateAsync;
240
+
241
+ Collider2D[] collider2Ds;
242
+
243
+ List<NavMeshBuildSource> buildSources = new List<NavMeshBuildSource>();
244
+ NavMeshData data;
245
+ NavMeshDataInstance dataInstance;
246
+
247
+ static readonly Quaternion Plane2DRotation = Quaternion.AngleAxis(-90f, Vector3.right);
248
+ static readonly Quaternion Plane2DRotationInverse = Quaternion.Inverse(Plane2DRotation);
249
+
250
+ AsyncOperation buildOperation;
251
+
252
+ private void OnEnable()
253
+ {
254
+ if (bakeOnEnable)
255
+ RebuildNavmesh(false);
256
+ }
257
+
258
+ private void OnDisable()
259
+ {
260
+ buildOperation = null;
261
+ dataInstance.Remove();
262
+ }
263
+
264
+ private void Update()
265
+ {
266
+ var shouldUpdate = updateMethod == UpdateMethod.Update;
267
+ #if UNITY_EDITOR
268
+ shouldUpdate |= (updateMethod == UpdateMethod.FixedUpdate) && !Application.isPlaying;
269
+ #endif
270
+ if (shouldUpdate)
271
+ RebuildNavmesh(updateAsync);
272
+ }
273
+
274
+ private void FixedUpdate()
275
+ {
276
+ if (updateMethod == UpdateMethod.FixedUpdate)
277
+ RebuildNavmesh(updateAsync);
278
+ }
279
+
280
+ public void RebuildNavmesh(bool async)
281
+ {
282
+ if (async && buildOperation != null && !buildOperation.isDone)
283
+ return;
284
+
285
+ buildOperation = null;
286
+
287
+ var totalBounds = new Bounds();
288
+ NavMeshSourceTag2D.Collect(ref buildSources, ref totalBounds);
289
+ var buildSettings = NavMesh.GetSettingsByID(0);
290
+ 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
291
+ var buildBounds = new Bounds(Vector3.zero, Vector3.one * float.MaxValue); //Using enclosing and empty bounds is bugged at the moment - use arbitrarily big one
292
+ if (!data)
293
+ {
294
+ data = NavMeshBuilder.BuildNavMeshData(buildSettings, buildSources, buildBounds, totalBounds.center, Plane2DRotation);
295
+ }
296
+ else
297
+ {
298
+ if (async)
299
+ {
300
+ buildOperation = NavMeshBuilder.UpdateNavMeshDataAsync(data, buildSettings, buildSources, buildBounds);
301
+ }
302
+ else
303
+ {
304
+ NavMeshBuilder.UpdateNavMeshData(data, buildSettings, buildSources, buildBounds);
305
+ }
306
+ }
307
+
308
+ dataInstance.Remove();
309
+ dataInstance = NavMesh.AddNavMeshData(data);
310
+ }
311
+
312
+ private void OnDrawGizmosSelected()
313
+ {
314
+ if (!data)
315
+ return;
316
+
317
+ Gizmos.color = Color.cyan;
318
+ Gizmos.matrix = Matrix4x4.Rotate(data.rotation);
319
+ Gizmos.DrawWireCube(data.sourceBounds.center, data.sourceBounds.size);
320
+ }
321
+ }
322
+
323
+ ```
324
+
36
325
  ### 補足情報(FW/ツールのバージョンなど)
37
326
  ■作業環境
38
327
  Mac Sierra10.12.6(4GB)
39
328
  Unity2019.3.f06
40
329
 
41
330
  ■ここまで出来ていること
42
- ・プレイヤーキャラクターの移動(AddForce)及びアニメ遷移
331
+ ・プレイヤーキャラクターの移動(AddForce)
43
332
  ・カメラのプレイヤー追従(y軸のみ)
44
333
  ・オブジェクトのランダム座標生成、及びランダムな方向への移動
45
334
  ・加速アイテム実装
46
- Gridを使いTileMapで背景を塗りました。当ゲームおいてはこれがフィールドという概念になります。
335
+ UIよる必殺技カットイン実装
47
336
 
48
337
  ここまで同じゲームで質問させて頂き、解決に至るご教授を頂いておりますので、
49
338
  そちらのページも貼っておきます。

4

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

2020/03/26 00:16

投稿

Kageyama_23457
Kageyama_23457

スコア21

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,7 @@
1
1
  ### 前提
2
2
 
3
+ ★2月11日追記 CPUキャラに空の子オブジェクトを持たせるというかたちで模索中です→[こちら](https://teratail.com/questions/240565)
4
+
3
5
  Unity、C#ともに初心者なので、至らぬ点あるかと思いますがご容赦ください。
4
6
  Unityの3Dモードでタテスクロールの、障害物競争のようなゲームを作っています。
5
7
  3Dモードですがz軸は使用していません。

3

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

2020/02/11 06:48

投稿

Kageyama_23457
Kageyama_23457

スコア21

title CHANGED
File without changes
body CHANGED
@@ -11,61 +11,26 @@
11
11
 
12
12
  今回は「CPUのAI的な移動」について質問致します。
13
13
  ### 参考サイト様
14
- [テラシュール様](http://tsubakit1.hateblo.jp/entry/2019/11/10/180825)
14
+ [テラシュール様、当該記事へ](http://tsubakit1.hateblo.jp/entry/2019/11/10/180825)
15
- ②[こちら様](https://qiita.com/aimy-07/items/d1fea617ab9cbb3bd1ed)
16
15
  ### 発生している問題・エラーメッセージ
17
16
  テラシュール様の記事でNavMeshAgentの2D版があると知り、インポートしました。
18
17
  「TileMapで作ったフィールドで地形がBakeできる」とのことで、
19
18
  記事の通りに実装を進めたのですが、以下の問題が発生しています。
20
19
 
21
- 問題1:「TileMapにTileMapCollider2Dをつけること」とあったのでつけた
20
+ 問題1:「TileMapにTileMapCollider2Dをつけること」とあったのでつけた
22
- つけると自機キャラもCPUキャラも移動できなくなる。
21
+ キャラクター達(自機キャラ1人+CPU7人)
22
+ ・ランダム生成されるオブジェクト(障害物、動く障害物、加速アイテム)
23
+ これら全てをkinematicに設定。
24
+ すると全て動くものの、キャラ達とオブジェクトの当たり判定が作用しなくなりました。
25
+ そこでオブジェクトをdynamicに戻したところ、当たり判定は作用するものの動かなくなりました。
26
+ 結局TileMapCollider2Dをオフにしないと、タイルを敷く前と同じ挙動を取りません。
23
27
 
24
- なので、とりあえずオフにしたところ全キャラ移動できるようにはなりました。
25
- しかし、
26
-
27
- 問題2:NavMeshAgent期待でる挙動をとらない
28
+ 問題2:そもそも地形としてベイクできない
28
-  ・ゴール(画像ファイル)をターゲットにし、staticにチェックも入れているが、初期位置から移動しない。
29
-   ゴールと同じ位置に仮でキューブ作りstaticにしてターゲットに指定したが、それで移動ない
29
+ Grid,TileMapをstaticにしていますが、記事の通りベイクを実行して、タイルが地形とてベイクされません
30
-  ・②のサイト様を参考に、ランダム生成する障害物のプレハブにはNavMeshObstacleをつけ、staticにチェックを入れているが、避けようとしない。ぶつかるとそこで止まってしまう。
31
-
32
- 問題3:ゲームは動作するものの、
33
- 「"SetDestination" can only be called on an active agent that has been placed on a NavMesh.UnityEngine.AI.NavMeshAgent:set_destination(Vector3)」
34
- のエラーメッセージが消えない。
35
- 元来Vector3で計算されているNavMeshAgentを2Dでやろうとしているからか? とは思うのですが…
36
- ### CPUキャラにつけているスクリプト
37
- ```C#
38
- using System.Collections;
39
- using System.Collections.Generic;
40
- using UnityEngine;
41
- using UnityEngine.AI;
42
-
43
- public class CPU02: MonoBehaviour
44
- {
45
-
46
- public NavMeshAgent player;
47
- public GameObject target;
48
-
49
- void Start()
30
+ ###実現したいこと
50
- {
51
- player = gameObject.GetComponent<NavMeshAgent>();
52
- }
53
-
54
- void Update()
55
- {
56
- if (target != null)
57
- {
58
- player.destination = target.transform.position;
59
- }
60
- }
61
- }
62
- ```
63
- 参考サイト様②のものを丸コピです。
64
- おそらく「2D仕様でタイルを敷き地形をBakeした環境」に「元来のNavMeshAgent仕様(3D仕様)のスクリプトを持ったキャラ」を走らせているのでうまくいかないのかとは思うのですが、参考サイト様のどちらにも「NavMeshComponent2D版でNavMeshAgentを2Dで使う場合、キャラにつけるスクリプト」は載っていません。
65
-
66
- ですが、なんとかして「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
31
+ 「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
67
- NavMeshAgent以外の手段があるならそれをります。
32
+ NavMeshAgent以外でもいい思い、「Unity 敵 AI 2D」などで検索して模索中です。
68
- どう皆様のお知恵をお借り致したく存じます。
33
+ もし「作ったことがある」「記事を見けたことがある」という方がいらっしゃいましたら、お知恵をお借り致したく存じます。
69
34
  ### 補足情報(FW/ツールのバージョンなど)
70
35
  ■作業環境
71
36
  Mac Sierra10.12.6(4GB)

2

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

2020/02/08 14:34

投稿

Kageyama_23457
Kageyama_23457

スコア21

title CHANGED
@@ -1,1 +1,1 @@
1
- Unity2D CPUキャラ移動に、NavMeshAgentの2D版使いたいが不具合が生じる
1
+ Unity2Dタテスクロール障害物競争 Z軸のない環境で、CPUキャラにAI的な移動をさせたい
body CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  Unity、C#ともに初心者なので、至らぬ点あるかと思いますがご容赦ください。
4
4
  Unityの3Dモードでタテスクロールの、障害物競争のようなゲームを作っています。
5
+ 3Dモードですがz軸は使用していません。
5
6
  具体的に書くと「自機キャラがいて、他に3人ほどCPUがいて、ゴールを目指す。
7
+ スタート→ゴールの走行はy軸。
6
8
  途中、①障害物(当たり判定使用)、②加速アイテム(一定時間速くなる)、そして③アビリティアイテムがある。
7
9
  アビリティアイテム→取るととそのキャラごとの必殺技が使えて、他キャラへの妨害などができる。
8
10
  CPUも障害物を避けたり加速アイテムやアビリティアイテムを狙ってきたりする。」といったところです。
@@ -13,7 +15,8 @@
13
15
  ②[こちら様](https://qiita.com/aimy-07/items/d1fea617ab9cbb3bd1ed)
14
16
  ### 発生している問題・エラーメッセージ
15
17
  テラシュール様の記事でNavMeshAgentの2D版があると知り、インポートしました。
18
+ 「TileMapで作ったフィールドで地形がBakeできる」とのことで、
16
- 記事の通りに実装を進めたのですが、
19
+ 記事の通りに実装を進めたのですが、以下の問題が発生しています。
17
20
 
18
21
  問題1:「TileMapにTileMapCollider2Dをつけること」とあったのでつけたが、
19
22
  つけると自機キャラもCPUキャラも移動できなくなる。
@@ -30,7 +33,7 @@
30
33
  「"SetDestination" can only be called on an active agent that has been placed on a NavMesh.UnityEngine.AI.NavMeshAgent:set_destination(Vector3)」
31
34
  のエラーメッセージが消えない。
32
35
  元来Vector3で計算されているNavMeshAgentを2Dでやろうとしているからか? とは思うのですが…
33
- ### 当該CPUキャラにつけているスクリプト
36
+ ### CPUキャラにつけているスクリプト
34
37
  ```C#
35
38
  using System.Collections;
36
39
  using System.Collections.Generic;
@@ -59,8 +62,10 @@
59
62
  ```
60
63
  参考サイト様②のものを丸コピです。
61
64
  おそらく「2D仕様でタイルを敷き地形をBakeした環境」に「元来のNavMeshAgent仕様(3D仕様)のスクリプトを持ったキャラ」を走らせているのでうまくいかないのかとは思うのですが、参考サイト様のどちらにも「NavMeshComponent2D版でNavMeshAgentを2Dで使う場合、キャラにつけるスクリプト」は載っていません。
65
+
62
- ですがなんとかして「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
66
+ ですがなんとかして「2Dタテスクロール競争で、障害物を避けつつ、さらにできれば有益なアイテムを狙いつつ、ゴールまで走るCPU」を実装したいです。
67
+ NavMeshAgent以外の手段があるならそれをとります。
63
- 皆様のお知恵をお借り致したく存じます。
68
+ どうか皆様のお知恵をお借り致したく存じます。
64
69
  ### 補足情報(FW/ツールのバージョンなど)
65
70
  ■作業環境
66
71
  Mac Sierra10.12.6(4GB)
@@ -71,7 +76,7 @@
71
76
  ・カメラのプレイヤー追従(y軸のみ)
72
77
  ・オブジェクトのランダム座標生成、及びランダムな方向への移動
73
78
  ・加速アイテム実装
74
- ・Gridを使いTileMapで背景を塗りました。当ゲームにおいてはこれが地形という概念になります。
79
+ ・Gridを使いTileMapで背景を塗りました。当ゲームにおいてはこれがフィールドという概念になります。
75
80
 
76
81
  ここまで同じゲームで質問させて頂き、解決に至るご教授を頂いておりますので、
77
82
  そちらのページも貼っておきます。

1

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

2020/02/07 02:31

投稿

Kageyama_23457
Kageyama_23457

スコア21

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