본문 바로가기

언리얼엔진

27. 충돌판정 수정하기 / AnimNotifyState

AnyDamage 호출 시 체력 감소

먼저 BP_Character에서 LifeMax의 기본값을 100으로 설정 후, Construction Script를 통해 LifeNow에 미리 값을 넣어준다.

BP_Character의 Construction Script

 

그리고 BP_Weapon의 ApplyDamage가 불리게 되면 LifeNow에서 들어온 Damage만큼 빼주기만 하면 된다.

BP_Character의 이벤트그래프


이상한 충돌판정 수정해주기

1. 무기를 들고있는 Player가 본인 무기에 대미지를 입는 문제

ActorBeginOverlap 이벤트로 받아온 충돌한 대상과 현재 Controll 중인 대상이 다를 때에만 ApplyDamage를 발생시키도록

중간에 Branch를 추가하여 True일 때만 넘어가도록 했다.

BP_Weapon의 이벤트그래프

 

2. 무기가 닿기만 하면 적에게 대미지를 주는 문제

Player의 공격 애니메이션에 맞춰서 무기의 Capsule Collision을 켰다 꺼주는 방식으로 해결해볼 것이다.

먼저 Controll 대상의 현재 상태가 Acting인지 확인을 위해 Is State를 추가하여 공격 중이 아닐 때에는 대미지가 발생하지 않는다.

BP_Weapon의 이벤트그래프

 

3. 한번의 공격에 여러번 대미지가 들어가는 문제

먼저 AnimNotify를 추가해줄 것이다. 블루프린트 클래스 - AnimNotifyState를 선택하여 생성한다.(ANS_AttackActivated)

AnimNotifyState 만들기

 

이렇게 만든 AnimNotifyState(ANS_AttackActivated)에서 사용할 함수 Begin과 End만 추가했다.

ANS_AttackActivated 오버라이드 함수

 

그리고 Notify(ANS_AttackActivated)에서 Begin과 End 발생 시 호출시켜줄 인터페이스 함수 2개를 추가했다.

BP_CharacterInterface

 

이제 AnimNotifyState(ANS_AttackActivated)의 Begin과 End 함수 발생 시 각각 인터페이스 함수를 호출하여

BP_Character로 전달되게 된다.

ANS_AttackActivated의 Received Notify Begin / End 함수

 

이후, BP_Character에서 이벤트 발생하면 Weapon으로 넘겨주며 BP_Weapon안의 Activate / DeactivateAttack 함수를

불러줄 것이다.(따라서 Activate / DeactivateAttack 두개의 함수를 추가 / 구현해준다.)

BP_Weapon에 함수 두 개 추가
Activate / Deactivate Attack 함수 내부

Generate Overlap Events를 껏다 켜주면서 충돌이 발생하도록 해주었다.

이를 위해 GenerateOverlapEvents의 초기값은 꺼두어야 한다.

 

아까 만들었던 ANS_AttackActivated Notify는 Attack Montage에 각각 공격 판정이 시작되고 끝날 프레임에 맞게 위치를

설정해주면 된다.

이제 Montage 재생 시, 해당 프레임의 Notify에 Begin / End가 발생하며 무기의 Overlap Events를 껐다 켜줄 것이다.

 

4. 장착하지 않은 무기가 대미지를 주는 문제

인터페이스에서 만들었던 함수 Activate / Deactivate Attack 이벤트 발생 시, WeaponNow에 있는 함수만 발생되도록

로직을 구현해주었다.

BP_Character의 이벤트그래프