본문 바로가기
스터디

이득우의 언리얼 프로그래밍 스터디 기록 - 1회차 : 개발 환경 세팅, 언리얼 C++ 코딩 표준의 이해

by se.jeon 2025. 2. 5.
728x90
반응형

시작하며

이득우의 언리얼 프로그래밍 강의를 기반으로 스터디를 진행하기로 했다!

원래 졸작과 병행하고 싶었어서 예정보다 좀 뒤늦은 감은 있지만, 지금부터라도 열심히 해 보려고 한다!

강의를 보며 공부하면서 개인 노트를 남겨볼 예정이다.

강의 진행도

- 섹션 1. 강의 소개 : 언리얼 프로그래밍을 효과적으로 공부하는 방법

- 섹션 2. 언리얼 오브젝트의 이해 : 1강 헬로 언리얼!

강의 노트

편의를 위한 개발 환경 세팅

- 언리얼 엔진 버전 5.1.1

ㄴ 부가 메뉴 - 설치 옵션 - 디버깅을 위한 편집기 기호 (디버깅 심볼) 설치

- Visual Studio Community (Rider 검토 또한 나이스)

ㄴ C++를 사용한 게임 개발 툴 설치

ㄴ Prjoects and Solutions - Genereal - Always Show Error List if build finishes with errors 비활성화

ㄴ Customize - Solution Configurations : 60 > 200

ㄴ Visual Commander 확장 도구 설치
* 모든 툴을 영문으로 사용 (국내 한국어로 된 자료가 많이 없음. 영어 사용 권장)

Hello Unreal 띄우기

- 프로그램의 뼈대를 엔진이 제공함. 설계한 콘텐츠를 집어 넣는 형태로 코딩 진행.

 

- New C++ 클래스 생성하고, Game Instance라는 클래스를 상속받아 문자열을 출력하도록 제작

 

- 기본 게임 인스턴스가 아닌, 직접 제작한 인스턴스를 사용하도록 설정.

 

- 가상함수를 오버라이드해서 재구현하는 경우에는 언리얼 엔진이 미리 작업해둔 코드를 실행해야 한다.

ㄴ 엔진 플로우가 동작할 수 있게 에픽 게임즈 엔지니어들이 만들어 놓은 것이기 때문. 무시하고 초기화를 하면 어떤 상황에 어떤 문제가 발생할지 모른다. 언리얼 엔진 뉴비가 가장 많이 하는 실수.

ㄴ 클래스 이름을 다 칠 필요 없이 super라고 쳐 주면 부모 클래스를 가리키게 된다.

 

- UE_LOG라는 세 개의 인자와 가변 인자를 사용하는 매크로 함수를 통해 로그를 남긴다.

 

- 언리얼 엔진에서는 스트링을 다룰 때 일반 따옴표로 스트링을 다루는 것이 아니고, 텍스트라는 매크로를 지정해서 스트링을 다룬다.

ㄴ 아시아 국가들의 유니코드 문자열을 다루기 위해 텍스트라는 매크로로 묶어서 만들어 주는 것이 편하다.

 

- 프로젝트 세팅 - 게임 인스턴스 설정.

ㄴ 게임 인스턴스는 컨텐츠를 담는 어플리케이션의 뼈대와 같은 것이다. 단일 인스턴스로 관리된다.

 

- Windows > Output Log을 활성화하고, 게임을 플레이하여 로그를 확인

ㄴ 로그가 너무 많아 보기 어려울 때 : Log 카테고리 설정

언리얼 코드 컴파일

언리얼 에디터가 켜져 있는 경우에는 무조건 라이브 코딩으로만 진행을 해줘야 한다.

- 헤더 파일에 변경이 발생하면 : 에디터를 끄고 비주얼 스튜디오에서 컴파일한다.

- 소스 파일에만 변경이 발생하면 : 라이브 코딩으로 컴파일한다. (단축키 : Ctrl + Alt + F11)

* 비주얼 스튜디오에서 수동으로 클래스를 추가하지 말 것.

