[Unity Course 2] 06. 적 캐릭터 제작 2
위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.
애니메이터 컨트롤러

Animatior Controller 생성 후 MonsterAnim 으로 이름 변경
더블클릭하여 애니메이터 뷰 열기
애니메이터에서 A 키를 눌러 전체보기, Alt 키를 눌러 이동하기
| 스테이트 종류 | 역할 |
| Entry | 시작 스테이트로 최초의 진입점 |
| Exit | 종료 스테이트로 모든 스테이트가 종료되는 마지막 스테이트 |
| Any State | 현재 어느 스테이트를 실행하고 있더라도 조건에 만족하면 다른 스테이트로 분기 가능 |


생성한 Animation Controller도 연결하기
실행하면 애니메이터 뷰에서 idle이 실행되는 모습을 볼 수 있음
스테이트 전이와 파라미터

Make Transform 을 선택하여 서로 오고가는 연결선을 만들기

Parameters 에 Bool 타입인 IsTrace 이름의 변수를 만든다.
true 이면 walk 이고, false 이면 idle 상태

Has Exit Time 은 해제하고 Conditions에 새로운 조건을 생성한다

내비게이션 - 적 캐릭터의 순찰 및 추적
장애물이 없다면 이동하는 것은 어렵지 않지만 장애물이 있다면 충돌 및 경합이 벌어져 복잡해진다.
이를 해결하기 위한 길찾기 알고리즘이 필요
A* Pathfinding 알고리즘 사용
: 유니티에서 내비게이션 기능을 제공하기 이전에 많이 사용하던 알고리즘 중 하나.
유니티에서 제공하는 내비게이션
: 스테이지를 구성하고 있는 3D 메시를 분석해 내비메시 데이터를 미리 생성하는 방식
- 추적할 수 있는 영역 (Walkable Area)
- 장애물로 판단해 지나갈 수 없는 영역 (Non Walkable Area)
- 높은 곳에서 낮은 곳으로 연결하는 오프메시 링크 (Off Mesh Link)
내비게이션 설정 - Navigation Static Flag
베이크하기 위한 대상 지정하기
하이러키 뷰에서 Floor를 선택하고 인스펙터 뷰의 오른쪽 위에 있는 Static 체크박스 진입

드럼통도 Navigation Static 기능 켜주기

프리팹에 들어가서 하위 Barrel에 Mesh Filter 가 있으므로 여기서 Naveigation Static 기능을 켜줌
***Static 옵션은 유니티 엔진에 고정된 게임오브젝트임을 알려주는 옵션, 필요한 옵션만 설정
내비메시 베이크


Bake 를 클릭하면 드럼통 주위는 걸어다닐 수 없다.
NavMeshAgent 컴포넌트
: 내비메시 데이터를 기반으로 목적지까지 최단 거리를 계산해 이동하는 역할, 장애물과 다른 NPC간의 충돌을 회피하는 기능 제공, 실시간 최단거리 계산 A*PathFinding 알고리즘 사용

몬스터에 Nav Mesh Agent 컴포넌트를 추가하고 Stopping Distance를 2로 설정한다.
| 속성 | 설명 |
| Agent Type | 장애물읠 회피하기 위한 회전 반경 및 넘어갈 수 있는 계단의 높이, 경사로등의 각도의 정보를 정의 |
| Base Offset | 실린더 형태로 표현된 NavMeshAgent 는 베이크된 내비메시 표면에 붙어서 이동 바닥에 뜬 상태로 이동하는 것처럼 보이는 것을 수정 |
| Speed | 최대 이동 속도(초당 월드 단위) |
| Angular Speed | 최대 회전 속도(초당 각도) |
| Acceleration | 최대 가속(m/s²) |
| Stopping Distance | 목표 지점에 가까워졌을 때 정지하는 근접 거리 |
| Auto Braking | 목표 지점에 가까웠졌을 때 속도를 줄이는 기능, 순찰과 같은 여러 포인트를 부드럽게 하기 위해 비활성화해야됨 |
| Radius | 에이전트의 반경으로 장애물을 크게 돌것인지 작게 돌것인지, 에이전트간의 충돌 계산 |
| Height | 에이전트 머리 위에 있는 장애물을 지나갈 때 높이 수치가 크면 계단의 스텝이 커짐 |
| Quality | 장애물을 회피할 때의 품질 설정, 많은 에이전트가 있으면 품질 저하 |
| Prioriy | 에이저트 간의 회피 우선순위를 결정 자신보다 낮은 에이전트는 회피대상에서 제외, 0~99값 낮은 수가 우선 |
| Auto Traverse Off Mesh Link | 분리된 메시 간에 자동으로 링크를 생성하는 옵션 Off Mesh Link 컴포넌트를 사용하면 이 기능은 비활성화 |
| Auto Repath | 이 속성을 활성화 하면 이동할 경로가 유효하지 않을 때 경로를 재탐색 |
| Area Mask | Area Mask 를 지정한 후 내비메시를 베이크하면 특정 영역별로 이동을 제한, 런타임에서 비트 마스크를 통해 조작가능 |

플레이어 태그를 생성하여 지정
새로운 MonsterCtrl스크립트 생성 후 몬스터에 연결
using UnityEngine;
using UnityEngine.AI; // 내비게이션 기능을 사용하기 위해 추가해야 하는 네임 스페이스
public class MonsterCtrl : MonoBehaviour
{
// 컴포넌트의 캐시를 처리할 변수
private Transform monsterTr;
private Transform playerTr;
private NavMeshAgent agent;
private void Start()
{
// 몬스터의 Transform 할당
monsterTr = GetComponent<Transform>();
// 추적 대상인 Player의 Trasnform 할당
playerTr = GameObject.FindWithTag("PLAYER").GetComponent<Transform>();
// NavMEshAgent 컴포넌트 할당
agent = GetComponent<NavMeshAgent>();
// 추적 대상의 위치를 설정하면 바로 추척
agent.destination = playerTr.position;
}
}
***Find~ 계열의 함수
FindGameObjectWithTag, FindGameObjectWithTag 와 같은 Find~ 계열의 함수는 처리 속도가 느리기 때문 Update 함수에서 사용하지 않음, Awake, Start함수에서 변수에 할당 후 사용을 권장
destination 속성을 사용하면 이동할 좌푯값 지정
agent.destination = playerTr.position;
바닥에서 약간 떠서 이동하는 몬스터를 볼 수 있는데 Base Offset 을 -0.1로 설정