내일배움캠프 39일차 TIL : 심화 팀플 2일차, EnemyAttackState 분석

woollim·4일 전
0

내일배움캠프TIL

목록 보기
35/36
post-thumbnail

■ 학습 개요

오늘 계획

  • UIManager 만들기
  • 기본 UI 완성
  • Enemy 프리펩 제작 및 기본 움직임 완성


■ EnemyAttackState 분석

public override void Update()
{
    base.Update();

    float normalizedTime = GetNormalizedTime(stateMachine.Enemy.Animator, "Attack");
    if (normalizedTime < 1f)
    {

        if (!alreadyAppliedDealing && normalizedTime >= stateMachine.Enemy.Data.Dealing_Start_TransitionTime)
        {
            //stateMachine.Enemy.Weapon.SetAttack(stateMachine.Enemy.Data.Damage, stateMachine.Enemy.Data.Force);
            //stateMachine.Enemy.Weapon.gameObject.SetActive(true);
            alreadyAppliedDealing = true;
        }

        if (alreadyAppliedDealing && normalizedTime >= stateMachine.Enemy.Data.Dealing_End_TransitionTime)
        {
            //stateMachine.Enemy.Weapon.gameObject.SetActive(false);
        }
    }
    else
    {
        if (IsInChasingRange())
        {
            stateMachine.ChangeState(stateMachine.ChasingState);
            return;
        }
        else
        {
            stateMachine.ChangeState(stateMachine.IdleState);
            return;
        }
    }
}

○ 주요 로직 분석

  • base.Update()

    • 부모 클래스의 Update 메서드를 호출하여 기본적인 상태 업데이트를 처리합니다.
    • 상태 패턴에서, 공통적인 상태 처리 로직이 부모 클래스에 구현되어 있을 수 있습니다.
  • GetNormalizedTime

    • 애니메이션의 진행도를 0.0부터 1.0까지의 값으로 반환합니다.
    • normalizedTime : 0.0 ~ 1.0
  • 공격 애니메이션 진행 중 동작

    • if (normalizedTime < 1f)
      - 공격 애니메이션이 아직 끝나지 않았을 때 실행되는 로직입니다.
      - 무기 활성화 조건:
      !alreadyAppliedDealing: 아직 데미지를 적용하지 않았고,
      normalizedTime이 Dealing_Start_TransitionTime 이상일 때.

    • 무기 비활성화 조건:
      이미 데미지를 적용했으며(alreadyAppliedDealing == true),
      normalizedTime이 Dealing_End_TransitionTime 이상일 때.

  • 공격 애니메이션 종료 후 상태 전환

    • if (normalizedTime >= 1f)
      - 공격 애니메이션이 끝난 후 실행되는 로직입니다.
      - 추적 상태로 전환
      플레이어가 추적 범위 안에 있다면(IsInChasingRange() == true), 상태를 추적 상태로 전환합니다:
      - 대기 상태로 전환
      추적 범위 밖에 있다면 대기 상태로 전환합니다

○ 코드의 흐름 요약

  • 애니메이션 진행도(normalizedTime)를 확인.
    • 진행 중(< 1f):
      무기 활성화/비활성화 조건 처리.
    • 종료됨(>= 1f):
      적의 상태를 추적 또는 대기로 전환.
  • 애니메이션 종료 후 적의 다음 행동 결정.

○ 작동 방식 예시

  • 애니메이션 진행 중:
    • normalizedTime이 0.3이면:
      • Dealing_Start_TransitionTime이 0.2라면 무기를 활성화.
      • Dealing_End_TransitionTime이 0.8라면 무기를 아직 비활성화하지 않음.
  • 애니메이션 종료 시:
    • 플레이어가 범위 안에 있으면 추적 상태로 전환.
    • 플레이어가 범위 밖에 있으면 대기 상태로 전환.

○ 주요 변수 및 메서드

  • normalizedTime:
    애니메이션의 진행도를 나타내며 공격 타이밍을 제어합니다.
  • alreadyAppliedDealing:
    공격 로직이 중복 실행되지 않도록 방지합니다.
  • Dealing_Start_TransitionTime, Dealing_End_TransitionTime:
    공격 시작과 종료의 애니메이션 시점을 정의합니다.
  • IsInChasingRange():
    플레이어가 적의 추적 범위 안에 있는지 확인하는 메서드입니다.

○ 최종 요약

이 코드는 적이 공격 애니메이션 중 특정 시점에 무기를 활성화하여 데미지를 적용하고, 애니메이션이 끝난 후 다음 상태(추적 또는 대기)로 전환하도록 처리합니다. 상태 패턴과 애니메이션 진행도를 활용한 설계로, 적의 공격 로직을 애니메이션에 동기화하여 자연스럽게 작동하도록 구현된 점이 특징입니다.

0개의 댓글