Unity 자습서/Navigation

유니티 Navigation Basics #4 - NavMesh Obstacles

개양반 2019. 2. 13.
728x90

오늘 공부할 내용

Nav Mesh Obstacles 컴포넌트를 이용해서 움직이는 장애물을 만들겠습니다. 움직이는 장애물이란 주로 열거나 닫을 수 있는 문, 차단막 등이 있습니다.

 


Nav Mesh Obstacles 설명

움직이는 장애물을 만들려면 오브젝트에 NavMeshObstacles 컴포넌트를 추가해야합니다.

 

Shape :  지오메트리 모양을 설정합니다. 박스와 캡슐 2개의 형태가 있습니다.

Center, Radius, Height 는 지오메트리의 위치, 넓이, 높이 값을 설정합니다.

Carve : 위 장애물의 모양만큼 의해 네비메시에 영향을 줄 지를 설정합니다.  활성화 되어 있으면 해당 오브젝트의 모양만큼 네비메시에 구멍이 뚫립니다. 비활성화 되어 있으면 콜라이더 박스처럼 됩니다. 이동하는 개체(에이전트)가 해당 오브젝트를 회피하는 동작을 최소화합니다.

Move Threshold : 움직이는 파인 구멍을 업데이트하는 임계 거리를 설정하는 데 사용합니다. 장애물이 Move Threshold에 설정한 거리보다 많이 움직인 경우 움직인다고 간주합니다. 

Time To Stationary : 장애물이 정지되었다고 간주할 때까지 기다리는 시간(초)입니다.

Carve Only Stationary : 활성화하면 장애물이 정지되어 있을 때만 구멍을 팝니다.

 


움직이는 장애물 만들기

■ ObstacleMove.cs 작성

Scripts 폴더에 C# 스크립트 ObstacleMove.cs 를 만들고 아래 코드를 작성하세요.

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

public class ObstacleMove : MonoBehaviour
{
    // 이동 범위
    [SerializeField]
    private int moveRange = 5;

    // 이동 속도
    [SerializeField]
    private float speed = 2;

    // 이동 지연
    [SerializeField]
    private float moveMaxDelay, moveCurDelay = 5;

    // 이동중인 거리
    private float movingDistance = 0;

    // 이동 가능 여부
    bool isMove = true;
        

    void Update()
    {
        if(isMove)
        {
            // 오브젝트 이동
            transform.Translate(Vector3.left * speed * Time.deltaTime);

            // 이동한 거리만큼 moveDistance 값 수정
            movingDistance += speed * Time.deltaTime;

            if (Mathf.Abs(movingDistance) > moveRange)
            {
                isMove = false;
                transform.Rotate(new Vector3(0, 180, 0));
            }
        }

        else
        {
            // 지연 시간 체크
            moveCurDelay -= Time.deltaTime;
            if(moveCurDelay <= 0)
            {
                // 지연시간이 종료되면 이동가능하게 변경
                movingDistance = 0;
                moveCurDelay = moveMaxDelay;
                isMove = true;
            }
        }
    }
}
 

#코드 설명

좌우로 움직이며, 목적지에 도착하면 지연 시간 이후에 다시 움직이도록 만들었습니다. 

 

 

■ Sheep 오브젝트 배치

Prefabs\Characters\Sheep 을 Hierarchy 뷰로 드레그 앤 드롭합니다. Player 앞쪽에 배치시킵니다.

 

Rotation을 모두 0 으로 만들어주세요.

 

■ Sheep 에 컴포넌트 추가

Sheep 오브젝트에 Nav Mesh Obstacle 과 ObstacleMove.cs 를 컴포넌트로 추가합니다.

컴포넌트의 각 변수들에게 원하는 값을 입력하세요.

 


테스트하기

Nav Mesh Obstacle 의 값들을 변경해서 네비메시가 어떻게 변경되는지 확인해봅시다.

 


Youtube 영상

https://youtu.be/ewubZ7yk2qo

댓글

💲 추천 글