언리얼 C++ 코딩 표준

홈페이지에서 코딩 표준(코딩 스타일/ 컨벤션)*을 확인할 수 있다.

*코딩 표준 : 프로그래밍을 작성하는 데 있어서 지켜야하는 프로그래밍 이름 규칙이나 작성 방법 등을 지정한 가이드라인

좋고 나쁜 것이 없으며, 반드시 지켜야하는 규칙과 같은 것. 한 사람이 만드는 것 처럼 정돈되어야 비용이 감소된다.

- 에픽게임즈가 작성한 소스코드에는 저작권 고지가 있기 때문에 임의대로 수정하지 말아야 한다.

- 문제의 소지가 없는 단어를 지양하고, 포용적 언어를 지향한다.

 

클래스 체계

- public 우선 선언

 

명명규칙

- 언리얼은 파스칼 케이싱 방법을 사용하고 있다.

ㄴ모든 각 단어의 첫 번째 글자는 대문자여야 하며, 언어바를 사용하지 않는다.

 

접두사

-  템플릿 클래스에는 접두사 t를 포함하고, 언리얼 오브젝트를 상속받는 클래스는 접두사 u를 포함한다. (모든클래스는 Unreal Object를 상속받아서 작성하도록 되어있다.)

- 언리얼 오브젝트로부터 상속을 받았지만, 액터 클래스의 이름은 A, UI 전용 클래스인 Slate는 S, 인터페이스에는 I를 포함한다.

- bool 변수는 소문자 b를 사용한다.

- 클래스나 구조체는 F를 사용한다.

 

함수

- bool형 참과 거짓을 반환하는 모든 함수는 질의형으로 이름을 정해야 한다.

- 단순 명사형으로 되어 모호한 것은 좋은 스타일이 아니다.

- in, out을 사용하여 사용되는 시점을 써주는 것이 좋다.

 

변수

- Int 대신 Int8, INT16등 형태가 가지고 있는 정확한 용량 크기를 지정 해 준다.

- 캐릭터 문자는 TCHAR를 사용한다.

- 최소 크기는 32 비트로 보장을 해 주어야 한다.

C++ 언어나 게임 엔진을 사용하는 것들이 메모리를 최적으로 관리하여 최적의 효과를 내는 것에 집중이 되어 있다.

 

표준 라이브러리

- 자체적으로 멀티 플랫폼에서 안정적으로 동작하는 언리얼 엔진용 표준 라이브러리를 에픽게임즈가 구축했다.

- C++ 표준 라이브러리는 사용하지 않는 것이 기본 원칙이다. 표준 라이브러리를 끌어들이면 컴파일 시간이나 복잡도가 증가하게 된다.

- 헤더나 키워드들을 혼합하지 않도록 주의해야 한다.

 

코멘트

C++ 언어를 떠나서 코멘트를 잘 작성하는 것이 중요하기 때문에 한 번씩 읽어보는 것이 좋다.

 

Const 정확도

읽기 전용인지, 읽기 쓰기가 가능할 것인지를 지시한다.

- 엘리먼트와 같은 것에 대해서 const를 사용할 수 있으면 사용하는 것을 권장한다.

ㄴ 예를 들어 루프를 돌 때, 값이 변경되면 전체 루프의 데이터가 깨지게 되면서 예기치 못한 문제가 많이 발생할 수 있다.

ㄴ 주석을 달아주는 것이 좋다.

- 레퍼런스의 경우 이미 const라는 의미를 가지고 있기 때문에 사용하면 안 된다.

- const를 사용하면 증감 연산자는 사용할 수 없다.

- 복사가 일어나는 배열 반환은 좋지 않다.

- const의 위치에 따라 동작 자체가 달라지므로 동작에 대해 이해하는 것이 중요하다.

 

포맷 주석

- 규칙에 맞춰서 작성을 해 주면 JavaDoc이라는 프로그램을 사용해서 자동으로 문서가 만들어진다.

 

최신 C++ 문법

- C++17정도까지는 사용할 수 있다.

