< '언리얼엔진5' 카테고리의 글 목록

언리얼엔진5 59

[UE5 C++] 언리얼엔진 Timeline C++ 에서 구현하기

헤더// TimeLine SectionFOnTimelineFloat ADSCallback;FOnTimelineEvent ADSTimelineFinish;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Timeline)TObjectPtr ADSTimeline;UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = Timeline)TObjectPtr ADSCurve;        헤더에서 선언해야 할 것 네가지TimelineComponetCurveFloatFOnTimelineEvent DelegateFOnTimelineFloat Delegate1번 타임라인 컴포넌트는 타임라인을 재생하는 컴포넌트 이다.2번 CurveFloa..

[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, ..

[UE5] ProjectileMovementComponent

ProjectileMovementComponent    언리얼 엔진에서 탄환, 로켓, 화살 등과 같은 발사체의 운동을 처리하기 위한 컴포넌트입니다. 이 컴포넌트를 사용하면 발사체가 물리 법칙에 따라 자연스럽게 움직이고 상호작용하도록 만들 수 있습니다.  사용 예시// Fill out your copyright notice in the Description page of Project Settings.#include "Weapon/VITracerRound.h"#include "Components/SphereComponent.h"#include "GameFrameWork/ProjectileMovementComponent.h"// Sets default valuesAVITracerRound::AVITracer..

[UE5] Quat(쿼터니언) / Rotator (로테이터)

FQuat    쿼터니언은 3차원 공간에서 회전을 표현할 때 사용하는 수학적 도구이다. 쿼터니언의 장점     1. Gimbal Lock 방지 : 오일러 각도를 사용하여 각을 표현할 때  생기는 짐벌락을 방지할 수 있음 짐벌락 이란?https://kangworld.tistory.com/185 [Unity] 짐벌락과 오일러 각 그리고 쿼터니언✍️ 짐벌락 짐벌이란 단일 축을 중심으로 물체가 회전할 수 있도록 만들어진 구조물이다. 각각의 고리는 고유한 축을 기준으로 회전하는데 이는 가장 바깥쪽 고리만 해당할 뿐 안쪽 고리들은kangworld.tistory.com     2. 효율적인 회전 보간 : 회전을 부드럽게 보간할 수 있어 자연스러운 움직임을 만들 수 있다.     3. 컴팩트한 표현 : 하나의 스칼라와..

[UE5] 타이머 사용하기

FTimerHandle ReloadTimeHandle; GetWorld()->GetTimerManager().SetTimer(ReloadTimeHandle, FTimerDelegate::CreateLambda([&]() { bIsReloading = false; // TimerHandle 초기화 GetWorld()->GetTimerManager().ClearTimer(ReloadTimeHandle); }), PrimaryWeapon->GetReloadTime(), false); 타이머 핸들을 부착해주고 함수를 연결하거나 람다함수를 바로 선언해준다. 인자는 아래와 같다.(핸들, 함수, 대기 시간, 반복 여부)