언리얼/언리얼 C++ 20

언리얼 C++ - 자료 구조 ~ TArray

언리얼 엔진은 자체 제작한 자료 구조 라이브러리 줄여서 UCL(Unreal Container Libarary)를 제공합니다.이는 언리얼 엔진을 안정적으로 지원하며 다수의 오브젝트 처리에 유용하게 사용할 수 있습니다.이번 포스팅에서는 언리얼 엔진의 자료 구조에서 TArray에 대해 알아보겠습니다. 1) TArrayTArray는 동적 배열 자료구조입니다. 다시 말해 C++의 std::vector와 유사한 성격을 가집니다. 게임을 제작하는 경우에 동적 배열 자료구조를 효과적으로 활용하는 것이 좋은데, 이유는 다음과 같습니다.  데이터가 순차적으로 모여있어 메모리를 효과적으로 사용가능하고 또 캐시 효율이 높습니다.임의의 데이터에 대한 접근이 빠르고, 빠른 속도로 원소를 순회하는 것이 가능합니다.위의 특징에서 알..

언리얼 C++ - 델리게이트

객체 지향 프로그래밍을 하다 보면, 클래스들간의 관계가 형성되는 경우가 있습니다.이 경우를 클래스간의 결합이 생겼다고 표현하는데, 결합에는 2개의 구분이 있습니다. 1) 결합의 구분 - 강한 결합 VS 느슨한 결합하나의 예시를 들어보겠습니다.이전의 포스트에서 Weapon 클래스는 UndefinedPlayer 클래스의 컴포지션으로 사용되었습니다.그런데, 만약 Weapon 클래스의 프로퍼티가 변경되었다고 가정한다면UndefinedPlayer로부터 상속된 자식 클래스들의 컴포지션도 수정해줘야 할 것입니다. 이처럼 클래스들이 서로 의존성을 갖는 경우를 강한 결합이라고 표현합니다.강한 결합이 유지된 클래스는 클래스들간의 관계로 인해 유지, 보수가 매우 어려워집니다. 이와는 반대로 인터페이스도 동작한 SummonI..

언리얼 C++ - 컴포지션

이번 포스트에서는 언리얼 C++에서 사용하는 설계 기법 중 하나인 컴포지션에 대해 알려드리겠습니다.거두절미하고 바로 시작하겠습니다. 1) Is - A VS Has - A우리가 클래스를 사용하는 이유는 보다 확실한 객체 지향 설계를 이뤄내기 위해 사용합니다.그런 점에서 Is-A를 통한 상속 관계의 파악은 객체 지향 설계에서 매우 중요합니다. 하지만, Is-A관계만으로는 클래스의 설계와 유지보수가 매우 힘듭니다.아주 간단한 개념으로 생각해보겠습니다.우리가 RPG 게임을 만든다고 가정할 때, 플레이어는 직업을 선택해야 합니다.직업간의 관계는 상속을 통한 클래스들로 만들어 나갈 수 있습니다. 그렇지만, 직업별로 사용하는 무기나 스킬은 어떻게 구성되야 할까요?분명히 각 직업에 알맞은 무기나 스킬이 존재하고 플레이..

언리얼 C++ - 인터페이스

이번 포스트에서는 언리얼 C++이 일반적인 C++과 다른 차이점 중 하나인 인터페이스에 대해 알아보겠습니다. 1) 인터페이스란?인터페이스는 다음과 같이 설명할 수 있습니다. 객체가 반드시 구현해야 할 행동을 지정하는 데 활용되는 타입다형성의 구현, 의존성이 분리된 설계에 유용하게 활용의존성을 분리함으로써 클래스 간의 종속성을 낮춤이러한 인터페이스는 추상클래스와 비슷하게 보일 수 있지만, 추상 클래스에서는 불가능한 다중 상속이, 인터페이스에서는 허용되는 등의 분명한 차이점이 존재합니다.그리고 이러한 인터페이스는 C++에서는 제공되지 않지만, 더 최신화된 객체지향 언어인 Java나 C# 등에서는 제공되는 기능이기도 합니다. 2) 언리얼 C++ 인터페이스의 특징정리하면 다음과 같습니다. (1) 언리얼 엔진에서..

언리얼 C++ - 언리얼 리플렉션 시스템의 활용

저번 포스트에서는 CDO를 통한 언리얼 오브젝트의 활용을 알아보았습니다.이번 포스트에서는 간단한 예제로 언리얼 리플렉션 시스템을 활용하는 방법을 알아보겠습니다. 1) 클래스의 구성 클래스는 위와 같이 구성되며PlayerPawn은 플레이어의 역할을, NPCPawn은 NPC의 역할을 수행하게 됩니다. 2) NonEnemyPawn 클래스 부모 클래스인 NonEnemyPawn은 위와 같이 구성되어 있습니다.생성자와 DoAction() 메서드 그리고 Getter와 Setter를 만들어 캡슐화를 적용하였습니다.또한 상속받을 클래스에서도 갖고 있어야 하는 요소들에는 UFUNCTION()과 UPROPERTY() 지시자를 사용해언리얼 엔진에서 상속받는 클래스들에서도 같은 구조로 만들어주게끔 설계하였습니다.  생성자와 D..

언리얼 C++ - 언리얼 오브젝트 리플렉션 시스템 ~ CDO