- C++11규약에서 추가된 override final과 같은 것들을 상속에서 사용하는 것이 코딩 에러를 방지하기에 용이하기 떄문에 강력히 권장한다.

- C++에 맞춰 nullptr 타입을 사용하여 체크 해 주어야 하고, C 스타일의 null을 사용하지 않아야 한다.

- auto 키워드는 편리하지만 문제의 근원 소지가 있어 웬만하면 사용하지 않는다. (lambda/ iterator 등으로 너무 장황해서 가독성에 악영향을 미칠 때에는 사용을 해도 괜찮다.)

 

lambda 함수

- 안정적으로 어떻게 사용하는지 명확히 인지한 상태에서 명시적으로 사용해야된다.

 

열거형

- namespace 대신 enum class 형태로 사용하는 것을 권장한다.

 

이동 시맨틱

- 자료구조를 사용할 때 더 최적화된 형태로 메모리에 복사 없이 바로 옮길 수 있는 문법을 지원한다.

ㄴ move 대신 MoveTemp 라는 함수를 사용할 것. 언리얼 엔진이 제공중인 유사한 함수를 사용하여 구현하면 된다.

 

디폴트 멤버 초기화

- 생성자 헤더 대신 생성자 구문에서 초기화하는 것을 권장한다.

 

서드 파티 코드

- 서드 파티임을 명시할 것.

 

중괄호 및 들여쓰기

xdented(Allman) 중괄호 스타일을 사용함.

- 탭을 사용한다. (크기 : 네 글자, 비주얼 스튜디오가 알아서 진행을 해 준다.)

 

Switch문

- 각각의 경우마다 꼭 브레이크를 넣어준다.

 

파일 이름

- 클래스 이름과 달리 접두사를 제외한다.

 

물리적 종속성

- 중복된 헤더를 다시 복사하지 않게끔 #pragma once 를 반드시 지정한다.

- 헤더가 많아질수록 복사하는 양이 늘어나서 컴파일 시간이 오래 걸리게 되기 떄문에 헤더에 무언가를 선언할 때 꼼꼼하게 살펴봐야 한다.

 

캡슐화

- 웬만하면 private로 선언하고, getter/ setter 함수를 통해서 접근할 수 있게 선언하는 것이 좋다.

- 더 이상 파생시킬 클래스가 아닌 경우 final을 사용환다.

 

일반적인 스타일 문제

- String 문자열을 표현할 땐 텍스트 매크로를 사용한다.

- 복잡한 표현식은 중간 변수를 사용하여 간소화한다.

- 포인터와 레퍼런스의 스페이스는 오른쪽에 딱 한칸만 두어야 한다.

ㄴ find in fies을 사용하여 솔루션 내의 파일을 검색할 때 언리얼 엔진 소스 코드를 포함해서 검색할 수 있다. 타입을 기준으로 검색하는 경우가 많은데, 원하는 타입을 검색하기 용이하기 위함.

- 길어도 좋으니 항상 명확하게 코드를 작성할 것.

- 헤더에 static 변수를 선언하게 되는 경우에는 이 헤더를 참조하는 모든 인스턴스들이 컴파일 되기 때문에 cpp로 옮겨주어야 한다.


API 디자인 가이드

- bool 형태를 인자로 넣는 것을 피한다.

- 카테고리를 지정하는 경우 아예 열거형 지정을 해 주는 것이 좋다.

- 열거형 숫자가 조합의 수가 늘어난다면 비트 플래그를 사용하는 것을 권장한다.

- 함수 파라미터를 길게 사용하면 안 된다. (구조체를 선언해서 전달하는 것을 권장.)

- 인터페이스는 인터페이스에 맞게 사용한다.

- 오브라이딩 할 때는 키워드를 명시한다.

 

플랫폼별 코드

- 플랫폼에 특화된 기능의 구현을 위한 기능들이 마련되어 있다.

- 일반 기능에 영향을 미치지 않도록 설계해야 한다.

 

 
728x90
반응형