UnitynavMeshAgent自動パスファインディングの停止と更新の問題について



About Stop Update Problem Unity Navmeshagent Automatic Pathfinding



この2日間は私を殺すことができます。それは明らかに非常に単純な質問です。私は基本的な本質を理解していませんでした。終わったらとても悪いことだと思っただけです。私も解決策を共有しました。メソッドは非常に低いです。

まず第一に、navMeshAgentプラグインの簡単な紹介は、実際には、ベーキングがどこに行くか、どこに行けないかを決定できる後、最短の最適パスを見つけるためのa *アルゴリズムです。



どのオブジェクトがパスを見つけてそれにNavMesh Agentコンポーネントを追加する必要があるかは、主にステアリングの下のパラメーターを導入します。1つはパスファインディング速度、最大加速度、角速度、および制動距離です。これらのパラメータは、パスファインディングをより洗練されたものにすることができ、自分で調整するときに使用することをお勧めします。



使用する前にシーンをベイクする必要があります

「ウィンドウ」-「ナビゲーション」で、「ナビゲーション」ウィンドウを開きます



私のシーンの手すりなど、通過が許可されていない場所を確認し、通過できる場所を選択して、[ナビゲーション]でベイク処理する[ベイク]パネルを選択します。

ジャンプしない場合、offMeshLinksの生成はチェックされません。

次に、コード部分があります(コードは検索する必要のあるオブジェクトに記述されています)

プライベートNavMeshAgent男
パブリックトランスフォームターゲット

まず、NavMeshAgentの変数と、ターゲットポイントの変数を定義する必要があります。

man = gameObject.GetComponent()

start関数でこの変数に値を割り当てます。

IEnumerator AINavMesh() { while (true) { if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) > 5f) { man.SetDestination(target.position) transform.GetComponent().Play('run')//Play character walking animation / / Enable bloodline script gameObject.GetComponent().enabled = true mage.gameObject.GetComponent().enabled = true //() transform.LookAt(mage.transform) meaningless yield return StartCoroutine(AIFollowHero()) } } } IEnumerator AIFollowHero() { while (true) { /* if (mage != null) { transform.LookAt(mage.transform) transform.GetComponent().Play('run')//Play character run animation Vector3 dir = mage.transform.position - transform.position transform.Translate(dir.normalized * Time.deltaTime * speed * 0.8f, Space.World) } */ transform.GetComponent().Play('run') if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) <= 1.5f) { // transform.LookAt(mage.transform) man.isStopped = true transform.GetComponent().Play('attack') qiang.GetComponent().enabled = true i = 1 yield return new WaitForSeconds(2f) } else if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position)> 1.5f) { //transform.LookAt(mage.transform) // transform.GetComponent().Play('run')//Play character run animation man.isStopped=false man.SetDestination(target.position) } transform.LookAt(mage.transform) yield return new WaitForEndOfFrame() } }

2番目のコルーチンを直接言えば、これが実際には距離の判断です。主人公に到達したら、検索を停止する必要があります。そうでなければ、常に主人公の下の位置に行きたいので、あなたは常に主人公を殴るでしょう、それでそれは非常に違法です。主人公が離れている場合は、シャットダウンを停止し、主人公の現在位置を目標点としてリセットしてください。そうしないと、兵士は目標位置を更新しません。

ここでのman.isStoppedは、特定のバージョンの後に変更されたAPIであり、man.Stop()close、man.Resume()である必要があります。もちろん、現在のパスをクリアするなど、まだ多くの関数があります。これは、自分でAPIをチェックする必要があります。インターネット上にはまだ多くのチュートリアルがあります。道を見つけると、MOBAゲームも実現できます。 。