본문 바로가기
자기개발/Unreal Engine

Coding Standard

언리얼 코딩 기본규칙


  • (유형 이름이나 변수 이름 등) 이름 내 각 단어의 첫 글자는 대문자로 써야 하며, 단어 사이에 보통은 공백을 띄우지 않습니다. Health  UPrimitiveComponent 정도를 예로 들 수는 있지만, lastMouseCoordinates  delta_coordinates 같은 것은 아닙니다.
  • 변수 이름과 구분하기 위해 유형 이름을 대문자 한 글자로 나타내는 접두사를 붙입니다. 예를 들어 FSkin 이 유형 이름이고, Skin  FSkin 의 인스턴스 입니다.
    • 템플릿 클래스 접두사는 T 입니다.
    • UObject 에서 상속하는 클래스 접두사는 U 입니다.
    • AActor 에서 상속하는 클래스 접두사는 A 입니다.
    • SWidget 에서 상속하는 클래스 접두사는 S 입니다.
    • 추상 인터페이스인 클래스 접두사는 I 입니다.
    • Enum (열거형)의 접두사는 E 입니다.
    • Boolean (부울) 변수의 접두사는 b 입니다 (예: bPendingDestruction 또는 bHasFadedIn).
    • 그 외 대부분 클래스의 접두사는 F 이나, 일부 서브시스템은 다른 글자를 사용하기도 합니다.
    • Typedef 접두사는 적합한 유형을 붙여야 합니다: 구조체의 typedef 인 경우 F, UObject 등의 typedef 인 경우 U 입니다.
      • 특정 템플릿 인스턴스의 typedef 는 더이상 템플릿이 아니라 그에 맞는 접두사를 붙여야 합니다, 예:typedef TArray<FMytype> FArrayOfMyTypes;
    • C# 에서는 접두사가 생략됩니다.
    • UnrealHeaderTool (언리얼 헤더 툴)은 대부분의 경우 올바른 접두사가 필수이므로, 제대로 붙여주는 것이 중요합니다.
  • 유형과 변수명은 명사입니다.
  • 메서드 이름은 동사로 그 메서드가 하는 일이나, 하는 일이 딱히 없는 경우 반환값을 설명합니다.

변수, 메서드, 클래스 이름은 명확하고 애매하지 않으며 서술적이여야 합니다. 이름의 범위가 클 수록, 서술적인 좋은 이름의 중요성 역시 커집니다. 과도한 축약은 피하시기 바랍니다.

모든 변수는 변수에 대한 설명을 코멘트로 붙일 수 있도록 한 번에 하나씩만 선언해야 합니다. 이난 JavaDocs 스타일에서도 요구하는 바입니다. 변수 앞에 여러 줄짜리든 한 줄짜리든 코멘트를 남기면 되며, 변수 그룹 목적으로 빈 줄을 띄워도 됩니다.

부울 값을 반환하는 모든 함수, 예로 IsVisible() 또는 ShouldClearBuffer() 는 true/false 질문을 합니다.

프로시져(반환값이 없는 함수)는 강한 동사 뒤에 오브젝트를 붙여 써야 합니다. 예외는 메서드의 오브젝트가 그 안에 있는 오브젝트일 때인데, 그런 경우 오브젝트는 컨텍스트에서 이해를 합니다. "Handle" 이나 "Process" 같은 것으로 시작하는 이름은 애매하니 피해 주시기 바랍니다.

필수는 아니지만, 함수 파라미터 중 레퍼런스로 전달된 이후 함수가 그 값에 출력할 것으로 기대되는 것의 경우 이름 앞에 "Out" 접두사를 붙일 것을 추천합니다. 그래야 이 인수로 전달되는 값은 함수가 대체시킬 것임이 명확해 집니다.

In 또는 Out 파라미터 역시 부울인 경우, In/Out 접두사 앞에 b 를 붙입니다, 예: bOutResult.

작명규칙 잘정하기


기본 C++ 유형에 이식가능 에일리어스

  • bool - boolean (bool 크기 추정 금지). BOOL 은 컴파일되지 않습니다.
  • TCHAR - character (TCHAR 크기 추정 금지)
  • uint8 - unsigned byte (1 바이트)
  • int8 - signed byte (1 바이트)
  • uint16 - unsigned "short" (2 바이트)
  • int16 - signed "short" (2 바이트)
  • uint32 - unsigned int (4 바이트)
  • int32 - signed int (4 바이트)
  • uint64 - unsigned "quad word" (8 바이트)
  • int64 - signed "quad word" (8 바이트)
  • float - single precision floating point (4 바이트)
  • double - double precision floating point (8 바이트)
  • PTRINT - 포인터를 가질 수 있는 integer (PTRINT 크기 추정 금지)

