본문 바로가기

Unreal Project

QuestSystem Unreal Engine 5 퀘스트 시스템 구조 정리📌 전체 구조 개요이 퀘스트 시스템은 다음의 클래스로 구성되어 있습니다: URMQuest: 하나의 퀘스트 데이터를 보관하는 객체 URMQuestSubsystem (UGameInstanceSubsystem): 퀘스트의 전역 관리자. 퀘스트 생성/완료 처리 및 진행 상황을 추적 URMQuestGiverComponent: NPC에 부착되는 컴포넌트로, 어떤 퀘스트를 줄지, 완료 처리를 어떻게 할지를 담당 ARMQuestGiverCharacter: 퀘스트를 제공하는 NPC 캐릭터 클래스🧩 URMQuest 클래스 - 퀘스트 정보 단위URMQuest는 UObject를 상속받은 퀘스트 데이터 클래스이며, 하나의 퀘스트가 어떤 대상과 조건을 가지고 있는지를.. 더보기
FloatingDamage 구조 문제 🧩 왜 FloatingDamage를 GameInstanceSubsystem에서 처리했는가처음에는 Floating Damage를 일반적인 UI처럼 처리하려고 했다. FloatingDamageManager라는 매니저 클래스를 만들고, 이를 HUD에서 관리하도록 했다.🚧 구조적 한계적 캐릭터가 데미지를 받을 때, FloatingDamageManager를 통해 화면에 데미지를 띄워야 한다. 그런데 FloatingDamageManager는 플레이어의 HUD에 종속되어 있어서, 적 캐릭터의 BeginPlay()에서는 직접 접근이 불가능하다.결국 EnemyCharacter에서 아래와 같은 경로로 접근해야 한다.EnemyCharacter └── GetWorld()->GetFirstPlayerController().. 더보기
FloatingDamage - AbilitySystemComponent 🎯 Floating Damage 시스템 구현 (UE5 + GAS)Floating Damage란, 적에게 가한 피해량을 화면에 표시해주는 시스템입니다. RPG나 액션 게임에서 흔히 볼 수 있는 기능으로, Unreal Engine의 Gameplay Ability System(GAS)을 활용해 구현할 수 있습니다.📌 Attribute 값 변경 감지모든 캐릭터는 AttributeSet을 통해 체력, 스태미너 등의 능력치를 관리합니다.그리고 AbilitySystemComponent의 GetGameplayAttributeValueChangeDelegate()를 사용하면, 특정 Attribute 값이 변경되었을 때 알림을 받을 수 있습니다.// 체력(Attribute)이 바뀔 때 실행될 Delegate를 등록vo.. 더보기
Dodge 🎮 Unreal Engine: 캐릭터 회피(Dodge) 방향을 캐릭터 기준으로 처리하는 방법게임에서 회피(Dodge)를 구현할 때, 단순히 입력 방향대로 움직이게 하면 자연스럽지 않을 수 있다.특히, 카메라 기준 이동이 적용된 게임에서는 입력 방향과 캐릭터가 실제로 바라보는 방향이 다를 수 있기 때문이다.이번 글에서는 Unreal Engine에서 "카메라 기준 입력 방향"을 이용해 캐릭터 기준 회피 방향을 판단하는 방식을 자세히 정리한다.🧠 문제 상황 정리카메라는 정면을 보고 있다.플레이어는 D 키를 눌러 캐릭터를 오른쪽으로 이동시킨다.이때 캐릭터는 오른쪽을 바라보며 이동한다.이 상태에서 대시(Dodge) 키를 누르면?단순히 D 키(오른쪽 입력) 기준으로 판단하면, 캐릭터는 자신의 오른쪽(=카메라 기.. 더보기
EnemyCharacter의 AnimInstance가 적용이 안되는 문제(해결) 문제BP_Undead의 애니메이션 블루프린트(ABP)가 실행되지 않음.내용RMEnemyCharacter를 상속받아 BP_Undead를 생성하고 Mesh 및 ABP를 설정했으나 애니메이션이 동작하지 않음.같은 Mesh와 ABP를 RMPlayerCharacter를 상속받은 BP_Test에서 사용했을 때는 정상적으로 애니메이션이 출력됨.ABP의 BeginPlay()와 Tick()에 중단점을 걸었으나 실행되지 않음.원인 분석AActor::BeginPlay()는 자신이 보유한 모든 UActorComponent의 BeginPlay()를 호출함.USkeletalMeshComponent의 BeginPlay()에서 AnimInstance의 초기화가 이루어짐.하지만 RMEnemyCharacter::BeginPlay()에서.. 더보기
GAS를 활용한 콤보 공격 GAS에서 콤보 공격을 구현할 때 Tag를 활용한다. GA(GameplayAbility)에는 Tag를 부여할 수 있고 TryActivateAbilitiesByTag()는 Tag를 포함하는(하위 태그 포함) 모든 GA를 활성화 시킬 시도를 합니다. 그래서 우리는 콤보스킬를 구현할 때, 같은 콤보로 구성된 스킬들의 태그는 동일한 부모의 하위 태그로 구성해주어야 한다.ex) Attack.Combo.1, Attack.Combo.2, Attack.Combo.3 ... 함수호출할 때는 TryActivateAbilitiesByTag(Attack.Combo) 하지만 우리는 같은 콤보로 구성된 스킬들이라고 해도, 스킬을 1번 실행하면 1개의 스킬만 실행되어야 한다. 그렇기 때문에 조건을 주어서 상황에 맞는(콤보에 맞는).. 더보기
FloatingDamageWidget 적에게 입힌 데미지를 화면에 표시하는 기능. 적에게 데미지를 입히게 되면 데이터화 시킨 후 WidgetManager에게 HitData를 전송.WidgetManager는 전달 받은 HitData를 통해 값을 설정하고 화면에 띄워줍니다. HitDataUSTRUCT(BlueprintType)struct FSHHitData{ GENERATED_BODY() // Constructor FSHHitData() {} FSHHitData(AActor* InAttackActor, AActor* InTargetActor, float InFinalDamage, bool InIsHealing, bool InIsCritical) : AttackActor(InAttackActor) , TargetActor(InTargetAct.. 더보기
SkillCooldownSystemComponent 스킬의 쿨타임을 관리하는 컴포넌트입니다. 쿨다운이 진행중인 스킬들을 Map형태로 갖고있고, Tick()함수를 통해 해당 스킬들의 쿨타임을 줄이는 방식을 활용했습니다.   유저가 단축키를 누르면 SkillSystemComponent에서 (1) 을 통해 해당 스킬의 쿨타임을 확인합니다.만약 쿨타임이 진행중이지 않으면 (2) 를 통해 스킬을 활성화 하고 해당 스킬의 쿨타임이 시작됩니다. void USHCooldownSystemComponent::StartCooldown(const FGameplayTag& InSkillTag, float Duration){ if (!ActiveCooldowns.Contains(InSkillTag)) { ActiveCooldowns.Add(InSkillTag, FCooldown.. 더보기