본문 바로가기
[ UNITY ]/- UNITY6 AI FPS 프로젝트

Unity6 Enemy Hit Reaction과 Death 만들기

by MRG 2026. 10. 1.
728x90
반응형

▣ 이전 Animation 과정에서는

Enemy에게

Idle

Walk

Attack

Death

Animation을 적용했습니다.

이번에는

총을 맞았을 때

Hit Reaction

을 추가하고

Health가 0이 되면

Death Animation이

실제로 실행되도록 만들겠습니다.


1. Hit Animation 준비

VARCO에서

Hit Reaction Animation이 있다면

Unity로 가져옵니다.

Animation 이름은

예를 들어

Enemy_Hit

로 하겠습니다.

Humanoid Rig과

Avatar 설정은

앞의 Enemy Animation 과정과

같이 설정합니다.


2. Animator에 Hit State 추가

AC_Enemy

Animator Controller를 엽니다.

Enemy_Hit Clip을

Animator로 Drag합니다.

State 이름은

Hit

로 합니다.


3. Hit Trigger 만들기

Parameters에서

새 Trigger를 만듭니다.

Hit
→ Trigger

입니다.


4. Any State → Hit

다음 Transition을 만듭니다.

Any State
→ Hit

Condition은

Hit

Trigger입니다.

Has Exit Time
→ OFF

로 설정합니다.


5. Hit → Idle

Hit Animation이 끝나면

기본 상태로 돌아갑니다.

Hit
→ Idle

Transition을 만들고

Has Exit Time
→ ON

으로 설정합니다.


6. Death는 기존 구조 사용

앞에서 이미

Any State
→ Death

Condition
Dead = true

를 만들었습니다.

따라서 Script에서

Dead만 true로 만들면 됩니다.


7. EnemyAnimationController 수정

기존 Script에

Hit Method를 추가합니다.

public void PlayHit()
{
    animator.SetTrigger(
        "Hit"
    );
}

기존에는

PlayAttack()

PlayDeath()

가 있었습니다.

이제

PlayHit()

PlayDeath()

도 사용할 수 있습니다.


8. FPSWeapon에서 Animation 찾기

Enemy를 맞혔다면

Health와 함께

EnemyAnimationController도

찾습니다.

EnemyAnimationController
    enemyAnimation =
        hit.collider
            .GetComponentInParent<
                EnemyAnimationController
            >();

9. Damage 결과 확인

Health의

TakeDamage는

이번 Damage로 죽었다면

true를 반환하도록 만들었습니다.

bool died =
    health.TakeDamage(
        damage
    );

10. 살아 있다면 Hit

if (
    !died
)
{
    enemyAnimation.PlayHit();
}

를 실행합니다.


11. 죽었다면 Death

else
{
    enemyAnimation.PlayDeath();
}

를 실행합니다.


12. 안전하게 Null 확인

if (
    enemyAnimation != null
)
{
    if (died)
    {
        enemyAnimation.PlayDeath();
    }
    else
    {
        enemyAnimation.PlayHit();
    }
}

13. Damage 처리 전체

Health health =
    hit.collider
        .GetComponentInParent<Health>();


if (
    health != null &&
    !health.IsDead
)
{
    bool died =
        health.TakeDamage(
            damage
        );


    EnemyAnimationController
        enemyAnimation =
            hit.collider
                .GetComponentInParent<
                    EnemyAnimationController
                >();


    if (
        enemyAnimation != null
    )
    {
        if (died)
        {
            enemyAnimation.PlayDeath();
        }
        else
        {
            enemyAnimation.PlayHit();
        }
    }
}

14. Enemy가 맞으면

예를 들어

HP가

100일 때

Damage 25를 받으면

100
↓
75
↓
Hit Animation

입니다.


15. 마지막 총알

HP가

25일 때

25 Damage를 받으면

25
↓
0
↓
TakeDamage = true
↓
Death Animation

입니다.


16. 죽은 Enemy는 다시 Hit하지 않는다

Health 안에서

if (isDead)
{
    return false;
}

처리를 했습니다.

Weapon 쪽에서도

!health.IsDead

를 확인했습니다.

그래서 죽은 Enemy에게

계속 Hit Reaction이

실행되지 않습니다.


17. Death 이후 이동 정지

앞으로 Enemy AI를

연결했다면

Death 시점에는

Enemy Movement도

멈춰야 합니다.

예를 들어

Death
↓
AI 비활성화
↓
이동 정지
↓
공격 정지

가 필요합니다.

이 부분은

Enemy AI Script를 만들 때

연결할 수 있습니다.


마무리

이번 글에서는

Enemy가 Damage를 받을 때

상태에 따라

Animation을 다르게 실행했습니다.

Damage 받음
↓
HP > 0
↓
Hit Reaction

그리고

Damage 받음
↓
HP = 0
↓
Death

입니다.

기존

EnemyAnimationController에

PlayHit()

을 추가하고

Health의

TakeDamage 결과를 이용해

Hit와 Death를

구분했습니다.

이제 Enemy가

단순히 숫자만 감소하는 것이 아니라

Player의 공격에

눈에 보이게 반응합니다.

728x90
반응형

댓글