내일배움캠프 36일차

박나연·2025년 5월 28일

내배캠

목록 보기
36/69

팀 프로젝트 하는중

오늘의 키워드 : 선비야 움직이거라

오늘은 유니티 배치고사를 봤다. 처음에 했던 배치고사를 떠올리고 뭐 어렵지 않겠지~ 했는데 생각보다 어려웠다.... 강의에서 나온 코드를 그대로 낸 것도 있고 처음보는 로직도 있었다. 개인적으로 특정 빛 색깔에만 반응해서 오브젝트가 보이는 로직은 배워보고 싶다고 생각했다. 아무튼 로직은 처음이어도 찬찬히 읽어보면 풀만한 문제들이고 시간도 넉넉해서 잘 풀 수 있다.

아무튼 오늘 한 작업은 npc가 길을 따라 배회하게 하는 것이었다. 여기서 문제가 생겼는데 플레이어는 잘 움직였다가, 멈췄다가 하는데 애니메이션이 맞지 않았다는 점이다. 움직일때 walk애니메이션이 나오지만 정작 멈출때는 idle로 넘어가지 않았던 것이다.

NPC 배회 AI 트러블 슈팅

개요
NPC가 가만히 있다가 가끔 배회하도록 구현하였다.NavMeshAgent와 코루틴을 사용했다. 걷는 애니메이션을 적용하다가 문제가 생겼다. NPC는 움직이다가 잘 멈추는데 정작 애니메이션은 idle애니메이션으로 넘어가지 않았던 것이다.

원인 분석

while (agent.pathPending || agent.remainingDistance > agent.stoppingDistance)
        {
            Debug.Log("걷는중");
            yield return null;
            }

원래 썼던 코드이다. ||연산자를 사용했기 때문인지 둘 중 하나만 true 였던 상황이 일어나서 계속 걷는다고 판단했던 것이다.(while문이 끝나지 않음...)

해결 방안
agent.isStopped = true를 사용해 제어해주고, while문도 살짝 수정해주었다.

    IEnumerator WanderRoutine()
    {
        Vector3 wanderTarget = GetWanderLocation();
        agent.SetDestination(wanderTarget);

        agent.isStopped = false;//이동재개

        // 실제로 이동 중일 때 루프
        while (agent.hasPath && agent.remainingDistance > agent.stoppingDistance)//유효한 경로이고 남은거리가 0보다 클때 
        {
            Debug.Log("걷는중");
            yield return null;
        }

        // 멈추고 Idle로 전환
        agent.isStopped = true;//이동 중지

        SetState(ALSTATE.IDLE);
    }

이렇게 &&조건으로 바꿔서 두 조건이 모두 참이어야지만 걷고 하나라도 아니면 바로 루프를 벗어나도록 수정하였다.

결말
NPC가 의도대로 걸을땐 걷는 애니메이션이 나오고, 멈출땐 가만히 있는 애니메이션이 제대로 나오게 되었다!

마무리하며

오늘 많은걸 한 것 같으면서도 많이 안한 것 같다. 일단 레벨링 작업은 완료했으며(저장빼고 ㅎ) 배회로직도 수정했고, 원래 플레이어랑 NPC랑 모델이 없었는데 오늘 에셋을 추가해줬다. 그런데 알고보니 애니메이션이 없어서 믹사모에서 애니메이션을 가져와서 사용하였다. 처음에 fbx파일을 못찾아서 또 한시간정도 헤맨것 같은데... 해결했으면 된거지... 그리고 유니티 배치고사까지 보고 뭐야 오늘 하루 정말 바쁘게 보낸것 같다. 남은 시간은 공식적으로는 이틀이라서 내일은 틀이 모두 잡혀있어야 할 것 같다. 대화시스템은 건들지도 않았는데 하루만에 완성해야 할 지경에 왔다... 큰일이야 할 수 있을까?ㅠㅠ

내일 할 일

내일은 대화시스템을 해보려한다. 또 어떤 오류가 날 기다릴까 정말 두근두근하지 않아...

0개의 댓글