언리얼 엔진 5/공부 16

[언리얼 엔진 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 이제 이 표시기가 피격 시 화면에 떠야 한다. 맞을 때마다 일일히 화면에 띄워주고, 없애주기 귀찮아 약간의 꼼수를 썼다. 사실은 항상 화면에 떠..

[언리얼 엔진 5] 블루프린트에서 디버깅하는 방법

게임을 돌려보면서 디버깅을 해보고 싶을 때, 비주얼 스튜디오에서는 텍스트 편집기 좌측에 중단점을 설정할 수 있었다. 코드가 진행되다가 중단점을 만나면 게임이 멈추고, 그 상태에서 코드를 한줄씩 실행해보면서 어느 변수에 어떤 값이 들어가는지, 어느 함수에서 예외가 발생했는지 등을 파악하며 디버깅을 쉽게 할 수 있었다. 언리얼 엔진의 블루프린트도 똑같은 기능을 지원한다. 예시를 위해 AIController의 이벤트 그래프 중 일부를 준비했다. 브랜치 노드에 빨간 중단점이 달려있는 것이 보일 것이다. 비주얼 스튜디오에서의 그것과 같은 기능이다. 블루프린트에서는 노드를 우클릭하고 Add BreakPoint를 눌러 중단점을 만들어줄 수 있다. 다음은 이 상태로 게임을 실행한 결과이다. 빨간색 화살표가 중단점에 해..

[언리얼 엔진 5] 라이브 코딩 내용이 적용이 안될 때

언리얼 엔진5로 개발을 하다보면 종종 라이브 코딩을 통해 컴파일을 해도 변경사항이 적용이 안될 때가 있다.또한 라이브 코딩으로 컴파일을 해도 엔진을 껐다가 켜면, 변경사항이 적용이 되어있지 않다.  라이브 코딩은 간단한 변경사항을 빠르게 확인하기 위한 것으로, 편리하긴 하지만 다소 불안정한 기능이다. 확실한 컴파일을 위해서는 에디터를 닫고 비주얼 스튜디오에서 컴파일하는 것이 좋다.  변경사항이 적용되지 않을 때 외에도 다수의 클래스를 수정하였을 때, 엔진의 런타임 중 컴파일을 하면 문제가 될 수 있는 부분(애니메이션 블루프린트의 부모 C++ 클래스 등)을 수정했을 시엔 에디터를 닫고 컴파일 해주는 것이 좋다.  비주얼 스튜디오에서 Ctrl + f5(디버그하지 않고 시작)를 누르면 자동으로 컴파일 후 엔진..

[언리얼 엔진 5] 프로젝트에 모듈을 추가하는 방법

언리얼 엔진 5의 일부 클래스들은 사용에 앞서 모듈을 추가해주어야 한다.  예를 들어, UWidget은 언리얼 엔진에서 사용할 수 있는 UI를 지원해주는 클래스이다.https://docs.unrealengine.com/5.2/en-US/API/Runtime/UMG/Components/UWidget/ UWidgetThis is the base class for all wrapped Slate controls that are exposed to UObjects.docs.unrealengine.com위의 문서를 보면, References 목차에 Module이 UMG라고 적혀있는 것을 볼 수 있다.이는 UWidget을 사용하기 위해서는 UMG 모듈을 프로젝트에 추가해야 한다는 것을 의미한다.   모듈을 프로젝트..

[언리얼 엔진 5] 언리얼 엔진에서의 OnTriggerEnter (OnComponentBeginOverlap)

유니티로 게임을 개발해본 사람은, OnTriggerEnter 혹은 OnCollisionEnter를 사용하여 무언가 이벤트가 발생하도록 해본 경우가 많을 것이다. 언리얼 엔진에서는 비슷한 것으로 OnComponentBeginOverlap 델리게이트가 있다. 여기서 Component는 Box/Capsule/Sphere Collision이 될 수 있겠다. 델리게이트라는 단어가 생소하다면, 이벤트라고 이해하면 된다. https://docs.unrealengine.com/5.3/ko/delegates-and-lamba-functions-in-unreal-engine/ 델리게이트 C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형입니다. docs.unrealengine.com UnityEvent를 사..

[언리얼 엔진 5] BlueprintNativeEvent에 대해서, 사용 시 주의할 점

https://docs.unrealengine.com/5.3/ko/ufunctions-in-unreal-engine/ UFunctions게임플레이 클래스용 함수 생성 및 구현에 대한 개요입니다.docs.unrealengine.com함수 지정자 목차에 관련 내용이 있다.   함수에 UFUNCTION(BlueprintNativeEvent) 매크로를 달아주면, 함수의 기본 정의는 C++ 클래스에 구현해놓고 블루프린트에서 이를 확장, 또는 대체하는 것이 가능하다.   기본 C++ 문법의 가상함수와 비슷하다. 기본적인 구현이 되어있지만, 서브클래스에서 오버라이딩 할 수 있다.   UFUNCTION(BlueprintImplementableEvent)가 C++ 코드에서는 헤더에 함수의 선언만 해놓고, 그 구현을 블루..