작성
·
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에 사용하는 이동 지점들이 있어야 합니다.