본문 바로가기
게임 개발

[Unity] The Love 게임 - (2)

by chobbo 2024. 6. 5.

오늘은 Enemy 캐릭터 AI 움직임을 구현하였다.

 

 

AI의 현재 상태

public enum AIState
{
    Idle,
    Walk,
    Attack
}

 

 

Update문

protected virtual void Update()
{
    _playerToEnemyDistance = Vector3.Distance(transform.position, CharacterManager.Instance.Player.transform.position);

    SetAnimator(_state);

    switch (_state)
    {
        case AIState.Idle:
            DetectPlayer();
            break;
        case AIState.Walk:
            DetectPlayer();
            break;
        case AIState.Attack:
            AttackPlayer();
            break;
    }
}

 

매 프레임마다 Player와 Enemy 사이 거리를 검사하고

현재 상태에 따른 애니메이션과 메서드를 부여해준다.

 

 

 

DetectPlayer

void DetectPlayer()
{
    if (_state == AIState.Walk && agent.remainingDistance < 0.1f)
    {
        SetState(AIState.Idle);
        Invoke("WalkToNewLocation", _detectCoolTime);
    }

    if (_playerToEnemyDistance < _detectDistance)
    {
        SetState(AIState.Attack);
    }
}

 

Idle, Walk 상태 때 실행

만약 AI가 걷고있고, 목적지까지 거의 도달했으면 Idle 상태로 변한 후 다음으로 걸어갈 위치를 찾는다

만약 플레이어와의 거리가 플레이어 감지거리 안, 즉 플레이어를 탐지하면 공격 상태로 변한다

 

 

AttackPlayer

protected virtual void AttackPlayer()
{
    // TODO :: 시야각 다시 보기 & 뒤에선 attack state로 안바뀌게 구현
    // 플레이어가 공격 범위 안에 없거나 시야에서 안보이면 다시 경로 찾기
    if (_playerToEnemyDistance > _attackDistance || !IsPlayerInFieldOfView())
    {
        agent.isStopped = false;
        NavMeshPath path = new NavMeshPath();
        if (agent.CalculatePath(CharacterManager.Instance.Player.transform.position, path))
        {
            agent.SetDestination(CharacterManager.Instance.Player.transform.position);
        }
    }
    // 플레이어가 공격 범위 안에 있으면 -> 이거 하위 자식 스크립트에서 구현하자
    else if (_playerToEnemyDistance <= _attackDistance)
    {
        agent.isStopped = true;
        if (Time.time - lastAttackTime > _attackCooltime)
        {
            lastAttackTime = Time.time;
            // TODO :: 플레이어 공격 구현시 연동
            animator.speed = 1;
            animator.SetTrigger("Attack");
            agent.isStopped = false;
        }
    }
}

 

Attack 상태일 때 실행

아직 완벽히 구현되지 않았다.

이 Enemy 클래스를 상속받는 보스나 근접공격 몹, 원거리 공격 몹에게서 override 구현할 예정

또 몬스터의 시야에 플레이어가 보일 때만 NavMeshPath를 지정하도록 수정해야 한다.

 

 

 

따라와서 치긴한다. 

아직 공격 부분은 구현을 못해서.. 

내일의 내가 하겠지 .. ?

 

(플레이어는 팀원분이 아직 구현을 덜하셔서 모습이 저렇다.

내일 모레면 멀쩡해질 예정ㅋㅋ 내일은 현충일이니까 ^_ ^)

'게임 개발' 카테고리의 다른 글

[Unity] The Love 게임 - (4)  (0) 2024.06.10
[Unity] The Love 게임 - (3)  (0) 2024.06.07
[Unity] The Love 게임 - (1)  (0) 2024.06.04
[Unity] 3D-Dungeon - 움직이는 발판  (0) 2024.05.30
[Unity] 3D-Dungeon  (0) 2024.05.28