언리얼 엔진 5/개발 일지 65

[UE5] 블루아카이브 TPS게임 개발일지 (54) - EX 스킬 제작 2 + LSP

바로 이전 포스팅에서 ExProjectile을 임시로 만들었는데, ExProjectile도 제대로 C++ 클래스를 만들어 코드 상으로 관리하고자 한다. ExProjectile은 Projectile과 굉장히 비슷하다. Projectile의 거의 모든 특징을 그대로 가진다.  일반적인 생각으로는, ExProjectile은 Projectile의 일종이다. 즉, is-a 관계가 성립하여, ExProjectile은 Projectile을 상속받도록 하는 것이 적절하다. 다만, 여기서 LSP를 고려해볼 필요가 있다.LSP란 리스코프 치환 법칙을 의미한다. 그 의미는 간단히 하자면 다음과 같다. 자식 클래스는 부모 클래스를 대체할 수 있어야한다. 더 직관적으로 표현하자면, 부모 자리에 자식이 들어가도 지장이 없어야 한..

[UE5] 블루아카이브 TPS게임 개발일지 (53) - EX 스킬 제작 1

우선, 칸나가 권총을 들고 있을 땐 EX스킬을 사용할 수 있어야 하고, 소총을 들고 있을 땐 EX스킬을 사용할 수 없어야 한다.KannaCharacter 클래스가 각 무기 종류에 대해 의존성을 가지는 것은 피하려고 한다. 오직 AGun 클래스에만 의존하게 하는 것이 목표이다.따라서 AGun 클래스에 KannaCharacter에서 사용할 여러 프로퍼티를 만들어주었다.// AGun.h 중 일부bool HasExSkill; //EX 스킬을 사용 가능한 총인지bool ExSkillReady; // true 시 다음 발사 시 EX 스킬이 나간다. //KannaCharacter에서 호출할 함수FORCEINLINE virtual void ReadyExSkill() {ExSkillReady = true;} Rea..

[UE5] 블루아카이브 TPS게임 개발일지 (52) - 리팩토링

