1/7 : 追記しました。
1/9 : 自己解決しました。
###初めに
Unity2Dで、プレイヤーを追いかける敵キャラを作りたいと考え、NavMeshAgentを使ってみました。
しかし、参考にするサイトがいずれも3Dの場合で、私の環境とは異なるので、なかなかうまくいかなかったのですが、こちらの2019-2Dのコードを見つけました。(以下、☆とする)
以下、私が実行したことを列挙します。
また、今回は**「宇宙飛行士(Player)にインベーダー(AlienSpaceship)が追いかけてくる」**という状況をつくろうとしています。
1.タイルマップを設置
:今回はテストですので、障害物はないマップを作りました
2.GridごとTilemapを静的に変更
3.GridのTilemapにTilemapCollider2Dと、☆からDLしたNavMeshSourceTag2Dを付与
4.空のGameObjctを作成し、それに☆からDLしたNavMeshBuider2Dを付与。
5.値をなにもいじらずにそこのBakeをクリック。
:なぜかコンソールにエラーが残っているとうまくBakeできなかったので、コンソールをリセットしました。
6.ナビゲーションウインドウを開くと、マップ全体が青がかっていました。
:これでメッシュは正常に生成されていると思います。
7.インベーダー(AlienSpaceship)に次のスクリプトを付与
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.AI; 5 6public class Alien_move: MonoBehaviour 7{ 8 //追いかける目標、今回はPlayer。 9 public GameObject target; 10 11 //毎フレームルートを考えることで、無駄なく動かせるようにする 12 void Update() 13 { 14 //agentを作成 15 NavMeshAgent agent = GetComponent<NavMeshAgent>(); 16 //目標をtargetに設定 17 agent.destination = target.transform.position; 18 19 } 20}
8.インベーダーのインスペクター画面で、targetにPlayerをアタッチし、NavMeshAgentを付与
9.ゲームを起動
10.警告とエラーが多数が吐かれ、インベーダーが動かないので手動で停止
警告は
Failed to create agent because there is no valid NavMesh
エラーは
"SetDestination" can only be called on an active agent that has been placed on a NavMesh.
UnityEngine.AI.NavMeshAgent:set_destination(Vector3)
Alien_move:Update() (at Assets/Scenes/Scripts/Enemy/Alien_move.cs:17)
###問題点:
警告の内容から、そもそもNavMeshが生成されていないようです。しかし、6の作業でNavMeshが生成されていることが確認できているので、矛盾しています。
メッシュはできていることが確認出来ていて、かつインベーダーにも動けるようなコードを与えていることから、インベーダーの方ができているメッシュを認識できていないと考えます。
また、調べてもどの記事も3Dで解説されている上に、☆のスクリプトを用いている記事が少ない。
###解決するためにやるべきだと考えていること:
もしかしたら、何かレイヤーの違いのようなもので、情報共有ができていないのではないかと考えます。ですので、そのねじれを解くことが問題解決のカギになると考えています。
==========
###試した解決策:
・TilemapCllider2Dの「トリガーにする」と「エフェクターで使用」にチェック
・NavMeshSourceTag2DのAreaの値を変更
・インベイダーのUpdate内の作業を、開始から10秒後に動作するように変更
:警告はすぐ出たが、10秒後にエラーを吐き始めた
・エージェントタイプをデフォルトであった、Humanoidから、自作の適当なエージェントに変更。
・デフォルトであった、Humanoidの値を大きくしたり、小さくしたりした
いずれも、同じように警告とエラーを吐いて終わりました。
###補足:
ナビゲーションウインドウのBakeを押しても反応しませんでした。
###質問内容:
まずは、私のエラーへの見解があっているかどうか。つぎに、やるべきことがあっているかどうか。
最後に、どうやってやるべきことを実行するか。
ついでに、もし普通のNavMeshを2D環境で使う方法があるならそれを教えていただけると嬉しいです。
長文失礼いたしました。
よろしくお願いしたします。
###追記
返答をいただいた方から、ご指摘を頂きました。
作業4で作ったGameObjectのNavMeshBuilder2DのBakeOnEnableにチェックを入れていませんでした。
また、マップが正常に生成されているかどうかを見るためによりデコボコしたマップでメッシュを生成したときの画像を添付します。
また、この変更により新しい警告が出てきたので、追記させていただきます。
Failed to create agent because it is not close enough to the NavMesh
UnityEngine.AI.NavMesh:AddNavMeshData(NavMeshData)
NavMeshBuilder2D:RebuildNavmesh(Boolean) (at Assets/NavMeshComponents-2019.3-2D/Assets/NavMeshComponents/Scripts/NavMeshBuilder2D.cs:88)
NavMeshBuilder2D:OnEnable() (at Assets/NavMeshComponents-2019.3-2D/Assets/NavMeshComponents/Scripts/NavMeshBuilder2D.cs:34)
やはり推察通り、agentがNavmeshを正常に確認できていないようです。
このエラーを調べたところ、次の解決策でうまくいったという方がいたので、試してみました。
1.ベースオフセットの値を変える
2.NavMeshBuilder2Dの更新方法を手動から更新にする
3.NavMeshSurfaceを追加し、そこでBakeする
これをした後に実行してみると、以下のエラーが増えました。
ArgumentException: The Object you want to instantiate is null.
UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at <480508088aee40cab70818ff164a29d5>:0)
UnityEngine.Object.Instantiate[T] (T original) (at <480508088aee40cab70818ff164a29d5>:0)
Alien_move.Start () (at Assets/Scenes/Scripts/Enemy/Alien_move.cs:15)
また、TilemapにNavMeshSurfaceを追加し、そこでBakeすると治った方がいるようなので試してみましたが、結果は変わりませんでした。
というのも、その方はAgentTypeが既定?のHumanoid以外で実行されており、この方法はそれを解消する方法らしいです。私はそのままHumanoidを使っているので、効果はないみたいです。
また、以下のコードを追記することで治った方がいるようです。
C#
1GameObject _prefab = (GameObject)Resources.Load ("Characters/" + _type); 2GameObject _character = Instantiate (_prefab); 3_character.GetComponent<NavMeshAgent> ().enabled = true; 4
これを私のAlien_move(作業7で追加したコード)のStart()に入れたところ、_typeが未定義ということで弾かれてしまいました。
回答1件
あなたの回答
tips
プレビュー