inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Tìm hiểu những điều cơ bản về Unity của Tiến sĩ Ko bằng cách làm theo

02-02 NavMesh 응용 캐릭터 멈춤 문제

20

zeris

3 câu hỏi đã được viết

0

강의 너무 이해가 잘돼요 감사합니다

캐릭터가 offMeshLink 앞에서 멈춥니다. 그 상태에서는 아무것도 안하고 그 자리에 가만히 있습니다.

앞에분이랑 비슷한 상황인데 점프도 안되고 아래로 떨어지는 거, 사다리타는거 다 안 돼요.

시작, 종료 지점 위치도 navigation 범위 안에 잘 있습니다

전에는 잘 됐는데 사다리 코드를 작성하니까 이렇게 됐어요

 

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

public class OffMeshLinkClimb : MonoBehaviour
{
    [SerializeField]
    private int offMeshArea = 3;
    [SerializeField]
    private float climbSpeed = 1.5f;
    private NavMeshAgent navMeshAgent;

    private void Awake()
    {
        navMeshAgent = GetComponent<NavMeshAgent>();
    }

    IEnumerator Start()
    {
        while ( true )
        {
            // IsOnClimb() 함수의 반환 값이 true 일 때
            yield return new WaitUntil(() => IsOnClimb());

            // 올라가거나 내려가는 행동
            yield return StartCoroutine(ClimbOrDescend());
        }
    }
    
    public bool IsOnClimb()
    {
        // 현재 오브젝트의 위치가 OffMeshLink 에 있는지
        if ( navMeshAgent.isOnOffMeshLink )
        {
            // 현재 위치에 있는 OffMeshLink 의 데이터
            OffMeshLinkData linkData = navMeshAgent.currentOffMeshLinkData;

            // 현재 OffMeshLinkData 가 true 면 수동 OffMeshLink, false 면 자동 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초 뒤에 1퍼센트가 되기 때문에 climbTime 변수를 연산해서 시간을 조절
            currentTime += Time.deltaTime;
            percent = currentTime / climbTime;
            // 시간 경과에 따라 오브젝트 위치 변경
            transform.position = Vector3.Lerp(start, end, percent);

            yield return null;
        }

        // OffMeshLink 를 이용한 이동 완료
        navMeshAgent.CompleteOffMeshLink();
        
        // 내비게이션 이동 다시 시작
        navMeshAgent.isStopped = false;
    }
}

unity

Câu trả lời 2

0

unitynote

현재 사용하고 있는 유니티의 버전이 2022 이상의 버전이어서

New AI Navigation을 사용하고 있다면

 

장소 정보 검사 코드를 기존의

linkData.offMeshLink.area == offMeshArea

에서

if ( (navMeshAgent.navMeshOwner as NavMeshLink).area.Equals(offMeshArea) )

와 같이 수정해야 합니다.

0

zeris

error CS0246: The type or namespace name 'NavMeshLink' could not be found (are you missing a using directive or an assembly reference?)

이렇게 떠요..NavMeshLink가 없어요

0

unitynote

그럼 구버전의 NavMesh를 사용하고 있는 것 같습니다.

 

아래 AI 답변의 답변으로 첨부한 사진을 보니 사다리 주변에 위/아래 경로가 많은데

앞의 실습에서 자동 Off Mesh Link 실습 후 자동으로 설정된 Link를 해제하였나요?

1.Navigation View의 Object 탭에 있는 Generate OffMeshLinks = false

2.Bake 탭의 "Bake" 버튼을 눌러 데이터 저장

그리고 수동으로 연결된 사다리의 Start, End 위치 확인

(Scene View에서 볼 때 Start, End의 원 영역이 기존 파란색 Navigation 영역과 겹쳐져 있어야 정상적으로 사다리를 타고 Link 이동이 가능합니다.)

0

zeris

유니티는 거의 최신 거 사용중이에요

input system package 말고 input manager를 쓰고 있긴 합니다

0

zeris

image.png

 

0

unitynote

그럼 첫 답글의 코드가 맞습니다.

마지막 스크린샷을 보니 AI Navigation 최신버전이네요

 

NavMeshLinkClimb.cs 스크립트 윗부분에

using Unity.AI.Navigation; 을 추가하고, 처음 알려드린 코드를 작성하면 됩니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 제리스님.

캐릭터가 OffMeshLink 앞에서 멈추는 문제는 네비게이션 범위나 OffMeshLink 설정 문제일 가능성이 높습니다. 이와 유사한 문제를 가지고 있던 다른 질문에서도 비슷한 해결책을 제시한 바 있습니다.

  1. OffMeshLink 설정 확인: OffMeshLink의 시작과 종료 위치가 Navigation Mesh 범위 내에 맞추어 있는지 확인해야 합니다. OffMeshLink가 네비게이션 범위 내에 설정되지 않으면 캐릭터가 경로를 찾지 못하고 멈출 수 있습니다.

  2. NavMeshAgent 설정 확인: NavMeshAgent가 제대로 설정되어 있는지도 확인해 보세요. 특히, isStopped 속성이나 장애물로 인한 경로 문제를 확인해보는 것이 좋습니다.

다음은 비슷한 문제에 대한 기존 답변들을 확인할 수 있는 링크입니다:

위의 답변들과 설정을 확인하며 문제를 해결해보시기 바랍니다. 스크립트나 설정에 문제가 있는 경우, 이러한 사항들을 조정하여 문제를 해결할 수 있을 것입니다.

질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

zeris

image.pngimage.png

 

02-02 NavMesh 응용 캐릭터 멈춤 문제

0

18

1

03-01 (16. CharacterController)

0

54

2

05-02 실습에서 마지막 부분을 해보니 죽는 키를 누르면 die 가 두번 재생됩니다

0

74

2

02. 게임오브젝트 물리와 충돌 마지막 sun예제의 움직임

0

153

2

유니티3d 기초 하고 있는데. 따라하기가 전혀 안됩니다.

0

237

1

강의보다가 문득 궁금한게 있어서 여쭤봅니다.

0

340

1

다른 강의도 듣고 싶어요

0

301

1

2D Tilemap Editor 2:00에서요

0

392

2

제가 3d 멀미가 있어서 2D게임만 만들 생각인데요

0

333

1

게임오브젝트 삭제함수에서 질문이요

0

202

1

Instantiate() 활용 예제에서 11:30의 예제 질문이요

0

245

1

3D 네비게이션 메시 질문요(유니티 버전이 최근버전이라 잘 진행이 안되네요)

0

834

2

2D Basic 6강, 2D-Extras에서 애먹고있습니다.

0

433

1

사다리 밑으로 이동이 안 돼요

0

307

1

총알이 나가지 않습니다.

0

396

2

게임 월드로 배치되는 바닥, 장애물이 “Navigation Static”으로 설정이 안됩니다..

1

716

1

강의자료 다운로드가 가능할까요?

0

596

1

수업자료 버튼이 안보입니다

0

514

2

총알이 player 뒤로 나가게하려면 따로 설정이 필요한가요?

0

526

1

총알이 player 뒤로 생성되게 따로 설정이 필요한가요?

0

273

1

[asset] 이 로딩이 안되는 이유

0

828

1

used by composite 항목이 없어요

0

866

1

강의 자료를 다운받고 싶습니다.

0

514

1

23년인 지금 들어도 버전문제는 없을까요

0

592

1