캐릭터와 적과 데미지를주고받을려면 Overlap이벤트가필요함
일단 적이 없기떄문에
때릴 허수아비를 하나 만들어주고(캐릭터를 부모로)
지금은 플레이어가 스태틱메시만 들고있기때문에
CapsuleComponent를 달아둔 검을 하나 별도로 만들었다
그럼 원래 달고있던 스태틱메시 대신에 이 액터를 자손으로 달아주자
이렇게 하면 캐릭터한테 차일드액터로 overlapSword 즉 칼이 할당된다
이제 기본적인 스태틱메시가 아닌 콜리전을 가진 별도의c++클래스 swordActor가 달렸다
이제 오버랩 이벤트를 발생시켜보자
칼에서 오버랩이벤트를 발생시킬거라 칼 c++를 수정해준다
이런식으로 생성자에 OnComponentBeginOverlap을 써주고
OnComponentBeginOverlap을 f12눌러주면
이화면이 뜬다
그리고 다시
FcomponentBeginOverlapSignature를 다시 f12를 누르면
이런화면이나오는데
뒤에서부터 6개를 복사
복사한내용을 내 비긴오버랩 함수에 넣어주고
중간중간에 있는 자료형* - 변수이름 사이 쉼표 지워주기
이런식으로 수정하고
cpp클래스를 수정해주면 AddDynamic의 빨간밑줄이 사라지고 오버랩이벤트를 위한 준비가 완료되었다
그리고 칼에서 칼의 맞은포인트를 체크하기위해
StartPoint와 EndPoint를 생성
시작할포인트와 끝포인트를 위치설정을 해주고
#include "Kismet/KismetSystemLibrary.h"헤더 추가해주고
이렇게 코드를 작성하면
actor에 히트하면 오버랩 이벤트가 잘 발생하는걸 확인할수있다
언리얼 인터페이스를 만들어주고
허수아비 즉 때릴대상의 코드에서 나의 인터페이스 HitInterface를 .h에 #include 해주고
class 뒤에 ,public IHitInterface를 써준다
때릴대상의 .h 에서 오버라이드 함수를 만들어주고
밑에 액터가 히트했고 hitInterface로 형변환을 할수있다면 로그를 찍는다
그럼 잘 동작하니
GetHit함수 호출을 넣어주고
히트할 대상의 GetHit 함수를 수정해준다
확인해보자
벽은 인식안하고 때릴대상(허수아비) 가맞으면 보라색으로 스피어가 뜨는걸 확인할수있다
근데 이러면 오버랩 이벤트가 발생했을때 한번만 맞는게아니고 다단히트로 맞아버리기때문에
코드의 수정이 필요하다
beginoverlap과 endoverlap으로 플래그로 전부처리할수도있으나 코드가 너무 더러워진다
그래서 사용한 방법
조건을 추가하고 AddUnique를 사용하였다
AddUnique는 배열에 이미 값이 있으면 추가하지말고 없으면 추가해줘 라는 의미이다
그래서 해당 코드가 실행되면 한번만 실행이 되고 다시 오버랩이 안될텐데
라는 방법으로 다시 배열을 비워 다시 한번만 오버랩이 되게 할수있다
(보라색구체가 오버랩된 시각스피어) 이렇게 한번만 오버랩이 일어난것을 확인할수있다
그러면 이제 공격이 끝날때 배열을 비워주는 함수를 호출하면 원할때 원하는만큼 타격할수있게되었다
그러면 노티파이에서 호출할 공격활성화, 비활성화 함수를 만들어주자
Enable은 공격 활성화 Disable은 공격을 비활성화
플래그 함수를 설정
해당 플래그를 컨트롤해주고
Collision을 QueryOnly, Nocollision으로 컨트롤해준다
그리고 Empty를 해줘야 여러명의 적을 때릴수있게 된다
그리고 코드의 안전성을 위해 OnComponentBeginOverlap이벤트를
생성자에서 BeginPlay위치로 변경
그리고 플래그를 false로 해서 초기상태를 비활성화모드로 변경해준다
플래그가 false일떄 즉 콜리전을 활성화를 하지않을떄는 return시켜버리면된다
그러면 노티파이에서 호출을 해주자
애님인스턴스 즉 노티파이를 호출할때의 함수를 제작한다
이름 잘 기억해주시고
그럼 노티파이에서 SwordActor을 사용해야함
그런데 지금 캐릭터가 childactor로 들고있기때문에
캐릭터에서 캐스팅을 해놓자
캐릭터에 들어가서
전방선언을 한 swordActorInstance를 선언
#include SwordActor.h를 헤더에 추가해주시고
캐스팅이 완료
그럼 캐스팅이 된 위치는 swordCharacter의 swordActorInstance 다
노티파이에서 함수를 건너건너 호출시켜준다
이제 사용할 위치의 노티파이를 찍어주고
실행하면?
허수아비를 공격하면 원하는 애니메이션에 capsuleComponent가 ForDuration시간동안 그려지면서 히트된곳을 표시한다
여기서 문제점을 이야기하자면 애니메이션끝에 찍어둔 노티파이 즉 AttackCollisionNonActivate 가 호출이 안되면 계속 그릴테니 예외처리도 해주자
지금 애니메이션이 끝나기전에 움직이는현상은 전에 후딜을 수정하면서 생긴문제 즉
마우스우클릭과 좌클릭 그리고 스킬을 쓸때 강제로 애니메이션이 수정되니 예외처리를 해주도록하겠다
우클릭에 강제로 공격콜리전활성화를 강제로 꺼주는 이벤트이다
이걸 우클릭할때 그리고 스킬쓸때 전부 넣어주었다
SwordCharacter->swordActorInstance->SetDisableAttackCollision();
이제 모든 애니메이션에 노티파이 노가다를..해주면 완성
fordutation대신 None으로 해서 디버그시각화만 안보이게하면
(`누르고 show collision을 치면 모든 콜리전을 시각으로 확인이 가능합니다)
잘 작동한다
근데 허수아비가 지금 크기에 비해 콜리전이 크기가 적절하지않다
지금 허수아비의 콜리전이다
콜리전이 지금 바깥의 초록색원에 적용되어 초록색 모양에 맞으면 히트이벤트가 발생한다
Collision -> CollisionComplexity (콜리전 복잡도) 를 Use Complex Collision As Simple로 변경
그럼 초록색원이 아니라 허수아비 본체의 콜리전을 타격 가능하다
이제 캐릭터가 정확하게 허수아비를 타격하는걸 확인할수있다
'Unreal5 프로젝트 다이어리' 카테고리의 다른 글
Unreal UI - 데미지 표기(HUD) (1) | 2025.04.10 |
---|---|
Unreal 적 - 피격 리액션(경직) 구현하기 (0) | 2025.04.08 |
Unreal 캐릭터 - 물체 가속회전(EaseIn),피벗 위치변경, 액터스폰 (2) | 2025.04.06 |
Unreal UI - 프로그래스바 모양 변경하기 (1) | 2025.04.05 |
Unreal 캐릭터 - AOE 스킬범위 (0) | 2025.04.04 |