목록Unreal Engine 5 (18)
3냥 집사이면서 게임 개발자입니다.

언리얼 게임 프레임워크를 활용한 게임 제작 방식의 이해와 프로젝트와 기본 C++ 클래스 생성 방법, 향후 운영될 C++ 프로젝트 운영 규칙의 이해에 대해 정리하겠습니다. 언리얼 게임 프레임워크 게임 콘텐츠의 구조 - 게임 제작을 위해 언리얼 엔진은 자체적으로 설계한 프레임워크를 제공합니다. - 이를 게임플레이 프레임워크(Gameplay Framework)이라고 부릅니다. - 언리얼 게임 프레임워크의 각 구성 요소를 파악하고, 이를 확장하면서 게임을 제작하는 것을 권장합니다. 월드 (게임 : 월드, 모드, 상태) - 게임 콘텐츠를 담기 위해 제공되는 가상의 공간 - 월드는 시간, 트랜스폼, 틱을 서비스로 제공합니다. - 월드 세팅이라는 콘텐츠 제작을 위한 기본 환경 설정을 제공합니다. - 월드의 기본 단위..

언리얼 엔진의 프로젝트 구성과 에디터 동작 방식의 이해, 언리얼 엔진의 모듈 시스템을 기반으로 소스코드를 구성하고 엔진 소스코드를 탐색하는 법, 언리얼 플러그인 시스템을 활용해 효과적으로 모듈을 구성하는 방법을 정리하고자 합니다. 언리얼 에디터 프로젝트 구성 언리얼 에디터 구성 - 게임 제작을 위해 에픽 게임즈가 제공하는 저작 도구입니다. - 언리얼 엔진의 구성 - 에디터 : 게임 제작을 위해 제공되는 응용 프로그램 (일반적으로 인식하는 언리얼 엔진) - 게임 빌드 : EXE 파일과 리소스로 이루어진 독립적으로 동작하는 게임 클라이언트 - 언리얼 에디터의 특징 - 게임 개발 작업을 위해 다양한 폴더와 파일 이름 규칙이 미리 설정되어 있습니다. - 정해진 규칙을 잘 파악하고 프로젝트 폴더와 파일을 설정해야..

언리얼 엔진의 에셋과 이를 포장한 패키지의 개념의 이해, 언리얼 에디터에서 볼 수 있도록 에셋을 저장하고 불러들이는 방법의 이해와 오브젝트 패스를 사용해 다양한 방식으로 에셋을 로딩하는 방법에 대한 이해를 정리하고자 합니다. 언리얼 오브젝트 패키지 - 단일 언리얼 오브젝트가 가진 정보는 저장할 수 있지만, 오브젝트들이 조합되어 있다면? - 저장된 언리얼 오브젝트 데이터를 효과적으로 찾고 관리하는 방법은? - 복잡한 계층 구조를 가진 언리얼 오브젝트를 효과적으로 저장과 불러들이는 방법을 통일해야 합니다. - 언리얼 엔진은 이를 위해 패키지(UPackage) 단위로 언리얼 오브젝트를 관리합니다. - 패키지의 중의적 개념 - 언리얼 엔진은 다양한 곳에서 단어 패키지를 사용하고 있습니다. - 언리얼 오브젝트를 ..

언리얼 엔진이 제공하는 직렬화 기능을 이해하고 언리얼 오브젝트를 직렬화하고 이를 저장하고 불러들이는 방법에 대해 정리하고자 합니다. 직렬화(Serialization)란? - 오브젝트나 연결된 오브젝트의 묶음(오브젝트 그래프)을 바이트 스트림으로 변환하는 과정입니다. - 복잡한 데이터를 일렬로 세우기 때문에 직렬화라고 합니다. - 거꾸로 복구시키는 과정도 포함해서 의미합니다. - 시리얼라이제이션(Serialization) : 오브젝트 그래프에서 바이트 스트림으로 - 디시리얼라이제이션(Deserialization) : 바이트 스트림에서 오브젝트 그래프로 - 직렬화가 가지는 장점 - 현재 프로그램의 상태를 저장하고 필요한 때 복원할 수 있다. ( 게임의 저장 ) - 현재 객체의 정보를 클립보드에 복사해서 다른..

