언리얼 엔진 5 81

[UE5] 블루아카이브 TPS게임 개발일지 (39) - 탄약 UI 구현 2

KannaTPSOverlay의 탄약 개수가 실제로 업데이트되도록 할 것이다. 우선, KannaTPSOverlay 클래스 안에 탄약 개수를 설정하는 함수를 만들어주었다.void UKannaTPSOverlay::SetCurrentAmmoText(int32 Amount){ if (CurrentAmmoText) { FString String = FString::FromInt(Amount); CurrentAmmoText->SetText(FText::FromString(String)); }}void UKannaTPSOverlay::SetTotalAmmoText(int32 Amount){ if (TotalAmmoText) { FString String = FString::FromInt(Amount); Tota..

[UE5] 블루아카이브 TPS게임 개발일지 (38) - 탄약 UI 구현 1

슬슬 탄약 시스템과 재장전 시스템을 만들 때가 된 것 같다. 장전 로직의 핵심을 정리해보자면 다음과 같다. 총을 발사할 때마다 탄약 개수가 1씩 줄어든다.현재 탄약이 0이면 발사하지 못한다.장전을 통해 현재 탄약을 최대 탄약으로 채우고, 전체 탄약에서 채운 양을 제외한다. 실은 이러한 기본적인 것들은 이미 Gun 클래스에 구현해두었다.void AGun::Fire(FVector& StartPoint, FVector& Direction){ CurrentAmmo = FMath::Clamp(CurrentAmmo-1, 0, MaxAmmo); // 현재탄약 -1}/** MaxAmmo: 탄창에 들어가는 최대 탄약 개수* CurrentAmmo: 현재 탄창에 들어있는 탄약 개수* ReloadingAmmo: 전체 탄약 개..

[UE5] 블루아카이브 TPS게임 개발일지 (37) - 엄폐 시스템 구현 7

다음은 AimingLeft 스테이트의 내부이다.앞부분은 기존의 Aiming 스테이트와 동일하며, AO_Pistol 과 Output Animation Pose 사이 추가된 Transform (Modify)Bone 노드가 핵심이다. AimingLeft는 엄폐물의 왼쪽 끝에 붙어 조준했을 때 전환되는 스테이트로, 캐릭터가 조준을 함과 동시에 왼쪽으로 살짝 빠져나와야 한다. Transform Bone 노드를 이용해 캐릭터의 뼈를 움직일 수 있다.여기서는 루트와 힙을 각각 캐릭터 기준 왼쪽 방향으로 움직여주었다. (좌측 상단의 작은 뷰포트에서의 좌표와 같이 보면 쉽게 이해할 수 있다.) Translation을 이용하여 이동할 양을 설정해주었다면, 우측 디테일패널의 Translation 섹션에서 Translatio..

[UE5] 블루아카이브 TPS게임 개발일지 (36) - 엄폐 시스템 구현 6

서서 엄폐한 상태에서 조준을 할 때, 기존 방식을 그대로 사용할 순 없다. 좌우로 막힌 상태에서 조준 버튼을 눌러도 조준을 해선 안되며, 좌 / 우로 트여있다면 그 방향으로 몸을 내밀면서 조준해야한다. 또한 카메라도 해당 방향으로 이동해야한다. 우선, CharacterStates.h에 조준 방향을 나타내는 EAimingDirection을 추가하였다.// CharacterStates.h#pragma onceUENUM(BlueprintType)enum class ECharacterState : uint8{ ECS_Unarmed UMETA(DisplayName = "Unarmed"), ECS_ArmedWithPistol UMETA(DisplayName = "Armed With Pistol"), ECS_Arme..

[UE5] 블루아카이브 TPS게임 개발일지 (35) - 엄폐 시스템 구현 5

카메라 좌우 전환을 만드는데는 블루프린트 쪽이 더 직관적일 것 같아, C++에서 함수를 BlueprintImplementableEvent를 사용하여 선언하였다. 그리고 현재 카메라가 좌우 중 어느 쪽에 있는지를 나타내는 플래그 변수를 선언하였다.// KannaCharacter.hUFUNCTION(BlueprintImplementableEvent)void SwitchCameraPos();UPROPERTY(BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))bool IsCameraAtRight SwitchCameraPos의 구현 내용은 다음과 같다.  플레이어가 탭을 눌러 수동으로 카메라를 좌우로 전환할 수 있도록, InputAction을 만들고 Input ..

[UE5] 블루아카이브 TPS게임 개발일지 (34) - 엄폐 시스템 구현 4

지난 포스팅까지 낮은 엄폐물에서의 엄폐의 구현을 완성했다. 이제 높은 엄폐물에서의 엄폐, 즉 서서 엄폐를 제작할 차례이다. 낮은 엄폐에서와 같은 메커니즘을 사용하되, 다음과 같은 변경/추가 요소가 있다.엄폐한 상태에서 가만히 있을 때 꼭 정면을 바라보지 않는다.서있는 상태에서의 엄폐는 방향이 정면으로 고정되어있는 것보다는 살짝 모서리를 바라보고 있는 편이 오히려 더 자연스럽기 때문이다.엄폐물의 오른쪽 끝에 붙어 조준하면 캐릭터가 오른쪽으로 조금 빠져나와 조준한다.엄폐물의 왼쪽 끝에 붙어 조준하면 캐릭터가 왼쪽으로 조금 빠져나와 조준한다.캐릭터가 빠져나와 조준하는 방향으로 카메라도 약간 이동한다. 먼저, 이전에 만들었던 StartCover에 낮은 엄폐인지 구분하는 파라미터를 하나 추가하였다.void AKa..

[UE5] 블루아카이브 TPS게임 개발일지 (33) - 엄폐 시스템 구현 3

엄폐 시에 이동을 담당하는 CoverTrace 함수는 굉장히 길고 복잡하다.따라서 이에 대한 설명을 포스팅 안에서보단, 코드에 주석을 최대한 많이 다는 것으로 대체하고자 한다.코드는 다음과 같다. (PC 환경에서 보는 것을 추천)void AKannaCharacter::CoverTrace(){ FHitResult HitResult; FCollisionQueryParams CollisionParameters; CollisionParameters.AddIgnoredActor(this); FVector ActorLocation = GetActorLocation(); UCharacterMovementComponent* Movement = GetCharacterMovement(); //현재 PlaneConstrai..

[UE5] 블루아카이브 TPS게임 개발일지 (32) - 엄폐 시스템 구현 2

이제 플레이어가 Cover 인풋 액션을 입력하면, 그에 맞는 함수가 실행될 것이다. 현재 인풋에 대한 바인딩은 이렇게 되어있다. //KannaCharacter.cppEnhancedInputComponent->BindAction(CoverAction, ETriggerEvent::Triggered, this, &AKannaCharacter::TakeCover); 콜백함수인 TakeCover은 다음과 같은 기능을 해야한다.엄폐 중일 시 엄폐물에서 빠져나옴엄폐 중이 아니었을 시, 앞에 적절한 엄폐물이 있을 때에만 엄폐 수행 TakeCover 함수는 다음과 같다.void AKannaCharacter::TakeCover(){ if (IsInCover) { StopCover(); } else { WallTrace..

[UE5] 블루아카이브 TPS게임 개발일지 (31) - 엄폐 시스템 구현 1

이번엔 엄폐 시스템을 만들어보고자 한다. 엄폐를 담당하는 InputAction을 만들어 캐릭터에 달고, 매핑하는 과정은 특별할 것이 없기 때문에 이 포스팅에서는 생략하려고 한다. 우선 낮은 엄폐물에 앉아서 엄폐하는 것부터 시작하였다. Mixamo에서 캐릭터가 앉은 채로 행동하는 애니메이션을 받아서 캐릭터에 맞게 조금 수정해주었다. 이 두 애니메이션을 기반으로 속도를 축으로 하는 블렌드 스페이스 1D를 만들었다.  그리고 애니메이션 블루프린트의 MainStates에 InCover 상태를 추가하고, 전환 조건을 새로 만든 변수인 IsInCover의 true/false로 하였다.  그리고, 준비할게 하나 더 있다.엄폐물을 찾기위한 라인트레이싱 채널을 새로 하나 만들 것이다.Project Settings -> ..

[UE5] 블루아카이브 TPS게임 개발일지 (30) - 리팩토링 (블루프린트 -> C++)

게임을 기껏 C++ 프로젝트로 만들어놓고 최근 너무 블루프린트로만 기능을 만든 것 같다. 그래서 오늘은 몇가지 기능을 C++ 코드로 옮겼다.  먼저 BP_Enemy의 NoticePlayer, AwarePlayer 이벤트는 각각 플레이어를 목격했을 때, 플레이어의 위치를 인지했을 때 호출되는 이벤트이다. 지금은 이동속도 증가 기능뿐이지만, 추후 새로운 기능이 추가될 수 있다. 이 두 이벤트를 C++로 옮기되, 이 이벤트에 종속적이던 다른 에셋에는 영향이 없도록 BlueprintCallable 지정자를 사용했다.//Enemy.hUFUNCTION(BlueprintCallable)void NoticePlayer();UFUNCTION(BlueprintCallable)void AwarePlayer(); void A..