시작하며
이득우의 언리얼 프로그래밍 강의를 기반으로 스터디를 진행하기로 했다!
원래 졸작과 병행하고 싶었어서 예정보다 좀 뒤늦은 감은 있지만, 지금부터라도 열심히 해 보려고 한다!
강의를 보며 공부하면서 개인 노트를 남겨볼 예정이다.
강의 진행도
- 섹션 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 형태를 인자로 넣는 것을 피한다.
- 카테고리를 지정하는 경우 아예 열거형 지정을 해 주는 것이 좋다.
- 열거형 숫자가 조합의 수가 늘어난다면 비트 플래그를 사용하는 것을 권장한다.
- 함수 파라미터를 길게 사용하면 안 된다. (구조체를 선언해서 전달하는 것을 권장.)
- 인터페이스는 인터페이스에 맞게 사용한다.
- 오브라이딩 할 때는 키워드를 명시한다.
플랫폼별 코드
- 플랫폼에 특화된 기능의 구현을 위한 기능들이 마련되어 있다.
- 일반 기능에 영향을 미치지 않도록 설계해야 한다.
'스터디' 카테고리의 다른 글
이득우의 언리얼 프로그래밍 스터디 기록 - 3회차 : Unreal Object (0) | 2025.02.11 |
---|---|
이득우의 언리얼 프로그래밍 스터디 기록 - 2회차 : 언리얼 C++ 기본 타입과 문자열 (0) | 2025.02.10 |
[특강] 전투 기획 - 싸움의 기술 (0) | 2024.10.05 |
[청강대 2023 ARVR Festa] 공모전 출품작 - VR 슈팅게임 Project: P 플레이 영상 2차 개발 (0) | 2023.10.21 |
[특강] 교수님 우리 프로젝트 망했어요 (1) | 2023.09.11 |