Unityナビゲーション経路探索システムと描画ガイドライン

序文

経路探索システムは、ゲームでよく使われる機能です。ある地点に到達するには、経路を与える必要があります。これにより、プレイヤーは経路を計画し、到着を促すことができます。この機能は、さまざまなタイプで広く使用されています。ゲームのアプリケーション

このケースでNavigationは、Line Rendererコンポーネントを使用して、経路探索システムを実装する際にインジケーターラインを識別します。最終的な効果の図は次のとおりです。

ここに画像の説明を挿入

実装プロセス

1.ナビゲーションを使用してシーンをベイクします

自動経路探索の機能を実現するためには、まず、シーンの基本設定を行い、可動領域と非可動領域をシステムが認識できるようにする必要があります。Navigationナビゲーションシステムの判断条件は次のとおりです。静的オブジェクトに基づいています。動的オブジェクトを判断する場合は、応答コンポーネントを追加する必要があります。

オブジェクトを静的に設定するには、最初にシーン内の静的な地面と障害物を選択し、Unityエディターのインスペクターパネルの左上隅にある静的オプションの逆三角形を選択して、ナビゲーション静的をチェックします。
ここに画像の説明を挿入
次に、シーンを実行するためのナビゲーションパネルベイクするには、上から下に2つのベイクをクリックします。図の青い領域はキャラクターの移動可能な領域であり、青い領域は交差できない領域です。関連する障害:

ベーキングに関する具体的な詳細は、次の記事に記載されています。

ここに画像の説明を挿入

2.ロールに応答コンポーネントを追加します

役割は、経路探索およびインジケータライン機能を追加する必要が達成できることを確実にするためにNav Mesh Agent、およびLine Renderer二つの成分:

まずNav Mesh Agent、パラメータ調整はキャラクターのパス設定を実現する必要があります。この場合、コンポーネントのパラメータ調整は主に2つの側面があります。1つ目は速度です。値を設定すると動きが変わる可能性があります。速度、もう1つは加速度です。、ターゲットが変化すると速度のサイズが変化します。

2番目の要素Line Rendererはこの場合の焦点であり、その主な機能は3次元シーンに線を引くことです。この機能を使用することにより、キャラクターが移動するパスを描くことができ、オブジェクトのナビゲーション機能を実現できます。実現しました。

LIneRandererについて

  • Line Rendererコンポーネントは、3次元空間内の2つ以上のポイントの配列を受け入れ、各ポイント間に直線を描画します。ラインレンダラーを使用して、単純な直線から複雑なスパイラルまで、あらゆるものを描画できます。線は常に連続しています。2つ以上の完全に独立した線を描画する必要がある場合は、それぞれが独自の線レンダラーを持つ複数のゲームオブジェクトを使用する必要があります。ラインレンダラーは、ピクセル幅のラインをレンダリングしません。レンダリングするポリゴンの幅はワールド単位です。ラインレンダラーは、トレイルレンダラーと同じラインレンダリングアルゴリズムを使用します。

この場合、コンポーネントを追加した後、最初にマテリアルを追加する必要があります。マテリアルでマテリアルの数を設定し、マテリアルを追加して、幅の幅を調整できます。具体的な調整を図に示します。
ここに画像の説明を挿入

3.ナビゲーションを実現するために2つのコンポーネントを呼び出すスクリプトを記述します

スクリプトを介して2つのコンポーネントを接続し、最初に独自のメソッドを使用して機能を完了し、Navigation組み合わせた光線を使用して衝突を検出し、クリックした位置へのキャラクターの移動を完了します。Line Rendererコンポーネントは、取得した一連のポイント間に線を引き、2つの組み合わせを完了します。 2つの間でNavigationは、コンポーネントの指定された機能を介してナビゲーション中に一連のターニングポイントを取得し、それらをLine Renderer割り当てて、線画機能を完了します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class FindRode : MonoBehaviour
{
    
    
    private NavMeshAgent agent;
    private LineRenderer line;
    // Start is called before the first frame update
    void Start()
    {
    
    
        agent = GetComponent<NavMeshAgent>();
        line = GetComponent<LineRenderer>();        
    }
    // Update is called once per frame
    void Update()
    {
    
    
        if(Input.GetMouseButtonDown(1))
        {
    
    
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray,out hit,500))
            {
    
    
                if(hit.transform.tag=="ground")
                {
    
    
                    agent.SetDestination(hit.point);
                }
            }
            
        }
        //如果导航里面的点大于1
        if(agent.path.corners.Length>1)
        {
    
    
        	//画线的点位等于导航的点位
            line.positionCount = agent.path.corners.Length;
            line.SetPositions(agent.path.corners);
        }
    }
}

この2つの組み合わせは、If判定にあります。agent.path.corners.Length属性を介して描画する必要のあるポイントの数を知るSetPositions()ことができ、すべての座標を取得できる配列を介して、2つの隣接するポイントの間に描画できます。

おすすめ

転載: blog.csdn.net/xinzhilinger/article/details/113540207