質問編集履歴
3
とくになし
test
CHANGED
File without changes
|
test
CHANGED
@@ -299,183 +299,3 @@
|
|
299
299
|
```
|
300
300
|
|
301
301
|
これを私のAlien_move(作業7で追加したコード)のStart()に入れたところ、_typeが未定義ということで弾かれてしまいました。
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
##自己解決
|
308
|
-
|
309
|
-
回答してくれた方には申し訳ないのですが、そもそもやり方が違いました。
|
310
|
-
|
311
|
-
これから見てくれる方のために、うまくいったやり方を残しておきます。
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
> 1.アドオンをDL、解凍、設置
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
https://github.com/h8man/NavMeshPlus
|
320
|
-
|
321
|
-
↑のURLのGitLabのページから入手できるアドオンをDL、解凍、Assetの欄に置いてください。
|
322
|
-
|
323
|
-
本文の☆のデータが残っていると、データが競合して動かなくなるので、消去してください。
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
> 2.マップを設置
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
この工程が少々面倒です。
|
332
|
-
|
333
|
-
まず、地面、歩ける場所となる部分をTilemapを用いて作成します。
|
334
|
-
|
335
|
-
もし、障害物、壁などを追加したい場合は、二枚目のTilemapを用いてそれらを設置してください。(タイルマップごとで判定してNavMeshを作っているようなので、見た目は壁でも全部歩けるようになってしまします。)
|
336
|
-
|
337
|
-
ここでは、地面となるTilemapをGroud、壁のみを描いたTilemapをWallと呼びます。
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
> 3.NavMeshModifireを各Tilemapにアタッチ
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
作業1でインストールしたアドオンの中にNavMeshModifireというナニか(勉強不足でごめんなさい。)があるので、それを各Tilemapにアタッチします。コンポーネントの追加画面で検索をかければ出てきます。
|
346
|
-
|
347
|
-
ここで、いずれもOverrideAreaにチェックをいれます。すると、AreaTypeという欄が増えるので、歩け所が描かれているマップにはWalkable、歩けない場所、壁や障害物が設置されてるマップにはNotWalkableを設定します。今回はGroundをWalkable、WallをNotWalkableに設定します。
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
> 4.空のオブジェクトを作成
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
> 5.作業4で作ったオブジェクトにNavMeshSurface2dをアタッチ
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
NavMeshSurfaceとは別物なので注意です。NavMeshModifire同様、検索をかければすぐ出てきます。
|
362
|
-
|
363
|
-
まず要素の下の方にある、RotateSurfaceToXYをクリックします。すると、オブジェクトのTransform欄の回転の値が「-90.00001」になることを確認してください。
|
364
|
-
|
365
|
-
つぎにOverrideByGridと、CompressBoundsにチェックを入れてください。
|
366
|
-
|
367
|
-
最後にBakeを押すと、メッシュが生成されます。
|
368
|
-
|
369
|
-
ちゃんと、歩ける場所と壁が分かれてメッシュが生成されているか確認してください。
|
370
|
-
|
371
|
-
メッシュは青っぽいアミアミになってるのでわかりやすいと思います。
|
372
|
-
|
373
|
-
また、メッシュはNavMeshSurface2dがアタッチされているオブジェクトを選択しているときと、ナビゲーションウインドウを開いているときしか見えないので、注意してください。
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
> 6.動かすオブジェクト、追われるオブジェクトを作成し、タグをつける
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
マップの作製より先にやってもいいですが、今回は説明のために順番を付けています。
|
382
|
-
|
383
|
-
今回は追われるオブジェクトをPlayer、Playerを追うオブジェクトをAlienとします。
|
384
|
-
|
385
|
-
それらにタグを付けます。(付けなくても恐らく動きはしますが、今回私がうまくいった方法を説明しています。)
|
386
|
-
|
387
|
-
タグ自体は何でもいいですが、私はPlayerにPlayer、AlienにEnemyを付けました。
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
> 7.オブジェクトを動かすためのスクリプト作成
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
今回私のはAlien_moveにしました。
|
396
|
-
|
397
|
-
```C# (Alien_move)
|
398
|
-
|
399
|
-
using System.Collections;
|
400
|
-
|
401
|
-
using System.Collections.Generic;
|
402
|
-
|
403
|
-
using UnityEngine;
|
404
|
-
|
405
|
-
using UnityEngine.AI;
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
public class Alien_move : MonoBehaviour
|
410
|
-
|
411
|
-
{
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
[SerializeField] Transform target;
|
416
|
-
|
417
|
-
private NavMeshAgent agent;
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
void Start()
|
422
|
-
|
423
|
-
{
|
424
|
-
|
425
|
-
target = GameObject.FindGameObjectWithTag("Player").transform;
|
426
|
-
|
427
|
-
agent = GetComponent<NavMeshAgent>();
|
428
|
-
|
429
|
-
agent.updateRotation = false;
|
430
|
-
|
431
|
-
agent.updateUpAxis = false;
|
432
|
-
|
433
|
-
}
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
void Update()
|
438
|
-
|
439
|
-
{
|
440
|
-
|
441
|
-
agent.SetDestination(target.position);
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
}
|
446
|
-
|
447
|
-
}
|
448
|
-
|
449
|
-
```
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
Playerのところは、付けたタグに応じて変更してください。
|
454
|
-
|
455
|
-
書けたらこのスクリプトを保存、動かしたいオブジェクトにアタッチしてください。今回はAlienにアタッチします。
|
456
|
-
|
457
|
-
また、これのインスペクター画面のTargetに追いかけたいオブジェクトを入れます。
|
458
|
-
|
459
|
-
今回はPlayerをいれます。
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
> 8.動かしたいオブジェクトにNavMeshAgentをアタッチ
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
ここは何もいじる必要はありません。
|
468
|
-
|
469
|
-
でも、ここの値が動くための速度だったりするので、いじりたい人は勝手にどうぞ。
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
> 9.テスト
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
実際に再生して、動かしてみましょう。
|
478
|
-
|
479
|
-
ちゃんと動くことが確認できると思います。
|
480
|
-
|
481
|
-
今回は割愛しましたが、Playerを動けるようにすると、ちゃんと動いた先に動くようになります。
|
2
自己解決
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
**1/7 : 追記しました。**
|
2
2
|
|
3
|
-
|
3
|
+
**1/9 : 自己解決しました。**
|
4
4
|
|
5
5
|
###初めに
|
6
6
|
|
@@ -299,3 +299,183 @@
|
|
299
299
|
```
|
300
300
|
|
301
301
|
これを私のAlien_move(作業7で追加したコード)のStart()に入れたところ、_typeが未定義ということで弾かれてしまいました。
|
302
|
+
|
303
|
+
|
304
|
+
|
305
|
+
|
306
|
+
|
307
|
+
##自己解決
|
308
|
+
|
309
|
+
回答してくれた方には申し訳ないのですが、そもそもやり方が違いました。
|
310
|
+
|
311
|
+
これから見てくれる方のために、うまくいったやり方を残しておきます。
|
312
|
+
|
313
|
+
|
314
|
+
|
315
|
+
> 1.アドオンをDL、解凍、設置
|
316
|
+
|
317
|
+
|
318
|
+
|
319
|
+
https://github.com/h8man/NavMeshPlus
|
320
|
+
|
321
|
+
↑のURLのGitLabのページから入手できるアドオンをDL、解凍、Assetの欄に置いてください。
|
322
|
+
|
323
|
+
本文の☆のデータが残っていると、データが競合して動かなくなるので、消去してください。
|
324
|
+
|
325
|
+
|
326
|
+
|
327
|
+
> 2.マップを設置
|
328
|
+
|
329
|
+
|
330
|
+
|
331
|
+
この工程が少々面倒です。
|
332
|
+
|
333
|
+
まず、地面、歩ける場所となる部分をTilemapを用いて作成します。
|
334
|
+
|
335
|
+
もし、障害物、壁などを追加したい場合は、二枚目のTilemapを用いてそれらを設置してください。(タイルマップごとで判定してNavMeshを作っているようなので、見た目は壁でも全部歩けるようになってしまします。)
|
336
|
+
|
337
|
+
ここでは、地面となるTilemapをGroud、壁のみを描いたTilemapをWallと呼びます。
|
338
|
+
|
339
|
+
|
340
|
+
|
341
|
+
> 3.NavMeshModifireを各Tilemapにアタッチ
|
342
|
+
|
343
|
+
|
344
|
+
|
345
|
+
作業1でインストールしたアドオンの中にNavMeshModifireというナニか(勉強不足でごめんなさい。)があるので、それを各Tilemapにアタッチします。コンポーネントの追加画面で検索をかければ出てきます。
|
346
|
+
|
347
|
+
ここで、いずれもOverrideAreaにチェックをいれます。すると、AreaTypeという欄が増えるので、歩け所が描かれているマップにはWalkable、歩けない場所、壁や障害物が設置されてるマップにはNotWalkableを設定します。今回はGroundをWalkable、WallをNotWalkableに設定します。
|
348
|
+
|
349
|
+
|
350
|
+
|
351
|
+
> 4.空のオブジェクトを作成
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
|
356
|
+
|
357
|
+
> 5.作業4で作ったオブジェクトにNavMeshSurface2dをアタッチ
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
NavMeshSurfaceとは別物なので注意です。NavMeshModifire同様、検索をかければすぐ出てきます。
|
362
|
+
|
363
|
+
まず要素の下の方にある、RotateSurfaceToXYをクリックします。すると、オブジェクトのTransform欄の回転の値が「-90.00001」になることを確認してください。
|
364
|
+
|
365
|
+
つぎにOverrideByGridと、CompressBoundsにチェックを入れてください。
|
366
|
+
|
367
|
+
最後にBakeを押すと、メッシュが生成されます。
|
368
|
+
|
369
|
+
ちゃんと、歩ける場所と壁が分かれてメッシュが生成されているか確認してください。
|
370
|
+
|
371
|
+
メッシュは青っぽいアミアミになってるのでわかりやすいと思います。
|
372
|
+
|
373
|
+
また、メッシュはNavMeshSurface2dがアタッチされているオブジェクトを選択しているときと、ナビゲーションウインドウを開いているときしか見えないので、注意してください。
|
374
|
+
|
375
|
+
|
376
|
+
|
377
|
+
> 6.動かすオブジェクト、追われるオブジェクトを作成し、タグをつける
|
378
|
+
|
379
|
+
|
380
|
+
|
381
|
+
マップの作製より先にやってもいいですが、今回は説明のために順番を付けています。
|
382
|
+
|
383
|
+
今回は追われるオブジェクトをPlayer、Playerを追うオブジェクトをAlienとします。
|
384
|
+
|
385
|
+
それらにタグを付けます。(付けなくても恐らく動きはしますが、今回私がうまくいった方法を説明しています。)
|
386
|
+
|
387
|
+
タグ自体は何でもいいですが、私はPlayerにPlayer、AlienにEnemyを付けました。
|
388
|
+
|
389
|
+
|
390
|
+
|
391
|
+
> 7.オブジェクトを動かすためのスクリプト作成
|
392
|
+
|
393
|
+
|
394
|
+
|
395
|
+
今回私のはAlien_moveにしました。
|
396
|
+
|
397
|
+
```C# (Alien_move)
|
398
|
+
|
399
|
+
using System.Collections;
|
400
|
+
|
401
|
+
using System.Collections.Generic;
|
402
|
+
|
403
|
+
using UnityEngine;
|
404
|
+
|
405
|
+
using UnityEngine.AI;
|
406
|
+
|
407
|
+
|
408
|
+
|
409
|
+
public class Alien_move : MonoBehaviour
|
410
|
+
|
411
|
+
{
|
412
|
+
|
413
|
+
|
414
|
+
|
415
|
+
[SerializeField] Transform target;
|
416
|
+
|
417
|
+
private NavMeshAgent agent;
|
418
|
+
|
419
|
+
|
420
|
+
|
421
|
+
void Start()
|
422
|
+
|
423
|
+
{
|
424
|
+
|
425
|
+
target = GameObject.FindGameObjectWithTag("Player").transform;
|
426
|
+
|
427
|
+
agent = GetComponent<NavMeshAgent>();
|
428
|
+
|
429
|
+
agent.updateRotation = false;
|
430
|
+
|
431
|
+
agent.updateUpAxis = false;
|
432
|
+
|
433
|
+
}
|
434
|
+
|
435
|
+
|
436
|
+
|
437
|
+
void Update()
|
438
|
+
|
439
|
+
{
|
440
|
+
|
441
|
+
agent.SetDestination(target.position);
|
442
|
+
|
443
|
+
|
444
|
+
|
445
|
+
}
|
446
|
+
|
447
|
+
}
|
448
|
+
|
449
|
+
```
|
450
|
+
|
451
|
+
|
452
|
+
|
453
|
+
Playerのところは、付けたタグに応じて変更してください。
|
454
|
+
|
455
|
+
書けたらこのスクリプトを保存、動かしたいオブジェクトにアタッチしてください。今回はAlienにアタッチします。
|
456
|
+
|
457
|
+
また、これのインスペクター画面のTargetに追いかけたいオブジェクトを入れます。
|
458
|
+
|
459
|
+
今回はPlayerをいれます。
|
460
|
+
|
461
|
+
|
462
|
+
|
463
|
+
> 8.動かしたいオブジェクトにNavMeshAgentをアタッチ
|
464
|
+
|
465
|
+
|
466
|
+
|
467
|
+
ここは何もいじる必要はありません。
|
468
|
+
|
469
|
+
でも、ここの値が動くための速度だったりするので、いじりたい人は勝手にどうぞ。
|
470
|
+
|
471
|
+
|
472
|
+
|
473
|
+
> 9.テスト
|
474
|
+
|
475
|
+
|
476
|
+
|
477
|
+
実際に再生して、動かしてみましょう。
|
478
|
+
|
479
|
+
ちゃんと動くことが確認できると思います。
|
480
|
+
|
481
|
+
今回は割愛しましたが、Playerを動けるようにすると、ちゃんと動いた先に動くようになります。
|
1
回答にて指摘された部分の変更と、それによるエラーの報告
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
**1/7 : 追記しました。**
|
2
|
+
|
3
|
+
|
4
|
+
|
1
5
|
###初めに
|
2
6
|
|
3
7
|
Unity2Dで、プレイヤーを追いかける敵キャラを作りたいと考え、NavMeshAgentを使ってみました。
|
@@ -223,3 +227,75 @@
|
|
223
227
|
長文失礼いたしました。
|
224
228
|
|
225
229
|
よろしくお願いしたします。
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
###追記
|
234
|
+
|
235
|
+
返答をいただいた方から、ご指摘を頂きました。
|
236
|
+
|
237
|
+
作業4で作ったGameObjectのNavMeshBuilder2DのBakeOnEnableにチェックを入れていませんでした。
|
238
|
+
|
239
|
+
また、マップが正常に生成されているかどうかを見るためによりデコボコしたマップでメッシュを生成したときの画像を添付します。
|
240
|
+
|
241
|
+
![イメージ説明](9f89e0cdbfd5c78ebb66338c7bd34513.png)
|
242
|
+
|
243
|
+
|
244
|
+
|
245
|
+
また、この変更により新しい警告が出てきたので、追記させていただきます。
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
> Failed to create agent because it is not close enough to the NavMesh
|
250
|
+
|
251
|
+
UnityEngine.AI.NavMesh:AddNavMeshData(NavMeshData)
|
252
|
+
|
253
|
+
NavMeshBuilder2D:RebuildNavmesh(Boolean) (at Assets/NavMeshComponents-2019.3-2D/Assets/NavMeshComponents/Scripts/NavMeshBuilder2D.cs:88)
|
254
|
+
|
255
|
+
NavMeshBuilder2D:OnEnable() (at Assets/NavMeshComponents-2019.3-2D/Assets/NavMeshComponents/Scripts/NavMeshBuilder2D.cs:34)
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
やはり推察通り、agentがNavmeshを正常に確認できていないようです。
|
260
|
+
|
261
|
+
このエラーを調べたところ、次の解決策でうまくいったという方がいたので、試してみました。
|
262
|
+
|
263
|
+
1.ベースオフセットの値を変える
|
264
|
+
|
265
|
+
2.NavMeshBuilder2Dの更新方法を手動から更新にする
|
266
|
+
|
267
|
+
3.NavMeshSurfaceを追加し、そこでBakeする
|
268
|
+
|
269
|
+
これをした後に実行してみると、以下のエラーが増えました。
|
270
|
+
|
271
|
+
> ArgumentException: The Object you want to instantiate is null.
|
272
|
+
|
273
|
+
UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at <480508088aee40cab70818ff164a29d5>:0)
|
274
|
+
|
275
|
+
UnityEngine.Object.Instantiate[T] (T original) (at <480508088aee40cab70818ff164a29d5>:0)
|
276
|
+
|
277
|
+
Alien_move.Start () (at Assets/Scenes/Scripts/Enemy/Alien_move.cs:15)
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
また、TilemapにNavMeshSurfaceを追加し、そこでBakeすると治った方がいるようなので試してみましたが、結果は変わりませんでした。
|
282
|
+
|
283
|
+
というのも、その方はAgentTypeが既定?のHumanoid以外で実行されており、この方法はそれを解消する方法らしいです。私はそのままHumanoidを使っているので、効果はないみたいです。
|
284
|
+
|
285
|
+
|
286
|
+
|
287
|
+
また、以下のコードを追記することで治った方がいるようです。
|
288
|
+
|
289
|
+
```C#
|
290
|
+
|
291
|
+
GameObject _prefab = (GameObject)Resources.Load ("Characters/" + _type);
|
292
|
+
|
293
|
+
GameObject _character = Instantiate (_prefab);
|
294
|
+
|
295
|
+
_character.GetComponent<NavMeshAgent> ().enabled = true;
|
296
|
+
|
297
|
+
|
298
|
+
|
299
|
+
```
|
300
|
+
|
301
|
+
これを私のAlien_move(作業7で追加したコード)のStart()に入れたところ、_typeが未定義ということで弾かれてしまいました。
|