인프런 커뮤니티 질문&답변

임석신님의 프로필 이미지
임석신

작성한 질문수

따라하면서 배우는 고박사의 유니티 기초

Navigation Mesh 응용 (15:47)

NavigationMesh 응용 질문있어요

작성

·

433

0

해당 그림처럼 플레이어 오브젝트가 더이상 움직이지 않게됩니다...

 

using System.Collections;

using UnityEngine;

using UnityEngine.AI;

public class OffMeshLinkClimb : MonoBehaviour

{

[SerializeField]

private int offMeshArea = 3; //오프메시 구역 ( Climb)

[SerializeField]

private float climbSpeed = 1.5f; //오르내리는 이동 속도

private NavMeshAgent navMeshAgent;

private void Awake()

{

navMeshAgent = GetComponent<NavMeshAgent>();

}

IEnumerable Start()

{

while (true)

{

// IsOnClimb() 함수의 반환 값이 true일 때 까지 반복 호출

yield return new WaitUntil(() => IsOnClimb());

// 올라가거나 내려오는 행동

// 위에가 true 가 되면 ClimbOrDescend() 가 실행된다

yield return StartCoroutine(ClimbOrDescend());

}

}

public bool IsOnClimb()

{

// 현재 위치에 있는 OffMeshLink에 있는지 ( true / false )

if (navMeshAgent.isOnOffMeshLink)

{

// 현재 위치에 있는 OffMeshLink의 데이

OffMeshLinkData linkData = navMeshAgent.currentOffMeshLinkData;

//설명 : navMeshAgent.currentOffMeshLinkData.offMeshLink 가

// true 이면 수동으로 생성한 OffMeshLink

// false 면 자동으로 생성한 OffMeshLink

// 현재 위치에 잇는 OffMeshLink가 수동으로 생성한 OffMeshLink 이고, 장소 정보가 "Climb"이면

if ( linkData.offMeshLink != null && linkData.offMeshLink.area == offMeshArea)

{

return true;

}

}

return false;

}

private IEnumerator ClimbOrDescend()

{

// 네비게이션을 이용한 이동을 잠시 중지한다

navMeshAgent.isStopped = true;

// 현재 위치에 있는 OffMeshLink의 시작 / 종료 위치

OffMeshLinkData linkData = navMeshAgent.currentOffMeshLinkData;

Vector3 start = linkData.startPos;

Vector3 end = linkData.endPos;

// 오르내리는 시간 설정

float climbTime = Mathf.Abs(end.y - start.y) / climbSpeed;

float currentTime = 0.0f;

float percent = 0.0f;

while ( percent < 1)

{

// 단순히 deltaTime만 더하면 무조건 1초 후에 percent가 1이 되기 때문에

// climbTime 변수를 연산해서 시간을 조절한다

currentTime += Time.deltaTime;

percent = currentTime/climbTime;

// 시간 경과(최대 1) 에 따라 오브젝트의 위치를 바꿔준다

transform.position = Vector3.Lerp(start, end, percent);

yield return null;

}

// OffMeshLink를 이용한 이동 완료

navMeshAgent.CompleteOffMeshLink();

// OffMeshLink 이동이 완료되었으니 네비게이션을 이용한 이동을 다시 시작한다

navMeshAgent.isStopped = false;

}

}

 

스크립트를 정말 똑같이 적었는데도 이런 이유를 모르겠어요 ...

답변 1

0

고박사님의 프로필 이미지
고박사
지식공유자

스크립트가 정말 똑같이 작성되어 있다면 사다리의 시작, 종료 지점으로 사용하는 오브젝트 위치를 확인해보세요.

혹시라도 두 지점이 Navigation 범위 안에 있지 않다면 저렇게 이동하지 못하고 멈춰버립니다.

이동 가능한 경로 안에 OffMeshLink에 사용하는 이동 지점들이 있어야 합니다.

임석신님의 프로필 이미지
임석신

작성한 질문수

질문하기