C++ 의 int 와 unsigned int 유형은 플랫폼에 따라 크기가 변할 수 있기에 정수 범위가 중요치 않은 경우라면 코드에서 사용해도 괜찮습니다. 명시적으로 크기가 정해진 유형은 여전히 시리얼라이즈 또는 리플리케이트된 포맷으로 사용해야 합니다.

다양한 콘솔, PC규격에 맞는 게임을 제작하기 위해서는 int, unsigned int는 정수범위를 명시적으로 설정해줘야함


주석규칙


'auto' 키워드

아래 몇 가지 예외를 제외하고 C++ 에서 auto 를 사용해서는 안됩니다. 항상 초기화시키려는 유형은 명시해 줘야 합니다. 그 유형이 독자에게 명확히 보여야 한다는 뜻입니다. 이 규칙은 C# 의 var 키워드 사용에도 적용됩니다.

auto 를 사용해도 괜찮은 경우는?

  • 변수에 람다를 바인딩해야 하는 경우, 람다 유형은 코드에 표현 가능하지 않습니다.
  • 이터레이터 변수의 경우, 유형이 매우 장황하여 가독성에 악영향을 끼칠 수 있습니다.
  • 템플릿 코드에서, 표현식의 유형을 쉽게 식별할 수 없는 경우입니다. 이는 고급에 해당하는 경우입니다.

코드를 읽는 사람이 유형을 명확하게 알 수 있어야 한다는 것은 매우 중요합니다. 일부 IDE 에서 유형을 추론할 수는 있지만, 이는 코드가 안정적인 상태라는 가정하에서입니다. GitHub 같은 곳에서 개별 소스 파일을 독립적으로 확인하거나, merge/diff 툴을 사용하는 사람에게도 도움이 되지 않습니다.

auto 를 사용해도 괜찮다고 확실히 알고 있는 경우, 항상 해당 유형에 const, &, * 를 정확히 사용해야 한다는 점 기억해 주시기 바랍니다. 그렇게 해야 `auto` 를 통해 추론 유형을 원하는 유형으로 이끌어낼 수 있을 것입니다.

auto 지양하기


새 스타일 for 사용


if 랑 if else 모두 대괄호 꼭 넣어주기 (생략가능하지만) 언리얼 관행이라함;


네임스페이스(Namespace)는 아래 규칙만 준수한다면 클래스, 함수, 변수의 체계를 잡는 데 유용할 수 있습니다.

  • 언리얼 코드는 현재 글로벌 네임스페이스에 둘러싸여 있지 않습니다. 특히나 서드 파티 코드를 사용하거나 포함할 때는 전역 범위에서 충돌이 일어나지 않도록 주의를 기울여야 합니다.
  • Using 선언은:
    • 전역 범위에는 using 선언을, .cpp 파일에서도 넣지 마시기 바랍니다 ("unity" 빌드 시스템에 문제가 생깁니다).
    • 다른 네임스페이스 안이나 함수 본문 안에서는 using 선언을 넣어도 괜찮습니다.
    • 네임스페이스 안에 using 선언을 넣는 경우, 해당 네임스페이스 동일 변환 단위 내 다른 곳으로 이어지게 됩니다. 일관성만 있으면 괜찮을 것입니다.
    • 오직 위 규칙을 따를 때만 헤더 파일에서 using 선언을 사용해도 안전합니다.
  • 참고로 앞서 선언된 형은 각각의 네임스페이스 안에서 선언해 줘야 합니다. 그렇게 하지 않으면 링크 오류가 납니다.
  • 한 네임스페이스 안에 다수의 클래스/유형을 선언하면, 다른 전역 범위의 클래스에서 사용하기가 어려울 수 있습니다 (예를 들면, 함수 시그너처는 클래스 선언에 나타날 때 명시적 네임스페이스를 사용해야 합니다).
  • using 선언을 사용해서 네임스페이스 안의 특정 변수만 자신의 범위로 에일리어싱할 수도 있습니다 (예: using Foo:FBar). 그러나 언리얼 코드에서는 보통 그렇게 하지 않습니다.
  • 언리얼 헤더 툴에는 네임스페이스가 지원되지 않으므로, UCLASS, USTRUCT 등을 정의할 때는 사용할 수 없습니다.

언리얼 네임스페이스 사용은 웬만하면 지양해라


pragma once 꼭 사용


 

'자기개발 > Unreal Engine' 카테고리의 다른 글

언리얼에서 모듈이란  (0) 2021.07.18
언리얼에서의 함수  (0) 2021.07.18
Sky Atmosphere & Fog tip  (0) 2021.06.21
Unreal Network 정리  (0) 2021.06.21
언리얼 객체 유형  (0) 2021.06.11