* 콜리전 반응 종류
무시: 충돌X
겹침 : 충돌O, 지나가짐O ex)메이플 포탈
불록 : 충돌O, 지나가짐X
* 충돌 구현
3. Preset에서 위부터 각각 MyCharacter를 Pawn 설정과 동일하게 설정.
4.BP_Mycharacter::캡슐::콜리전= MyCharacter
5.컴파일, 저장
* Attack 충돌시 할일 구현
1.엔진-콜리전-새 트레이스채널=Attack 추가
2.애님인스턴스에 변수추가
DECLARE_MULTICAST_DELEGATE(FOnAttackHit);
public:
FOnAttackHit OnAttackHit;
3. 브로드캐스트 때리기(리스너 패턴)
Broadcast(c:소문자)
void UMyAnimInstance::AnimNotify_AttackHit()
{
//UE_LOG(LogTemp, Log, TEXT("AnimNotify_AttackHit"));
OnAttackHit.Broadcast();
}
- 리스너 패턴
나는 할일을한다(브로드캐스트 방송)
관심있는 사람은 메시지를 받아라(구독)
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
Animinstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
Animinstance->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
Animinstance->OnAttackHit.AddUObject(this, &AMyCharacter::AttackCheck);
}
4. OnAttackHit 이벤트 발생 -> AttackCheck함수를 실행해라
※ 리팩토링
초기화부분 BeginPlay->PostInitializeComponents로 이전
=>비긴플레이 이전에 처리됨.
void AMyCharacter::PostInitializeComponents()
{
Super::PostInitializeComponents();
Animinstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
if (Animinstance)
{
Animinstance->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
Animinstance->OnAttackHit.AddUObject(this, &AMyCharacter::AttackCheck);
}
}
5.AttackCheck 구현
void AMyCharacter::AttackCheck()
{
FHitResult HitResult;
FCollisionQueryParams Params(NAME_None, false, this);
float ATtackRange = 100.f;
float ATtackRadius = 50.f;
//피격 판정하는 함수
bool bResult = GetWorld()->SweepSingleByChannel(
OUT HitResult, //결과물
GetActorLocation(), //탐색시작위치
GetActorLocation() + GetActorForwardVector() * ATtackRange, //탐색끝위치
FQuat::Identity, //사용할 도형회전
ECollisionChannel::ECC_EngineTraceChannel2, //사용할 채널정보 ::Attack 트레이스가 2번채널에 있음
FCollisionShape::MakeSphere(ATtackRadius), //탐지할 도형형태(구체,박스...)
Params);
//피격했고, 결과물이 유효하면
if (bResult && HitResult.Actor.IsValid())
{
UE_LOG(LogTemp, Log, TEXT("Hit Actor: %s"), *HitResult.Actor->GetName());
}
}
* 디버깅 도형 만들기 => 피격 디버깅
1.캐릭터::#include "DrawDebugHelpers.h"
2. 캐릭터::구현
void AMyCharacter::AttackCheck()
{
FHitResult HitResult;
FCollisionQueryParams Params(NAME_None, false, this);
float AttackRange = 100.f;
float AttackRadius = 50.f;
//피격 판정하는 함수
bool bResult = GetWorld()->SweepSingleByChannel(
OUT HitResult, //결과물
GetActorLocation(), //탐색시작위치
GetActorLocation() + GetActorForwardVector() * AttackRange, //탐색끝위치
FQuat::Identity, //사용할 도형회전
ECollisionChannel::ECC_EngineTraceChannel2, //사용할 채널정보 ::Attack 트레이스가 2번채널에 있음
FCollisionShape::MakeSphere(AttackRadius), //탐지할 도형형태(구체,박스...)
Params);
//피격디버그 도형
FVector Vec = GetActorForwardVector() * AttackRange;
FVector Center = GetActorLocation() + Vec * 0.5f;
float HalfHeight = AttackRange * 0.5f + AttackRadius;
FQuat Rotation = FRotationMatrix::MakeFromZ(Vec).ToQuat();
FColor DrawColor;
//피격이면 녹색, 아니면 빨간색
if (bResult)
DrawColor = FColor::Green;
else
DrawColor = FColor::Red;
DrawDebugCapsule(GetWorld(), Center, HalfHeight, AttackRadius,
Rotation, DrawColor, false, 2.f); //유지시간
//피격했고, 결과물이 유효하면
if (bResult && HitResult.Actor.IsValid())
{
UE_LOG(LogTemp, Log, TEXT("Hit Actor: %s"), *HitResult.Actor->GetName());
}
}
'UE5' 카테고리의 다른 글
아이템 줍기 (0) | 2022.08.16 |
---|---|
소켓 실습 (0) | 2022.08.15 |
블렌드 스페이스 (0) | 2022.08.14 |
애니메이션 노티파이 (0) | 2022.08.14 |
델레게이트 (0) | 2022.08.14 |