언리얼 엔진 5 81

[언리얼 엔진 5] 가비지 컬렉션(+유니티와의 차이), 스마트 포인터

C++에는 가비지 컬렉션 기능이 없기 때문에, 언리얼 엔진에서는 이를 자체적으로 만들어 사용한다. 가비지 컬렉션은 리플렉션 시스템에 의존하는 엔진 내 기능 중 하나이다.리플렉션 시스템에 대해 자세한 내용은 https://ciel45.tistory.com/127 [언리얼 엔진 5] 리플렉션 시스템리플렉션이란, 프로그램이 실행 중 자기자신을 조사하는 기능을 의미한다. 에디터의 디테일 패널, 직렬화, 가비지 컬렉션, 네트워크 리플리케이션, 블루프린트/C++ 간 커뮤니케이션 등 엔진 내ciel45.tistory.com 가비지 컬렉션이란?우리가 C++로 동적 할당을 사용할 때 new, delete를 사용하는데, 실수로 사용하지 않는 객체에 delete를 안하면 메모리 누수가 발생한다.또한 실수로 사용 중인 객체를..

[언리얼 엔진 5] 리플렉션 시스템

리플렉션이란, 프로그램이 실행 중 자기자신을 조사하는 기능을 의미한다. 에디터의 디테일 패널, 직렬화, 가비지 컬렉션, 네트워크 리플리케이션, 블루프린트/C++ 간 커뮤니케이션 등 엔진 내 다수의 시스템의 기반이 되는 시스템이다. 언리얼 엔진 내에서는 그래픽 용어와 구분짓기 위해서 프로퍼티 시스템이라고 부르기도 한다. 클래스 / 변수 / 함수에 리플렉션 매크로를 붙여주면 해당하는 리플렉션 객체가 생성되는데, 각 매크로마다 어떤 객체가 생성되는 지는 다음과 같다.UCLASS (리플렉션되는 클래스임을 의미)UCLASS 매크로를 붙여준 클래스는 해당 클래스를 설명하는 UClass 객체가 런타임에 생성된다.해당 UClass 인스턴스가 곧 CDO와 같다.또한 각 UCLASS 인스턴스는 자신의 부모 클래스를 가리키..

[언리얼 엔진 5] 싱글톤 패턴 (Subsystem)

유니티에서 싱글톤을 구현하는 방법은 다음과 같다.using UnityEngine;public class Singleton : MonoBehaviour{ public static Singleton instance; private void Awake() { if (instance == null) instance = this; }}  그런데 언리얼 엔진 5에서 GameManager같은 것을 유니티에서와 같은 방식으로 싱글톤으로 만드려고 하면, 엔진의 시스템 상 차이때문에 쉽지 않다.  하지만 언리얼 엔진 5에서는 UGameInstanceSubsystem을 상속받은 클래스를 만듦으로써 손쉽게 싱글톤 클래스를 만들 수 있다.  https://dev.epicga..

[언리얼 엔진 5] 언리얼 엔진에서의 순수 가상함수 사용법

순수 가상함수는 부모클래스에서 당장은 구현을 제공하지 않고, 자식클래스에서 구현을 강제하는 문법이다. C++ 프로그래밍에서, 순수 가상함수는 다음과 같은 포맷을 사용한다. virtual void MyFunc() = 0; C++의 순수 가상함수는 C# / java에서의 추상 함수와 같다. 순수 가상함수는 자식클래스가 해당 함수를 무조건 오버라이딩하도록 함으로써, 동적 바인딩을 통한 확장성을 높여 프로그램의 디자인을 좋게 만든다. 그런데, 언리얼 엔진 5에서는 순수 가상함수의 문법이 조금 다르다. 상단의 네이티브 C++ 문법을 그대로 쓰면, 다음과 같은 컴파일 에러 메시지를 볼 수 있다. 'Only functions in the second interface class can be declared abstr..

[언리얼 엔진 5] Retriggerable Delay 사용법 (FLatentActionInfo)

게임 로직을 구성할 때, 특정 조건으로 인해 이벤트가 트리거되고, 일정 시간 동안 해당 조건이 발생하지 않아야 이벤트가 종료되어야 하는 상황이 있을 수 있다. 예를 들자면, FPS / TPS 게임에서 적에게 피격당했을 시 데미지 방향 표시기가 나타나는데, 일정 시간 동안 추가적인 공격을 받지 않아야 표시기가 페이드 아웃되어 사라지고, 그 전에 추가 공격을 받을 시 표시기가 업데이트된다. 아래는 프로젝트 내에서 해당 로직을 사용한 상황이다. https://ciel45.tistory.com/62 블루아카이브 TPS게임 개발일지 (45) - 피격 방향 표시기 구현 2 이제 이 표시기가 피격 시 화면에 떠야 한다. 맞을 때마다 일일히 화면에 띄워주고, 없애주기 귀찮아 약간의 꼼수를 썼다. 사실은 항상 화면에 떠..