언리얼 엔진은 성능과 안정성을 모두 얻기 위해 자체적인 시스템을 구축하여 이루어졌습니다.그중에서도 리플렉션 시스템은 언리얼 엔진의 근간을 이루는 아주 중요한 부분입니다. 1) 언리얼 오브젝트 리플렉션 시스템이란?리플렉션 시스템은 프로그램이 실행시간에 자기자신을 조사하는 기능을 말합니다.이 기능을 사용하기 위해서는 언리얼 엔진에서 지정한 UENUM(), UCLASS()과 같은 매크로를 수식해줘야 합니다. 매크로가 수식되면 UHT(언리얼 헤더 툴)에 의해 이 매크로들이 분석되고 자동적으로 리플렉션 시스템에 필요한 소스코드들을 생성해줍니다. 이렇게 생성된 소스코드들로 구성된 요소는 언리얼 엔진의 관리 대상이 되는 언리얼 오브젝트로서 작동하게 됩니다. 2) 언리얼 오브젝트의 구성언리얼 오브젝트에서는 특별한 매크..

언리얼 C++ - 언리얼의 문자열

현대의 컴퓨터에서 문자열을 처리하는 방식은 MBCS(Multi Byte Character Set)과 WBCS(Wide Byte Character Set)로 나뉘어 있는 유니코드 방식입니다 그 중에서도 언리얼 엔진에서는 후자인 UTF-16을 사용합니다. 이때 언리얼 엔진에서는 편의성과 일관성을 유지하기 위해 문자열에 대해 다음과 같은 특징을 갖고 있습니다. 1) 언리얼 엔진에서의 문자열의 특징2byte의 균일한 사이즈로 문자를 처리하는 UTF-16을 사용문자열은 반드시 TEXT 매크로를 사용해 지정문자열을 다루기 위한 클래스로 FString을 제공언리얼 엔진에서의 문자열의 특징은 간단하게 위와 같이 정리가 가능합니다. 위와 같은 상황에서 문자열보다 더 깊게 파고들어 단일문자로 들어가게 될 경우,언리얼 엔진..

언리얼 C++ - 간단한 언리얼 오브젝트 클래스 생성

언리얼 에디터에서 가장 기본적인 클래스인 Object로부터 상속받은 클래스 MyObject를 하나 만들어 보았습니다.코드의 구성은 언리얼 엔진에서 자동적으로 수행해주므로 우리는 필요한 기능을 추가하기만 하면 됩니다. 구성 부분을 설명하자면 다음과 같습니다. -기본적인 언리얼 오브젝트 클래스의 구성(1) 헤더언리얼 오브젝트가 생성되기 위해 기본적으로 가지는 헤더를 일컫습니다. (2) 클래스명.generated.h 헤더언리얼 오브젝트 클래스가 존재하기 위해 반드시 필요한 헤더로 헤더 파일의 순서 상 제일 아래에 위치해야 합니다.UHT(Unreal Header Tool)에 의해 이 파일 안의 소스코드가 자동으로 생성됩니다.개발자는 단순히 지정된 매크로만 입력해주면 되고, 이 파일의 안에는 접근하지 않아도 됩니..

언리얼 C++에 대해 배워보자! - 언리얼 오브젝트

저번 포스트에서는 언리얼은 성능과 안정성이라는 두 마리 토끼를 모두 잡기 위해언리얼 엔진만의 독특한 구조를 지니고 있다고 말씀드렸습니다. 그리고 그 독특한 구조는 언리얼 오브젝트로 설명할 수 있습니다. 1) 언리얼 오브젝트란?언리얼 오브젝트는 언리얼 엔진이 설계한 새로운 시스템의 단위 오브젝트를 말합니다.특징은 다음과 같습니다.기존 C++ 오브젝트에 모던 객체 지향 설계를 위한 다양한 기능의 추가일반적인 C++ 오브젝트와 언리얼 오브젝트의 두 객체를 모두 사용가능일반 C++ 오브젝트와 구분하고자 독특한 접두사를 사용특이한 접두사의 사용은 언리얼 엔진을 다루면서 매우 많이 볼 수 있는데, 예시를 들자면 다음과 같습니다. 일반적인 C++ 오브젝트는 F를, 언리얼 오브젝트는 U를 사용하고그 외에도 템플릿에는 ..

언리얼 C++에 대해 배워보자! - 들어가기에 앞서

객체지향 언어는 프로그램을 다수의 객체로 만들고, 이 객체들이 서로 상호작용하도록 하는 언어입니다.그리고 이 방식은 현대에서 컴퓨터와 관련된 여러가지 분야에서 사용되고 있습니다. 그리고 우리가 익히 아는 게임 엔진들 역시 객체지향 언어를 기본으로 하여 작동합니다.예컨대, Unity Engine은 C#을 기본 베이스로 하고 Unreal Engine은 C++을 기본 베이스로 합니다. 위의 게임 엔진말고도 Godot Engine은 C#과 C++을 양쪽 다 지원하고 Renpy는 파이썬을 기본으로 합니다.그런데 보다보면 뭔가 이상함을 느끼게 됩니다. 각 게임 엔진 별로 왜 서로 다른 언어를 사용할까요?그 이유는 객체 지향 언어 안에서도 서로 구분이 이뤄지기 때문입니다. 1) 객체 지향 언어의 비교- Native ..