부트캠프

일정 영역을 넘어가면 돌아가는 적 AI

noyyo 2023. 10. 27. 21:37

적이 플레이어를 따라가다가 정해진 범위를 벗어나면 다시 원래의 자리로 돌아가는 AI를 구현해보았다.

구현 과정에 필요한 기능은 크게 2가지였다.

 

1. NavMesh를 원하는 모양대로 설정하기

NavMeshSurface 컴포넌트를 사용해서 NavMesh를 생성했지만 해당 오브젝트의 모든 영역을 사용하는 것이 아니라 일부분은 다른 Area로 사용하고자 했다.

이 때 여러가지 시행착오를 겪었는데 Built-in 되어있는 Area인 NotWalkable은 NavMeshModifier 컴포넌트로 Walkable로 덮어쓸 수 없었다.

NotWalkable 영역은 NavMesh의 하나의 영역이라기 보다 해당 영역에는 아예 NavMesh데이터를 생성하지 않는 것처럼 보였다.

그래서 선택한 방법은 새로운 MonsterZone 이라는 Area를 생성하는 것이었다.

그리고 원하는 영역을 지정하기 위해서 NavMeshSurface 컴포넌트에서 Collect Objects 옵션에 Volume을 설정하고 직접 NavMesh 영역을 선택한 뒤 NavMeshModifierVolume 컴포넌트를 이용해서 MonsterZone 영역을 덮어씌워 생성하니 원하는대로 NavMesh를 생성할 수 있었다.

 

2. NavMesh의 특정 영역을 넘어갔는지 체크하기

NavMesh.SamplePosition 메소드를 이용해 영역에 마스크를 걸고 샘플링 되는 지점이 있는지 확인하는 방식으로 현재 영역을 벗어났는지 확인하도록 했다.

사소한 문제도 있었는데 NavMeshAgent의 BaseOffset값을 계산해주지 않아서 처음에는 Sampling이 제대로 되지 않는 문제였다. Enemy의 Transform의 Position의 y값에서 BaseOffset을 빼고 계산해주니 정상적으로 동작했다.

 

 

위의 큰 기능 2가지를 구현하고 나서 Enemy의 State를 하나 만들어서 영역을 벗어났다면 원래의 자리로 돌아가도록 하는 코드를 작성했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyReturnToBaseState : EnemyBaseState
{
    private static readonly float returnSpeed = 2f;
    public EnemyReturnToBaseState(EnemyStateMachine enemyStateMachine) : base(enemyStateMachine)
    {
    }

    public override void Enter()
    {
        base.Enter();
        agent.SetDestination(stateMachine.OriginPosition);
        agent.speed = enemyData.RunSpeed * returnSpeed;
        stateMachine.IsInvincible = true;
        StartAnimation(enemy.AnimationData.RunParameterHash);
    }
    public override void Exit()
    {
        base.Exit();
        StopAnimation(enemy.AnimationData.RunParameterHash);
        stateMachine.IsInvincible = false;

    }
    public override void Update()
    {
        base.Update();
        if (agent.remainingDistance < 0.2f)
        {
            stateMachine.ChangeState(stateMachine.IdleState);
        }
    }
}

 

'부트캠프' 카테고리의 다른 글

공격 패턴 시스템 구현  (0) 2023.11.03
적 공격 기믹 구상하기(feat 소통의 중요성)  (0) 2023.11.01
적 AI구현  (0) 2023.10.26
최종 프로젝트 기획  (0) 2023.10.24
최종 프로젝트 시작  (0) 2023.10.23