이전 기록
https://mountain-noroo.tistory.com/56
[언리얼] 학원 8일차: SpawnActor, 싱글톤, 투사체
이전 기록 https://mountain-noroo.tistory.com/54 [언리얼] 학원 7일차: 애니메이션 노티파이와 파티클, 나이아가라 이전 기록 https://mountain-noroo.tistory.com/53 [언리얼] 학원 6일차: Data Asset과 Fire 액션 추가 이
mountain-noroo.tistory.com
카메라가 바라보는 방향으로 투사체 발사
// 투사체 생성위치
// 캐릭터의 메쉬에서 총의 끝 부분 소켓 위치에서 생성
FVector ProjectileLocation = GetMesh()->GetSocketLocation(FName(TEXT("Muzzle_01")));
// 카메라 위치 + 카메라 전방방향 * 10미터
FVector CamForwardPos = m_Cam->GetComponentLocation() + m_Cam->GetForwardVector() * 1000.f;
// 투사체 생성 위치에서 카메라로 향하는 벡터값
FVector vDir = CamForwardPos - ProjectileLocation;
// 위 값을 노멀라이즈
vDir.Normalize();
// 투사체의 위치를 카메라가 바라보는 방향으로 50cm 이동한다
ProjectileLocation += m_Cam->GetForwardVector() * 50.f;
FTransform trans;
trans.SetLocation(ProjectileLocation);
// 트랜스폼의 회전값은 이동방향과 동일해야 자연스럽다
trans.SetRotation(vDir.ToOrientationQuat());
// 투사체 생성
AProjectile* pProjectile = GetWorld()->SpawnActor<AProjectile>(m_Projectile, trans, param);
// 속도값을 정해준다.
pProjectile->m_ProjectileMovement->Velocity = vDir * _Velocity;
충돌체 (콜리전)

프로젝트 세팅 -> 엔진 - 콜리전에서 이와 관련된 설정을 할 수 있다.
언리얼에서 콜리전은 Object와 Trace로 나뉘는데
우선 Object에 관해서만 살펴보았다.
ObjectChannels: 오브젝트를 종류에 따라 그룹화할 수 있다. 충돌 관련 로직이 동일하게 작용되는 그룹. 유니티의 레이어, 태그
Preset: 프로파일을 만들어 콜리전 작동방식을 정의한다.

이 프로파일이 어떠한 작동방식을 가지고 있는지 만들 수 있다.
아래 문서에서 기능들을 자세하게 알아볼 수 있다.
https://docs.unrealengine.com/5.1/ko/collision-response-reference-in-unreal-engine/
콜리전 반응 레퍼런스
콜리전 프로퍼티 카테고리의 콜리전 프리셋 섹션에 있는 여러가지 프로퍼티에 대한 분석입니다.
docs.unrealengine.com
콜리전 기능이 켜져있는지, 어떤 오브젝트 그룹에 속해있고 다른 오브젝트와 만났을 시에 어떻게 되는지 설정한다.
유니티의 콜리전 매트릭스와 거의 동일한 기능인 것 같은데

대신 IsTrigger의 기능이 오버랩에 담겨있다고 볼 수 있다.

이후 콜리전 객체의 콜리전 탭에서 프리셋을 설정할 수 있다.
참고로 Custom을 설정한다면 이 탭에서 그 객체만을 위한 설정을 주는 것도 가능하다.
콜리전은 메시에서도 설정할 수 있기 때문에 주의.
충돌 이벤트
델리게이트 등록
GetCapsuleComponent()->OnComponentHit.AddDynamic(this, &ACharacter_Base::OnHit);
GetCapsuleComponent()->OnComponentBeginOverlap.AddDynamic(this, &ACharacter_Base::BeginOverlap);
GetCapsuleComponent()->OnComponentEndOverlap.AddDynamic(this, &ACharacter_Base::EndOverlap);
델리게이트 형태
UFUNCTION()
void OnHit(UPrimitiveComponent* _PrimitiveCom, AActor* _OtherActor, UPrimitiveComponent* _OtherPrimitiveCom, FVector _nNormalImpulse, const FHitResult& _Hit);
UFUNCTION()
void BeginOverlap(UPrimitiveComponent* _PrimitiveCom, AActor* _OtherActor, UPrimitiveComponent* _OtherPrimitiveCom, int32 _Index, bool _bFromSweep, const FHitResult& _Hit);
UFUNCTION()
void EndOverlap(UPrimitiveComponent* _PrimitiveCom, AActor* _OtherActor, UPrimitiveComponent* _OtherPrimitiveCom, int32 _Index);
콜리전 이벤트는
블록 충돌체에 닿아있는 동안 OnComponentHit
오버랩 충돌체에 들어갈 때 OnComponentBeginOverlap
오버랩 충돌체에서 나올 때 OnComponentEndOverlap
세 종류가 있다.
https://docs.unrealengine.com/5.1/en-US/API/Runtime/Engine/Components/UPrimitiveComponent/
UPrimitiveComponent
PrimitiveComponents are SceneComponents that contain or generate some sort of geometry, generally to be rendered or used as collision data.
docs.unrealengine.com
함수의 모양은 위 형태를 따라야 한다.
응용: 몬스터
void AMonster_Base::BeginOverlap(UPrimitiveComponent* _PrimitiveCom, AActor* _OtherActor, UPrimitiveComponent* _OtherPrimitiveCom, int32 _Index, bool _bFromSweep, const FHitResult& _Hit)
{
// 오버랩 된 객체를 투사체로 캐스트
AProjectile* pProjectile = Cast<AProjectile>(_OtherActor);
// 제대로 캐스트 되었다면
if (IsValid(pProjectile))
{
// 투사체는 파괴한다
pProjectile->Destroy();
// HP - 1
m_HP -= 1;
// HP가 0이 되면
if (m_HP <= 0)
{
// 죽은 상태로 바꿈
m_State = EMON_STATE::DEAD;
}
}
}
가볍게 응용하여 몬스터를 죽이는 기능을 넣을 수 있다.

더불어 블렌드 포즈 노드를 사용해 직접 만든 enum state에 따라서 애니메이션을 바꿔주는 기능을 넣을 수도 있다.
'언리얼 > Assortrack UE5' 카테고리의 다른 글
[언리얼] 학원 12일차: 데칼, 몬스터 개선(데이터 테이블) (0) | 2023.09.12 |
---|---|
[언리얼] 학원 11일차: 또 다른 싱글톤, 콜리전 트레이스 채널 (0) | 2023.09.11 |
[언리얼] 학원 8일차: SpawnActor, 싱글톤, 투사체 (0) | 2023.09.06 |
[언리얼] 학원 7일차: 애니메이션 노티파이와 파티클, 나이아가라 (1) | 2023.09.05 |
[언리얼] 학원 6일차: Data Asset과 Fire 액션 추가 (0) | 2023.09.04 |