지난 포스팅까지 낮은 엄폐물에서의 엄폐의 구현을 완성했다.
이제 높은 엄폐물에서의 엄폐, 즉 서서 엄폐를 제작할 차례이다.
낮은 엄폐에서와 같은 메커니즘을 사용하되, 다음과 같은 변경/추가 요소가 있다.
- 엄폐한 상태에서 가만히 있을 때 꼭 정면을 바라보지 않는다.
- 서있는 상태에서의 엄폐는 방향이 정면으로 고정되어있는 것보다는 살짝 모서리를 바라보고 있는 편이 오히려 더 자연스럽기 때문이다.
- 엄폐물의 오른쪽 끝에 붙어 조준하면 캐릭터가 오른쪽으로 조금 빠져나와 조준한다.
- 엄폐물의 왼쪽 끝에 붙어 조준하면 캐릭터가 왼쪽으로 조금 빠져나와 조준한다.
- 캐릭터가 빠져나와 조준하는 방향으로 카메라도 약간 이동한다.
먼저, 이전에 만들었던 StartCover에 낮은 엄폐인지 구분하는 파라미터를 하나 추가하였다.
void AKannaCharacter::StartCover(FVector& PlaneNormal, bool IsLowCover)
{
GetCharacterMovement()->SetPlaneConstraintEnabled(true);
GetCharacterMovement()->SetPlaneConstraintNormal(PlaneNormal);
IsInCover = true;
if (IsLowCover) //낮은 엄폐
{
Crouch();
}
else //높은 엄폐
{
//Crouch 함수 없이, 이동 속도만 줄여준다.
GetCharacterMovement()->MaxWalkSpeed = 200.f;
}
}
파라미터로 높은 엄폐, 낮은 엄폐를 구분할 수 있게 되었으니 StartCover를 호출하는 WallTrace에서 넘겨줄 인자를 결정하도록 하였다.
캐릭터의 머리위치에서 먼저 라인트레이싱을 해봐서 막히면 서서 엄폐, 막히지 않으면 허리 위치에서 라인트레이싱을 시도하여 결과에 따라 낮은 엄폐를 수행한다.
void AKannaCharacter::WallTrace()
{
//낮은 엄폐물 탐지
FVector LowStart = GetActorLocation();
FVector LowEnd = GetActorLocation() + GetActorForwardVector() * 100.f;
//높은 엄폐물 탐지
FVector HighStart = GetActorLocation() + FVector(0.f,0.f,80.f);
FVector HighEnd = HighStart + GetActorForwardVector() * 100.f;
if (GetWorld())
{
FHitResult HitResult;
FCollisionQueryParams CollisionParameters; // 트레이싱이 자기자신은 무시하도록
CollisionParameters.AddIgnoredActor(this);
//높은 엄폐물 탐지 시도
if (GetWorld()->LineTraceSingleByChannel(HitResult, HighStart, HighEnd, ECC_GameTraceChannel1, CollisionParameters))
{
DrawDebugLine(GetWorld(), HighStart, HighEnd, FColor(255,0,0), true, 10.f, 0, 5.f);
StartCover(HitResult.Normal, false);
}
//낮은 엄폐물 탐지 시도
else if (GetWorld()->LineTraceSingleByChannel(HitResult, LowStart, LowEnd, ECC_GameTraceChannel1, CollisionParameters))
{
DrawDebugLine(GetWorld(), LowStart, LowEnd, FColor(255, 0, 0), true, 10.f, 0, 5.f);
StartCover(HitResult.Normal, true);
}
}
}
이제 앉은 엄폐를 하게되면 IsCrouching과 IsInCover가 둘 다 true가 될 것이고,
높은 엄폐를 하게 되면 IsCrouching은 false, IsInCover는 true가 될 것이다.
이후의 작업에서도 이 두 플래그를 활용할 것이다.
또한 엄폐 시의 Idle, Walk 애니메이션을 다음과 같이 준비하고, 블렌드 스페이스 1D를 만들었다.
낮은 엄폐를 구현했을 때와 정확히 같은 방식이다.
이제 상술했듯이, IsInCover상태에서 IsCrouching에 따라 서서 엄폐 / 앉아 엄폐 애니메이션을 구분하여 재생하도록 하였다. (Blend Poses by bool)
다음은 카메라를 고려해야한다.
서서 엄폐할 때는 시야 상의 불편함을 줄이기 위해 움직이는 방향대로 카메라가 움직여주어야 한다.
이에 따라 미뤄두고있었던 카메라 좌우 전환 기능을 만들었다.
이는 다음 포스팅으로 이어진다.
'언리얼 엔진 5 > 개발 일지' 카테고리의 다른 글
[UE5] 블루아카이브 TPS게임 개발일지 (36) - 엄폐 시스템 구현 6 (0) | 2024.01.10 |
---|---|
[UE5] 블루아카이브 TPS게임 개발일지 (35) - 엄폐 시스템 구현 5 (0) | 2024.01.10 |
[UE5] 블루아카이브 TPS게임 개발일지 (33) - 엄폐 시스템 구현 3 (5) | 2024.01.07 |
[UE5] 블루아카이브 TPS게임 개발일지 (32) - 엄폐 시스템 구현 2 (0) | 2024.01.07 |
[UE5] 블루아카이브 TPS게임 개발일지 (31) - 엄폐 시스템 구현 1 (0) | 2024.01.07 |