EX 스킬을 구현하기에 앞서, 한번 더 시간을 들여 프로젝트 전체적으로 리팩토링을 진행해주었다. 먼저, BP_Enemy에서 구현했던 One Shot, Shoot 이벤트를 C++로 만들었다.  블루프린트는 기본적으로 같은 로직을 수행하더라도 C++보다 성능이 떨어지기 때문에, 호출이 빈번한 기능은 C++로 만드는 것이 좋다. One Shot도 그러한 경우이다.void AEnemy::OneShot(){ if (!TargetCharacter) return; // 플레이어를 바라보도록 FRotator DesiredRotation = UKismetMathLibrary::FindLookAtRotation(GetActorLocation(), TargetCharacter->GetActorLocation()); //피..

[UE5] 블루아카이브 TPS게임 개발일지 (51) - EX 게이지 제작

이번엔 EX 스킬 게이지를 만들어 볼 것이다. 10칸으로 나누어진 게이지가 시간의 흐름에 따라 천천히 차는 것을 볼 수 있다. 언리얼 엔진에서 이러한 게이지를 구현하기 위해서는 UProgressBar를 사용하면 된다. 일전에 만들어두었던 KannaTPSOverlay 클래스에 EX 게이지에 해당하는 UProgressBar를 새로 만들었다. //KannaTPSOverlay.h에 변수 추가UPROPERTY(meta = (BindWidget))UProgressBar* ExGauge;UPROPERTY(meta = (BindWidget))UTextBlock* ExNumberText; ExGauge가 그 UProgressBar이다.ExNumberText는 현재 몇 코스트가 찼는지를 나타내기 위한 UTextBlock이..

[UE5] 블루아카이브 TPS게임 개발일지 (50) - 맵 제작

슬슬 개인적으로 제일 어렵다고 느끼는 맵 제작을 할 때가 왔다. 최근 약 1~2주 동안은 계속 레벨디자인 작업만 한 것 같다.  발키리 경찰학교를 구현하기 위해서, 키 이미지를 참고하였다. 건물 전반적으로 푸른 느낌이 나고, 심문실은 건조한 느낌이 들도록 하는 것을 목표로 하였다. 처음에는 무료 에셋만으로 맵을 만들어보려했지만, 한계를 느끼고 언리얼 마켓플레이스에서 경찰서 느낌이 나는 에셋을 구매하였다. https://www.unrealengine.com/marketplace/ko/product/police-station-and-interrogation-room-pack-modular Police Station (Office) & Interrogation Room (Modular), 카테고리 배경 - U..

[UE5] 블루아카이브 TPS게임 개발일지 (49) - 스크린 데미지 효과 적용

현재 만들어져있는 포스트프로세스는 인게임에서 사용하려면 Material Instance로써 들어가야한다. 만든 포스트 프로세스에 우클릭을 하여 Create Material Instnace를 눌러 인스턴스를 만들어, 이름을 PPI_ScreenDamage로 지었다. 그리고 그 인스턴스가 들어갈 곳은 PostProcessVolume의 Post Process Materials 배열 내부이다. C++ 코드에서 머티리얼 인스턴스를 저기에 집어넣고, 플레이어 체력에 따라 Radius를 조정하는 것까지 수행할 것이다. KannaCharacter.h에 다음과 같은 변수를 추가하였다.UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (AllowPrivateAccess = "..

[UE5] 블루아카이브 TPS게임 개발일지 (48) - 스크린 데미지 효과 (Radial Gradient Exponent)

이번엔 화면 가장자리가 붉어지는 효과를 만들 것이다. 구현하기 위한 방법으로 생각해본 것은 2가지이다.위젯을 이용한다.포스트 프로세스를 이용한다.위젯을 사용하는 쪽이 구현하기에 간편하지만, 데미지의 양에 따라 붉은 면적이 늘어나는 것을 구현하기가 더 어려울 것 같다는 생각이 들었다. 따라서 포스트 프로세스를 이용하기로 하였다.  우선 머티리얼을 생성하고, 좌측 하단 디테일 패널에서 Material Domain을 PostProcess로 지정해주었다. 그리고 SceneTexture 노드와 마스크를 통해 원본 씬의 RGB를 가져온다. 화면의 가장자리만이 붉어야 하므로 RadialGradientExponent 노드를 사용할 것이다.https://docs.unrealengine.com/4.27/ko/Renderi..

[UE5] 블루아카이브 TPS게임 개발일지 (47) - HP 자동회복 구현

할게 많아서 최대한 간단하고 빠르게 자동회복을 구현해 볼 것이다. 현재 KannaCharacter에 달려있는 AttributeComponent에 다음과 같은 멤버를 추가하였다. 변수: IsRecovering, RecoverRate함수: EnableHealthRegen(), DisableHealthRegen()// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "Components/ActorComponent.h"#include "AttributeComponent.generated.h"UCLASS( ClassGroup=(Custom), met..

[UE5] 블루아카이브 TPS게임 개발일지 (46) - 피격 방향 표시기 구현 3

Projectile가 생성되는 타이밍은 BP_Enemy의 OneShot 함수에서이다.따라서 Projectile의 Instigator를 설정해주는 것도 OneShot 안에서 해줄 것이다. 매우 간단히, SpawnActor시 Instigator를 this로 설정해주면 된다.  이제 DamageIndicator 위젯이 적의 방향에 따라 돌아가도록 할 것이다.현재 KannaCharacter와 Causer가 모두 설정되도록 했으므로, 두 액터의 위치 값에 따라 UI의 방향을 잘 바꿔주면 된다. 플레이어가 적을 바라보는 방향에 해당하는 Rotator를 Find Look at Rotation 노드로 찾는다.그리고 플레이어의 Control Rotation 값을 빼준다.Control Rotation을 사용해주는 이유는,..

[UE5] 블루아카이브 TPS게임 개발일지 (45) - 피격 방향 표시기 구현 2

이제 이 표시기가 피격 시 화면에 떠야 한다. 맞을 때마다 일일히 화면에 띄워주고, 없애주기 귀찮아 약간의 꼼수를 썼다. 사실은 항상 화면에 떠있는 채로 투명도를 0으로 하고, 피격당했을 시에만 투명도를 1로 바꿔주는 것이다. 우선 KannaCharacter의 헤더에 다음과 같은 변수를 추가하였다. UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TSubclassOf DamageIndicatorClass; UPROPERTY(BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) UDamageIndicator* DamageIndicator;  TSubcl..