[내배캠] 최종 프로젝트 #4. 코드 최적화, 유니티 AI Navigation - NavMeshAgent

Sungchan Ahn(안성찬)·2024년 11월 29일

내일배움캠프

목록 보기
72/104

코드 최적화

최적화 => 쉽게 말해 FPS를 높이고 Batches(Draw Call + SetPassCall)을 낮추는 것
Draw Call : CPU가 GPU에 오브젝트를 그리는 명령을 호출하는 것
모바일 게임의 경우 Batches가 100 ~ 200으로 맞추는 것이 적정

최적화를 방해하는 코드들

  • 박싱 / 언박싱 : 형식을 변환하는 과정에서 메모리상 비효율 발생

    • 박싱(Boxing) : 값 형식을 참조 형식으로 변환하는 것. 스택 -> 힙
    • 언박싱(UnBoxing) : 박싱된 참조 형식을 값 형식으로 변환하는 것. 힙 -> 스택 (가비지 발생)
  • SendMessage와 BroadcastMessage 사용

  • Find 관련 메서드

  • 자식이 많은 오브젝트의 Transform 변경

  • 아무런 코드를 작성하지 않은 Update, FixedUpdate, LateUpdate를 그대로 두는 경우

  • GetComponent를 자주 호출하는 구조 ex) Update문에서 계속 호출

  • Update문에서 리스트나 클래스 재할당(new ~)하는 경우

  • Foreach문 : CPU 성능에 차이가 있음

  • 코루틴 함수

    • StartCoroutine을 사용할 때 약간의 가비지 발생
    • yield return new Wait~에서 new를 할 때마다 가비지 생성
  • 오브젝트 풀링을 사용하지 않는 경우

AI Navigation - NavMeshAgent

  • Agent Type
  • Base Offset : NavMeshAgent의 충돌(회피 영역)을 담당하는 실린더의 중심점 변경
  • Speed : 최대 이동 속도
  • Angular Speed : 최대 회전 속도. NavMeshAgent를 이용하여 이동하면 오브젝트의 회전도 자동으로 이루어지는데 이 회전 속도를 결정
  • Acceleration : 최대 가속도. Speed가 빠를 때, Acceleration도 함께 높이면 방향을 바꿀 때 밀려나는 느낌을 조절할 수 있다. Speed만 높이면 해당 오브젝트가 빠른 속도를 주체하지 못하는 것처럼 이동한다.
  • Stopping Distance : 목적지에 도착하기 전, 어느 거리에서부터 멈출지 설정
  • Auto Breaking : 활성화 시 목적지에 다다를 때 속도를 줄여서 목적지에 정확하게 도착
  • Radius : 다른 NavMesh와의 회피 영역 반지름
  • Height : 회피 영역의 높이
  • Quality : 장애물 회피 Quality. 높으면 장애물을 회피하는 정도가 더 정밀해짐
  • Priority : 회피 우선순위. 낮을 수록 우선 순위가 올라감. 경로 상의 다른 Agent가 있을 때, 우선 순위가 낮은 Agent는 회피하지 않고 지나감
  • Auto Repath : 기존 경로가 잘못된 경우 새 경로를 찾을지에 대한 여부
  • Area Mask : 해당 agent가 이동할 수 있는 Area 설정

변수 및 메서드

  • hasPath(bool) : 경로를 가지고 있는지 반환
  • isOnNavMesh(bool) : NavMesh 위에 있는지 반환
  • remainingDistance(float) : 목적지까지의 거리 반환
  • SetDestination(Vector3 pos) : 타겟 위치로 경로를 찾아 유효하면 이동
  • Warp(Vector3 pos) : 타겟 위치로 바로 이동시킴
  • Stop() : 정지
  • Resume() : 다시 이동 시작
  • Move(Vector3 offset) : offset만큼 이동. 경로가 있을 경우 경로 조정됨
profile
게임 개발 기록

0개의 댓글