Unity 강의/Unity Course(2) - 절대강좌! 유니티

[Unity Course 2] 06. 적 캐릭터 제작 2

첨부엉. 2024. 6. 21. 17:20
반응형
위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.

 

애니메이터 컨트롤러

Animatior Controller 생성 후 MonsterAnim 으로 이름 변경

더블클릭하여 애니메이터 뷰 열기

애니메이터에서 A 키를 눌러 전체보기, Alt 키를 눌러 이동하기

스테이트 종류 역할
Entry 시작 스테이트로 최초의 진입점
Exit 종료 스테이트로 모든 스테이트가 종료되는 마지막 스테이트
Any State  현재 어느 스테이트를 실행하고 있더라도 조건에 만족하면 다른 스테이트로 분기 가능

 

생성한 Animation Controller도 연결하기

실행하면 애니메이터 뷰에서 idle이 실행되는 모습을 볼 수 있음

 

스테이트 전이와 파라미터

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

Parameters 에 Bool 타입인 IsTrace 이름의 변수를 만든다.

true 이면 walk 이고,  false 이면 idle 상태

idle 에서 walk 로 가는 화살표

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

walk 에서 idle로 가는 화살표

내비게이션 - 적 캐릭터의 순찰 및 추적

장애물이 없다면 이동하는 것은 어렵지 않지만 장애물이 있다면 충돌 및 경합이 벌어져 복잡해진다.

이를 해결하기 위한 길찾기 알고리즘이 필요

 

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로 설정

반응형