< '언리얼엔진5/FPS 게임 1인 프로젝트' 카테고리의 글 목록

언리얼엔진5/FPS 게임 1인 프로젝트 6

[UE5 FPS 프로젝트] 6. ADS(조준) 시스템

ADS(Aim Down Sight, 조준) 시스템     Timeline 을 이용해서 ADS 시스템을 만들었습니다. 동작 원리는 간단한게 우클릭 시 FOV 를 조정해주고,메쉬를 중앙에 이동시킨 뒤, 팔에 알맞은 애니메이션을 재생해 주면 됩니다. void AVICharacter::ADSTimeLineFunc(float value){ D("TimeLine") if (bEquippedWeapon) // AK47 { GetCamera()->SetFieldOfView(FMath::Lerp(90.0f, 45.0f, value)); FirstPersonMesh->SetRelativeLocation(FMath::Lerp(FVector(1.6f, 7.8f, -23.6f), FVector(1.6f, 0.0f, -16..

[UE5 FPS 프로젝트] 5. 총 추가 구현 및 Swap

VIGlockWeapon    Weaponbase에서 상속받아 VIGlockWeapon을 만들고 블루프린트도 만들어 부모 클래스를 VIGlockweapon으로 설정해 주었습니다.    그리고 메쉬를 변경해 주었고, PointLight 와 Muzzle, MuzzleFlash 등을 메쉬에 맞게 조정해주었습니다.         WeaponBase 에서 선언해놓은 순수 가상함수들을 오버라이드 해 주어서 기능을 구현했습니다.  VIAKWeapon과 다른 점은 재생하는 에셋만 입니다. ++) 24.06.19 수정사항ChildActorComponent 부착 후 override 된 메서드들 호출 시 에디터가 읽어들이지 못해 순수 함수 매크로를 지우고, 빈 선언만 Weaponbase에 놔두었습니다.   Weapon Sw..

[UE5 FPS 프로젝트] 4. 총알 궤적, 총구 화염, 총알 자국, 탄퍼짐 구현

머터리얼을 사용해 총알 궤적, 총구 화염, 총알 자국 등을 구현했습니다.머터리얼에 관한 공부 내용은 다른 게시글로 정리할 예정입니다. 탄퍼짐     현실성을 가미하기 위해서 RandRange를 통해 TraceEnd 지점을 랜덤하게 정해주었습니다. 캐릭터의 이동 속도가 20.0f 이상일 때 총알이 랜덤하게 나가도록 설정 했습니다. 후에 가능하다면 Lerp 와 Clamp 를 통해 이동 속도에 비례해서 탄퍼짐 정도를 수정 할 수 있을 것 같습니다. 추가 구현 시 이곳에 정리해놓을 예정입니다.  // Camera Linetrace FHitResult HitResult; FVector TraceStart = Character->GetCamera()->GetComponentLocation(); FVector Tra..

[UE5 FPS 프로젝트] 3. HUD 및 피격 구현

HUD     HUD는 위젯 블루프린트를 통해 구현 했습니다. 아래의 화면처럼 구성을 하였고, 함수 바인딩을 통해 값이 업데이트 되도록 했습니다.      아래의 방식대로 위 허드의 위젯에 함수를 바인딩 했는데, 이 방법은 틱마다 위젯이 업데이트 되어 성능에 영향을 줄 수 있습니다. 따라서 조만간 프로퍼티가 업데이트 되었을 때만 위젯의 값을 변경하는 방식으로 리팩토링 할 예정입니다. 크로스헤어 위젯 크로스헤어 위젯은 막대 4개로 구성되어 있는데, 상 하 좌 우 크로스헤어가 존재합니다. 각각의 크로스헤어는 FInterpTo 를 통해 부드럽게 보간되는데, 원리는 다음과 같습니다.    위쪽 크로스헤어를 기준으로 설명합니다.     1. 현재 Position의 Y좌표를 가져옵니다. (상하좌우의 크로스헤어는 화..

[UE5 FPS 프로젝트] 2. 발사 및 재장전 구현

팔의 재장전 애니메이션과 총의 재장전 애니메이션을 R키를 누르면 싱크에 맞게 재생하도록 구현했습니다. Do once 노드 대신에 불리언으로 한번 실행을 구현했는데, 타이머 설정을 통해 장전하는 시간 동안에는 R키 연타로 재장전 애니메이션이 여러번 재생되는 것을 막았습니다. AVICharacter::Reload()void AVICharacter::Reload(){ if (PrimaryWeapon->GetAmmoCount() GetMaxAmmo()) { if (!bDoOnceReload && !bIsReloading) { bIsReloading = true; FirstPersonMesh->GetAnimInstance()->Montage_Play(ReloadActionMontage,1.0f); ..

[UE5 FPS 프로젝트] 1. 1인칭 구현 및 무기 부착

void AVICharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent){ Super::SetupPlayerInputComponent(PlayerInputComponent); UEnhancedInputComponent* EnhancedInputComponent = CastChecked(PlayerInputComponent); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, ..