[UE5] 블루아카이브 TPS게임 개발일지 (64) - 프로젝트 마무리

프로젝트를 오늘까지 끝내기로 마음먹고, 어제 밤을 샜다. 우선 대사가 겹쳐서 사라지는걸 막기 위해 큐를 이용해 대사들을 빠짐없이 보여주도록 하였다. Conversation.h/*생략*/UCLASS()class KANNATPS_API UConversation : public UUserWidget{ GENERATED_BODY()/*생략*/private: /*생략*/ TQueue> ConversationQueue; TQueue MessageQueue;}; Conversation.cpp// Fill out your copyright notice in the Description page of Project Settings./*생략*/void UConversation::SetConversation(){ // 큐에..

[UE5] 블루아카이브 TPS게임 개발일지 (63) - 맵 연결 (Level Streaming)

일전에 게임의 맵으로 쓸 3개의 층을 만들어놓았었다.https://ciel45.tistory.com/68 블루아카이브 TPS게임 개발일지 (50) - 맵 제작개인적으로 게임 제작 중 제일 어렵다고 느끼는 맵 제작을 슬슬 할 때가 왔다. 최근 약 1~2주 동안은 계속 레벨디자인 작업만 한 것 같다. 발키리 경찰학교를 구현하기 위해서, 블루아카이브의 키ciel45.tistory.com 이제 이 3개의 레벨을 연결해볼 것이다. 게임 상에 레벨 3개를 모두 로드해놓으면, 성능 하락이 발생할 수 있다.따라서 칸나가 현재 위치한 층만 로드되어있도록 할 것이다. 언리얼 엔진 5에서는 이것을 Level Streaming이라는 이름으로 이미 제공하고 있다. 들어가기에 앞서, Level Streaming을 쓸 때는 동적으..

[UE5] 블루아카이브 TPS게임 개발일지 (62) - 대사 기능 적용

대사가 나오는 경우는 두가지로 분류할 수 있다.칸나가 특정 구역에 들어가는 경우적 / 칸나가 특정 이벤트에 반응하는 경우 1번을 위해서, BP_ConversationTrigger를 만들었다.트리거에 칸나가 들어오면, OnComponentBeginOverlap 이벤트를 수행한다.ConversationManager의 Set Conversation을 호출한다. Speaker와 Content 두 변수 우측의 눈 표시를 눌러, 해당 변수가 인스턴스마다 지정될 수 있도록 할 수 있다.  결과적으로 특정 구역에서 칸나 / 적이 대사를 하게 하려면, 맵에 BP_ConversationTrigger를 배치한 뒤 디테일 패널에서 Speaker, Content에 원하는 문장을 넣어주면 된다.    2번을 위해서는, 해당 이벤..

[UE5] 블루아카이브 TPS게임 개발일지 (61) - 대사 시스템 (Typewriter 효과)

칸나와 적의 대사를 자막처럼 넣어, 게임이 덜 심심하도록 해볼 것이다. 제일 먼저, ConversationManager 클래스를 만들었다. GameManager와 같이 SubSystem을 상속받은 클래스이며, 대사를 칠 캐릭터들은 ConversationManager의 SetConversation만을 호출하면 되도록 할 것이다. ConversationManager.h:// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "Subsystems/GameInstanceSubsystem.h"#include "ConversationManager.gen..

[UE5] 블루아카이브 TPS게임 개발일지 (60) - GameManager로 적 관리

지난 포스팅에서 UGameInstanceSubsystem을 상속받은 클래스 UGameManager를 만들어, 게임의 볼륨을 조정하는 함수를 만들었다.  이번 포스팅에는 UGameManager의 추가적인 설명과 더불어, UGameManager를 사용한 적들의 팀플레이 기능을 만들고자 한다.  언리얼 엔진의 Subsystem은 UGameInstanceSubsystem 외에도 여러가지가 있다.https://docs.unrealengine.com/5.3/ko/programming-subsystems-in-unreal-engine/ 프로그래밍 서브시스템언리얼 엔진 4 의 프로그래밍 서브시스템 개요입니다.docs.unrealengine.com  SubSystem은 와 수명 주기가 똑같다.  게임 전반에 걸쳐 지속적..