언리얼 엔진의 메모리 관리 시스템에 대한 이해와 안정적으로 언리얼 오브젝트 포인터를 관리하는 방법에 대해 정리하고자 합니다. C++ 언어 메모리 관리의 문제점 - C++은 저수준으로 메모리 주소에 직접 접근하는 포인터를 사용해 오브젝트를 관리합니다. - 그러다보니 프로그래머가 직접 할당(new)과 해지(delete) 짝 맞추기를 해야 합니다. - 이를 잘 지키지 못하는 경우 다양한 문제가 발생할 수 있습니다. - 잘못된 사용 예시 - 메모리 누수 (Leak) : new 를 했는데 delete 짝을 맞추지 못함. 힙에 메모리가 그대로 남아있음. - 허상 (Dangling) 포인터 : (다른 곳에서) 이미 해제해 무효화된 오브젝트의 주소를 가리키는 포인터 - 와일드 (Wild) 포인터 : 값이 초기화되지 않..

언리얼 구조체의 선언과 특징 이해, 언리얼 대표 컨테이너 라이브러리인 TMap의 내부 구조 이해, 세 컨테이너 라이브러리의 장단점을 파악하고, 알맞게 활용하는 방법을 정리하고자 합니다. 언리얼 구조체 UStruct - 데이터 저장/전송에 특화된 가벼운 객체입니다. - 대부분 GENERATED_BODY 매크로를 선언해줍니다. - 리플렉션, 직렬화와 같은 유용한 기능을 지원합니다. - GENERATED_BODY를 선언한 구조체는 UScriptStruct 클래스로 구현됩니다. - 이 경우 제한적으로 리플렉션을 지원합니다. - 구조체 멤버변수에 UPROPERTY만 선언할 수 있고 함수 UFUNCTION은 선언할 수 없습니다. 구조체에서 함수를 선언할 수 없다는 점이 언리얼 오브젝트와의 가장 큰 차이점입니다. -..

언리얼에서 제공하는 대표 컨테이너 라이브러러 TArray, TSet의 내부 구조에 대한 내용과 각 컨테이너 라이브러리의 장단점을 파악하고, 알맞게 활용하는 법에 대해 정리하겠습니다. 언리얼 컨테이너 라이브러리 - 언리얼 엔진이 자체 제작해 제공하는 자료구조 라이브러리입니다. - 줄여서 UCL(Unreal Container Library) 라고도 합니다. - 언리얼 오브젝트를 안정적으로 지원하며 다수 오브젝트 처리에 유용하게 사용됩니다. - 언리얼 C++은 다양한 자료구조 라이브러리를 직접 만들어 제공하고 있습니다. - 실제 게임 제작에 유용하게 사용되는 라이브러리는 TArray, TMap, TSet 입니다. (T = Template) C++ STL 과 언리얼 컨테이너 라이브러리의 차이점 - C++ STL..

언리얼 엔진 5의 델리게이트 시스템은 클래스간 의존성을 최소화하기 위해 사용합니다. 클래스간 의존성을 최소화하기 위해 언리얼 엔진이 제공하는 델리게이트 시스템을 정리하고자 합니다. 느슨한 결합의 장점과 이를 편리하게 구현하도록 도와주는 델리게이트의 이해와 발행 구독 디자인 패턴의 이해, 언리얼 델리게이트를 활용한 느슨한 결합의 설계와 구현을 정리해보겠습니다. 강한 결합과 느슨한 결합 - 강한 결합(Tight Coupling) - 클래스들이 서로 의존성을 가지는 경우를 의미합니다. - 이전 포스팅을 예시로 들면 Card가 없는 경우 Person이 만들어질 수 없습니다. - 이 때 Person은 Card에 대한 의존성을 가진다고 합니다. - 핸드폰에서도 인증할 수 있는 새로운 카드가 도입된다면? - 느슨한 ..

