Unity 내비게이션 길 찾기 시스템 및 그리기 지침

머리말

길 찾기 시스템은 게임에서 매우 일반적으로 사용되는 기능입니다. 특정 지점에 도달하려면 시스템이 길을 제공해야합니다. 이것은 플레이어가 길을 계획하고 플레이어가 도착하도록 촉구하는 데 도움이 될 수 있습니다.이 기능은 다양한 유형에서 널리 사용됩니다. 게임.

이 사례 Navigation는 경로 찾기 시스템을 구현하는 동안 Line Renderer구성 요소를 사용하여 표시기 라인을 식별합니다. 최종 효과 그림은 다음과 같습니다.

여기에 사진 설명 삽입

구현 프로세스

1. 내비게이션을 사용하여 장면 굽기

자동 경로 찾기 기능을 구현하기 위해서는 먼저 어떤 것이 이동 가능한 영역인지 아닌지를 시스템이 인식 할 수 있도록 장면의 기본 설정을 구성해야합니다. Navigation내비게이션 시스템의 판단 조건은 다음과 같습니다. 정적 객체를 기반으로합니다. 동적 객체를 판단하려면 응답 구성 요소를 추가해야합니다.

오브젝트를 정적으로 설정하려면 먼저 장면에서 정적지면과 장애물을 선택하고 Unity 편집기의 Inspector 패널 왼쪽 상단 모서리에있는 Static 옵션의 반전 된 삼각형을 선택한
여기에 사진 설명 삽입
다음 Navigation Static을 확인합니다. 다음으로 장면을 수행하기위한 탐색 패널 베이킹하려면 위에서 아래로 두 개의 Bake를 클릭합니다. 그림에서 파란색 영역은 캐릭터의 이동 가능한 영역이고 파란색이 아닌 영역은 교차 할 수없는 영역입니다. 관련 장애물 :

베이킹에 대한 자세한 내용은 다음 기사에서 찾을 수 있습니다.

여기에 사진 설명 삽입

2. 역할에 응답 구성 요소 추가

역할을 달성 할 수 있도록 길 찾기 및 표시기 라인 기능을 추가 Nav Mesh Agent하고 Line Renderer두 가지 구성 요소를 추가해야합니다 .

우선 Nav Mesh Agent매개 변수 조정을 위해서는 캐릭터의 경로 설정을 구현해야합니다.이 경우 컴포넌트의 매개 변수 조정은 주로 두 가지 측면에 있습니다. 첫 번째는 속도입니다. 값을 설정하면 움직임이 변경 될 수 있습니다. 속도, 다른 하나는 가속도입니다., 목표가 변경 될 때 속도가 변경되는 크기

두 번째 구성 요소 Line Renderer는이 경우의 초점입니다. 주요 기능은 3 차원 장면에서 선을 그리는 것입니다.이 기능을 사용하면 캐릭터가 이동할 경로를 그릴 수 있으므로 객체의 내비게이션 기능이 깨달았다.

LIne Randerer 정보

  • Line Renderer 구성 요소는 3 차원 공간에서 두 개 이상의 점 배열을 받아들이고 각 점 사이에 직선을 그립니다. 라인 렌더러를 사용하여 단순한 직선에서 복잡한 나선에 이르기까지 무엇이든 그릴 수 있습니다. 선은 항상 연속적입니다. 두 개 이상의 완전히 독립적 인 선을 그려야하는 경우 각각 고유 한 선 렌더러가있는 여러 게임 개체를 사용해야합니다. 라인 렌더러는 픽셀 너비의 라인을 렌더링하지 않습니다. 렌더링되는 폴리곤의 너비는 월드 단위입니다. 라인 렌더러는 Trail 렌더러와 동일한 라인 렌더링 알고리즘을 사용합니다.

이 경우 컴포넌트를 추가 한 후 먼저 머티리얼을 추가해야합니다. 머티리얼에서 머티리얼 수를 설정하고 머티리얼을 추가하고 너비를 조정할 수 있습니다. 특정 조정은 그림에 나와 있습니다.
여기에 사진 설명 삽입

3. 탐색을 수행하기 위해 두 개의 구성 요소를 호출하는 스크립트 작성

스크립트를 통해 두 구성 요소를 연결하고, 먼저 자체 방법을 사용하여 기능을 완료하고, Navigation결합 된 광선을 사용하여 충돌을 감지하여 캐릭터가 클릭 한 위치로 이동을 완료하고, Line Renderer구성 요소는 획득 한 일련의 점 사이에 선을 그려 두 가지를 완성합니다. 둘 사이에는 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);
        }
    }
}

둘 사이의 조합은 If 판정 agent.path.corners.Length에 있으며 , 속성을 통해 그려야하는 포인트의 수를 알 SetPositions()수 있고 모든 좌표를 얻을 수있는 배열을 통해 인접한 두 포인트 사이에 그릴 수 있습니다.

추천

출처blog.csdn.net/xinzhilinger/article/details/113540207