언리얼 정리 4(코딩 스타일)

윤준혁·2025년 3월 13일

언리얼 엔진 C++ 코딩 스타일 가이드

  • 언리얼 엔진의 C++ 코딩 스타일은 Epic Games의 공식 가이드라인을 따르며, 일관된 명명 규칙과 코딩 스타일을 유지하는것이 중요하다

클래스 및 파일 명명 규칙

  • Actor : A(ex. APlayerCharacter, AEnemy)
  • UObject : U(ex. UInventoryComponent, UWeaponData)
  • Struct : F(ex. FCharacterStats, FItemInfo)
  • Interface : I(ex. IInteractable, IDamageable)
  • Enum : E(ex. EGameState, EWeaponType)
  • Delegate : F(ex. FOnHealthChanged, FOnItemPicked)
  • Game Mode : AGM(ex. AGM_Shooter, AGM_RPG)
  • Game State : AGS(ex. AGS_Main, AGS_Lobby)

클래스 파일(.h, .cpp)의 이름은 클래스명과 동일해야 한다
네이밍 컨벤션 : PascalCase 사용(단어의 첫 글자 대문자)

// PlayerCharacter.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PlayerCharacter.generated.h"

UCLASS()
class MYGAME_API APlayerCharacter : public ACharacter
{
    GENERATED_BODY()
};

변수 명명 규칙

  • Boolean : b(ex. bIsDead, bCanJump)
  • Integer : i(ex. iScore, iHealth)
  • Float : f(ex. fSpeed, fDamage)
  • String : Str(ex. StrPlayerName)
  • Name : Name(ex. NameCharacter)
  • FVector : V(ex. VLocation, VVelocity)
  • FRotator : Rot(ex. RotCharacter, RotCamera)
  • Transform : T(ex. TObjectTransform)
  • Array : Arr(ex. ArrEnemies, ArrInventoryItems)
  • Map : Map(ex. MapPlayerStats, MapItemData)
  • Set : Set(ex. SetCollectedItems, SetAbilities)
  • Static 변수 : s(ex. sDefaultSpeed, sGlobalCounter)
  • Global 변수 : G(ex. GEngine, GWorld)

멤버 변수는 PascalCase 사용
로컬 변수는 camelCase 사용

class APlayerCharacter : public ACharacter
{
private:
    int32 Health;          // 일반 멤버 변수
    bool bIsDead;          // Boolean 변수
    float fSpeed;          // Float 변수
    static int32 sCounter; // 정적 변수
    const float MaxSpeed = 600.0f; // 상수
};

함수 명명 규칙

  • PascalCase 사용
  • Bool 타입 함수는 Is, Can, Has로 시작
  • Getter/Setter는 Get, Set으로 시작
  • 함수의 실행 여부를 나타내는 경우 Do 또는 Try 사용
bool IsDead() const;
void SetHealth(int32 NewHealth);
bool CanJump() const;
void TryAttack();
void DoExplosion();

생성자 및 초기화 리스트

  • 멤버 변수 초기화는 초기화 리스트 사용
  • Super()를 가장 먼저 호출
APlayerCharacter::APlayerCharacter()
    : Health(100), bIsDead(false), fSpeed(600.0f)
{
    PrimaryActorTick.bCanEverTick = true;
}

스마트 포인터 사용

  • UObject 기반 객체 → TObjectPtr<>, TWeakObjectPtr<> 사용
  • 일반 객체 → TSharedPtr<>, TWeakPtr<> 사용
  • C++ new/delete 사용 금지
TObjectPtr<AWeapon> Weapon; // UObject 기반 스마트 포인터
TSharedPtr<FGameData> GameData; // 일반 스마트 포인터

조건문 및 반복문 스타일

  • 중괄호 {} 사용 필수
  • 한 줄이라도 {} 생략 금지
if (bIsDead)
{
    return;
}

for (int32 i = 0; i < 10; i++)
{
    DoSomething();
} // ✅
if (bIsDead) return; // ❌

UE_LOG 사용(디버깅)

  • UE_LOG는 LogTemp 또는 사용자 정의 카테고리 사용
  • TEXT() 매크로 사용 필수
UE_LOG(LogTemp, Warning, TEXT("Player Health: %d"), Health);

UPROPERTY 및 UFUNCTION 스타일

  • UPROPERTY()는 접근 제어자 아래에 배치
  • UFUNCTION()은 함수 선언 위에 배치
UCLASS()
class MYGAME_API APlayerCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable, Category="Health")
    void TakeDamage(int32 DamageAmount);

protected:
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Stats")
    int32 Health;
};

0개의 댓글