언리얼 C++ 만의 컴포지션 기법을 사용해 오브젝트의 포함 관계를 설계하는 방법과 언리얼 C++ 이 제공하는 확장 열거형 타입의 선언과 활용 방법을 정리하고자 합니다. 컴포지션(Composition) - 객체 지향 설계에서 상속이 가진 Is-A 관계만 의존해서는 설계와 유지보수가 어렵습니다. - 컴포지션은 객체 지향 설계에서 Has-A 관계를 구현하는 설계 방법입니다. - 컴포지션의 활용 - 복합적인 기능을 가진 거대한 클래스를 효과적으로 설계하는데 유용하게 사용할 수 있습니다. [ 예시 코드 ] Class Card { public: Card(int InId) : Id(InId) {} }; class Person { public: Person(Card InCard) : InCard(InCard) {} p..
Native C++ 의 경우 다중 상속은 지양하고 Is a 보다는 Has a 를 지향하는 편인데 언리얼 C++ 의 인터페이스 클래스는 다중 상속을 권장하는 것 같아서 혼란스러웠습니다. 관련 내용을 더 공부하고 정리해보겠습니다. 인터페이스는 C++ 후발 언어인 Java나 C# 등에서 정식으로 지원하는 기능입니다. 후발 주자들은 모던 객체 지향 원칙을 준수하기 위해, 단일 상속 (Extends)에 추가로 인터페이스를 구현(Implements)하는 형태를 가집니다. 하지만 오래 전에 개발된 C++ 의 경우에는 인터페이스를 구현한다는 개념은 없고 오로지 상속만 있습니다. 따라서 인터페이스를 추상 클래스로 정의하고 다중 상속을 사용해 유사하게 구현하는 방식이 최선입니다. 이 부분에서 혼동이 있었습니다. C++ 의..

언리얼 C++ 인터페이스 클래스를 사용해 보다 안정적으로 클래스를 설계하는 기법에 대해 정리하겠습니다. 언리얼 C++ 인터페이스 - 인터페이스란? - 객체가 반드시 구현해야 할 행동을 지정하는데 활용되는 타입입니다. - 다영성(Polymorphism)의 구현, 의존성이 분리(Decouple)된 설계에 유용하게 활용됩니다. - 언리얼 엔진에서 게임 콘텐츠를 구성하는 오브젝트의 설계 예시 - 월드에 배치되는 모든 오브젝트, 안 움직이는 오브젝트를 포함합니다 (Actor) - 움직이는 오브젝트 (Pawn) - 길찾기 시스템을 반드시 사용하면서 움직이는 오브젝트 (INavAgentInterface 인터페이스를 구현한 Pawn) 인터페이스를 사용해 이전에 작업한 예제를 위한 클래스 생성 3를 작업해보겠습니다. -..

언리얼 오브젝트 리플렉션 시스템을 활용해서 어떤 작업을 할 수 있는지 실습 예제를 통해 확인해봤습니다. [ 예제를 위한 클래스 생성 1 ] - 어떤 학교에서 학생과 교수가 함께 수업하는 상황의 구현 - 학교 정보는 GameInstance에서 지정 - 인물 클래스 ( Person ) - 학생 클래스 ( Student ) - 선생 클래스 ( Teacher ) 에 이어서 예제를 이어가겠습니다. [ 예제를 위한 클래스 생성 2 ] - 클래스에 설정할 프로퍼티 정보 - Person에는 DoLesson이라는 가상 함수가 있습니다. - Student의 DoLesson은 수업을 듣는 행동입니다. - Teacher의 DoLesson은 수업을 가르치는 행동입니다. Person : Name(이름), Year(학번) Stud..

언리얼 오브젝트의 특징과 리플렉션 시스템에 대한 정리와 언리얼 오브젝트의 처리 방식에 대해 이해한 것을 정리하겠습니다. 언리얼 오브젝트의 구성 - 언리얼 오브젝트에는 특별한 프로퍼티와 함수를 지정할 수 있습니다. - 관리되는 클래스 멤버 변수 - 관리되는 클래스 멤버 함수 - 에디터와 연동되는 메타데이터를 심을 수 있습니다. - 모든 얼리얼 오브젝트는 클래스 정보와 함께 합니다. - 클래스를 사용해 자신이 가진 프로퍼티와 함수 정보를 컴파일 타임과 런타임에서 조회할 수 있습니다. - 이렇게 다양한 기능을 제공하는 언리얼 오브젝트는 NewObject API를 사용해 생성해야 합니다.(엔진에서 제공하는 동적할당, 자동 메모리 관리) 언리얼 오브젝트의 클래스 기본 오브젝트 - 언리얼 클래스 정보에는 클래스 기..
언리얼 엔진의 근간을 이루는 언리얼 오브젝트 체계와 이를 생성하는 방법에 대해서 이야기하고자 합니다. 게임 프로그래밍이 가지는 특수성과 언리얼 오브젝트의 필요성에 대해 이해하고자 했으며, 언리얼 오브젝트의 선언과 엔진 내부 컴파일 과정에 대해 이해한 내용을 다룹니다. 게임 프로그래밍의 특수성 - 사용자 : 쾌적한 경험을 위해 단일 컴퓨터에서 최대 성능을 뽑아 내야 한다. - 개발자 : 게임의 규모가 커질수록 방대하고 복잡한 기능을 안정적으로 관리해야 한다. Native 접근 C++ 언어 (안정성보다 성능 중시) - 메모리 직접 제어 - Cache의 활용 극대화 - 저수준 API의 직접 호출 - 복사 작업의 최소화 하이레벨 OOP 언어 (성능보다 안정성 중시) - 유지보수성 향상 - 크래시로부터 보호 - ..

언리얼 환경에서 TCHAR, FString을 사용해 로그를 띄워봤습니다. HELLO UNREAL! 이라는 문자열은 기본적으로 TCHAR 형이라는 배열입니다. 배열로 변수를 생성한 뒤 문자열을 출력할 수 있습니다. TCHAR 배열이 아닌 언리얼에서 제공하는 FString 자료형도 같이 사용해 문자열을 출력했습니다. UE_LOG 매크로 세 번째 구문에는 항상 배열만 들어가기 때문에 FString을 사용할 수 없고, %s 에 대응될 때 TCHAR의 Pointer Array를 반환해줘야 하기 때문에 TCHAR* 을 반환하기 위해 FString 변수에 포인터 연산자를 전방에 붙임으로써 문자열 데이터를 가져올 수 있습니다. 복잡한 문자열 처리를 하나로. - 유니코드를 사용해 문자열 처리를 통일합니다. - 이 중에서..
언리얼 환경에서 알아두어야 할 기본 타입과 고려할 점에 대한 정리와 캐릭터 인코딩 시스템에 대한 이해, 언리얼 C++ 이 제공하는 다양한 문자열 처리 방법과 내부 구성의 이해에 대해서 정리하겠습니다. 왜 언리얼은 기본 타입을 따로 지정하는가? - 1970년대에 개발되서 아직도 사용 중인 C++ 언어 - 시대에 따라서 발전한 하드웨어 사양 - 플랫폼 파편화(Platform Fragmentation) - C++ 최신 규약에서 int 는 최소 32비트를 보장하도록 규정되어 있음 - 특정 플랫폼에서는 64bit로 해석될 수 있음 - 따라서 데이터를 저장할 때 int 타입의 크기를 확신할 수 없음 - 게임 제작의 특징 - 데이터 정보가 명확해야 한다. - 단일 컴퓨터에서 최대 퍼포먼스를 뽑아내야 한다. - 네트웍..
코딩 표준이란, 프로그래밍을 작성하는데 지켜야 하는 프로그래밍 이름 규칙, 작성 방법 등을 지정한 가이드라인입니다. - 코딩 스타일, 코딩 컨벤션(Coding Style, Coding Convention) 이라고도 합니다. 좋은 코딩 표준이란? - 절대적으로 좋은 코딩 표준이란 없습니다. - 이전에 내가 사용한 코딩 표준이 항상 옳은 것은 아닙니다. - 중요한 것은 코딩 표준을 정하고 잘 따르는 것입니다. - 이미 프로젝트에 코딩 표준이 있다면 그대로 따라야 합니다. - 프로젝트의 모든 코드는 한 사람이 만든 것처럼 보여져야 합니다. - 좋은 소프트웨어 회사들은 자신만의 코딩 표준이 있습니다. * 언리얼 엔진은 자체적으로 코딩 표준을 정했기 때문에, 기존 C++ 코딩 방법을 버리고 언리얼 엔진 코딩 표준..
1. Native C++ 언어의 경우, 안정성보다 성능을 중시합니다. 특징으로는 메모리를 직접 제어하고, Cache의 활용 극대화, 저수준 API의 직접 호출, 복사 작업의 최소화 등 이점이 있습니다. 2. 하이레벨 OOP 언어 (객체지향 자바, C#)의 경우, 성능보다 안정성을 중시합니다. 특징으로는 유지보수성 향상이 있고, 크래시로부터 보호하며, 자동 메모리 관리, 고질적 실수 예방하는 등 이 있습니다. 결론 : 언리얼 C++은 저수준을 제어할 수 있으며, 후발 객체지향 언어가 갖고있는 장점을 갖췄습니다. 성능과 안정성을 모두 지원하고 있으며, 기초 프로그래밍 언어가 탄탄해야 숙련할 수 있습니다.