UE5 프로그래밍 입문 (2) - 변수 & UPROPERTY | 언리얼 5 [U5-P-1]

admin | | 조회 44


[주요 목차]

UE5 변수 기본 개념 잡기

UPROPERTY 매크로로 에디터 연동하기

변수 공개 범위와 초기화 실전 적용


언리얼 엔진 5(UE5)로 게임 개발을 시작하려는데, C++ 프로그래밍이 낯설어서 막막하시죠? 특히 변수 다루는 법이나 UPROPERTY 같은 언리얼 특유의 매크로를 어떻게 써야 할지 헷갈리기 쉽습니다. 이 영상 자막을 바탕으로 한 글을 읽으면 UE5 프로그래밍 입문에서 변수의 기본부터 UPROPERTY 활용까지 완벽히 이해할 수 있어요. 영상을 보지 않아도 독립적으로 따라할 수 있도록 배경 지식과 실전 팁을 더했으니, 초보자분들도 바로 프로젝트에 적용해보세요. UE5에서 변수는 캐릭터 체력이나 데미지 같은 게임 상태를 저장하는 핵심이에요. 일반 C++과 달리 UPROPERTY를 붙여 에디터에서 편집 가능하게 만드는 게 포인트죠. 이 글을 통해 변수 타입 선택 팁, 오버플로우 피하는 법, 블루프린트 연동까지 배워보시면 UE5 프로그래밍이 훨씬 수월해질 거예요. 실제 코드 예시와 비교로 왜 이 타입을 써야 하는지, 어떻게 최적화하는지까지 알게 되니, 다음 단계인 함수 배우기 전에 탄탄한 기반을 다지세요.


UE5 프로그래밍 입문 (2) - 변수 & UPROPERTY | 언리얼 5 [U5-P-1] - 주요 장면 1

UE5 변수 기본 개념 잡기

UE5 프로그래밍에서 변수는 게임의 모든 상태를 담는 기본 도구예요. 예를 들어, 캐릭터의 체력이나 공격력을 저장할 때 쓰이죠. 이걸 제대로 이해하지 않으면 코드가 엉망이 될 수 있어요.

먼저 변수의 역할부터 알아보죠. 프로그래밍에서 변수는 값을 저장하는 '상자' 같은 거예요. 게임에서 TotalDamage처럼 총 데미지 값을 넣어두면, 나중에 계산할 때 쉽게 불러올 수 있죠. UE5는 C++ 기반이라 일반 프로그래밍과 비슷하지만, 엔진 특성상 메모리 최적화가 중요해요. 왜냐하면 대규모 게임에서 수천 개의 액터가 동시에 변수 값을 다루니까요.

기본 변수 타입은 네 가지로 나눌 수 있어요. 정수, 소수, 문자열, 논리값이죠. 정수는 0, 1 같은 정수를 다루는데, UE5에서는 플랫폼 차이를 피하기 위해 int8, int16, int32, int64처럼 고정 크기 타입을 추천해요. int8은 -128~127 범위로 메모리 1바이트만 쓰지만, int64는 엄청 큰 숫자까지 커버하면서 8바이트를 차지하죠. 음수가 필요 없으면 uint8(0~255)처럼 u를 붙여 범위를 두 배로 늘릴 수 있어요.

실제 예시로 보자면, 아이템 개수를 세는 변수에 uint8을 쓰면 255개까지 안전해요. 하지만 플레이어가 300개를 모으면 오버플로우가 발생해서 갑자기 44개로 줄어요. 이게 게임 버그의 원인이 되죠. 팁으로는 필요한 범위를 미리 계산하세요. 체력이 1000 이하라면 int16으로 충분하고, 메모리 절약이 돼요. 만약 범위를 넘을 위험이 있으면 if문으로 체크해서 클램프(clamp) 처리하는 게 좋아요. 예: if (Health > 32767) Health = 32767;

소수 타입은 float과 double이에요. float은 32비트로 소수점 5자리 정밀도, double은 64비트로 10자리예요. UE5 게임 개발에서는 대부분 float을 써요. 왜냐하면 물리 계산처럼 빠른 속도가 필요하거든요. double은 과학 시뮬레이션이나 고정밀도 그래픽에서만 쓰죠. 비교해보면, float으로 속도 3.14를 저장하면 에디터에서 간단히 조정 가능하지만, double은 파일 크기가 커져 로딩이 느려질 수 있어요.

문자열은 FString이 기본이에요. "Hello"처럼 텍스트를 넣을 때 TEXT("Hello") 매크로를 써야 해요. 왜냐하면 UE5가 유니코드 지원을 위해 TCHAR 기반이기 때문이죠. std::string과 비교하면 FString은 동적 크기로 메모리 효율이 좋지만, 블루프린트 연동 시 FText를 쓰면 현지화(다국어)가 쉬워요. 예를 들어, 캐릭터 이름 변수에 FString CharacterName = TEXT("Warrior");라고 하면 에디터에서 바로 수정할 수 있어요.

논리 변수는 bool로 true/false를 저장해요. bAttackable처럼 공격 가능 여부를 표시할 때 유용하죠. 이 타입들은 헤더 파일(.h)에서 선언해야 클래스 멤버 변수로 작동해요. 프로젝트를 새로 만들 때 C++ 템플릿 선택하고 Actor 상속 클래스를 생성하면 MyActor.h가 열리는데, 여기서 int32 TotalDamage;처럼 적어요.

꼭 알아야 할 포인트는 타입 선택 시 메모리 vs. 안전성 균형이에요. int64를 무조건 쓰면 편하지만, 모바일 게임에서 메모리 초과될 수 있어요. 실제로 UE5 프로젝트에서 변수 1000개를 int8로 하면 1KB, int64로 하면 8KB 차이 나죠. 초보자 팁: Visual Studio에서 디버그 모드로 변수 크기 확인해보세요. sizeof(int32) == 4 확인되면 맞아요. 이 기본을 잡으면 UE5 프로그래밍이 훨씬 안정적이에요.

UE5 프로그래밍 입문 (2) - 변수 & UPROPERTY | 언리얼 5 [U5-P-1] - 주요 장면 2

UPROPERTY 매크로로 에디터 연동하기

UPROPERTY는 UE5 프로그래밍의 핵심 매크로예요. 이걸 안 쓰면 변수가 에디터에 안 보이거든요. 일반 C++과 달리 언리얼은 에디터와 코드 연동이 생명줄이죠.

UPROPERTY를 붙이는 이유는 엔진이 변수 존재를 인지하고, 블루프린트나 디테일 패널에서 접근 가능하게 하기 위함이에요. 빈 UPROPERTY()만 붙이면 아무 일도 안 일어나요. 지정자를 넣어야 해요. 가장 기본은 EditAnywhere예요. 이걸 쓰면 아키타입(블루프린트 원본)과 인스턴스(월드에 배치된 객체) 둘 다 편집할 수 있어요.

예시로 TotalDamage에 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")를 붙여보죠. EditAnywhere로 에디터 편집 가능, BlueprintReadWrite로 블루프린트에서 읽기/쓰기 OK, Category로 Damage 그룹에 모아져요. 이렇게 하면 디테일 패널에서 Damage 카테고리 아래 총 데미지 슬라이더가 생겨요. 비교해보면, 유니티 C#에서 public 변수만으로 인스펙터 노출되지만, UE5는 UPROPERTY 없인 안 돼요. 이게 언리얼의 강점: 코드와 에디터 분리가 명확해져요.

다른 지정자도 알아보죠. VisibleAnywhere는 보기만 가능, 편집 불가예요. DamagePerSecond처럼 계산된 값에 딱 맞아요. BlueprintReadOnly는 블루프린트 읽기만 허용하죠. Transient는 저장 안 되는 휘발성 변수로, 런타임 계산용이에요. 예: 매 프레임 업데이트되는 DPS에 Transient 붙이면 세이브 파일 부풀지 않아요.

실전 팁: 지정자 조합 실수 피하세요. EditAnywhere + BlueprintReadOnly면 에디터 편집은 되지만 블루프린트 쓰기 불가예요. 컴파일은 에디터 콘솔에서 LiveCoding.Compile 입력하거나 Ctrl+Alt+F11로 해요. 컴파일 후 MyActor를 월드에 드래그하면 디테일 패널에 카테고리별 변수가 뜹니다. DamagePerSecond는 회색으로 고정된 걸 확인할 수 있어요.

배경 지식으로, UPROPERTY는 리플렉션 시스템 기반이에요. 엔진이 런타임에 변수 정보를 읽어 블루프린트 노드 생성하죠. 대안으로는 USTRUCT로 변수 그룹화할 수 있지만, 초보는 간단히 UPROPERTY부터요. 왜 중요한가? 이 매크로 덕에 코더와 아티스트가 협업 쉬워져요. 예를 들어, 아티스트가 에디터에서 DamageTimeInSeconds를 5.0으로 조정하면 코드 수정 없이 테스트 가능하죠.

주의사항: Category 이름은 영어로 통일하세요. "Damage"처럼. 너무 많은 지정자 넣으면 컴파일 에러 날 수 있어요. 공식 문서에서 전체 목록 확인하는 게 좋아요. 이걸 마스터하면 UE5 변수가 단순 저장소가 아닌, 동적 에디터 도구로 변신해요.

UE5 프로그래밍 입문 (2) - 변수 & UPROPERTY | 언리얼 5 [U5-P-1] - 주요 장면 3

변수 공개 범위와 초기화 실전 적용

UE5에서 변수 공개 범위는 코드 보안과 상속을 결정해요. public, protected, private으로 나누죠. 이걸 모르면 클래스 외부에서 변수 접근이 엉키기 쉽습니다.

C++에서 public: 모두 접근 가능, protected: 자식 클래스만, private: 내부만이에요. 헤더에 public: 적고 콜론(:) 달면 그 아래 변수/함수가 해당 범위예요. 예: public: 아래 TotalDamage; private: 아래 bInternalFlag;처럼요. 유니티 C#과 달리 키워드 앞에 블록으로 지정하죠. 함수에도 적용돼요. BeginPlay()를 protected로 하면 자식에서만 오버라이드 가능해요.

왜 중요한가? public 너무 많으면 캡슐화 위반으로 버그 생겨요. 예를 들어, private으로 내부 계산 변수 숨기면 외부에서 실수로 수정 못 해요. 실전 팁: 기본은 private으로 하고, 필요 시 public으로. UE5에서는 public 해도 UPROPERTY 없인 에디터 안 보이니, 보안과 편의 균형 맞춰요.

초기화는 생성자에서 해요. AMyActor::AMyActor() 함수예요. 객체 생성 시 한 번 호출되죠. 방법 두 가지: 생성자 뒤 : TotalDamage(100)처럼, 또는 바디 안 { TotalDamage = 100; }. 첫 번째가 깔끔해요. 컴파일 후 에디터에서 기본값 적용된 걸 봐요. 예: DamageTimeInSeconds(2.5f)로 하면 2.5초 기본 데미지 시간 돼요.

실용적 팁: float 초기화 시 f 붙여 float 지정하세요. 문자열은 TEXT("DefaultName"). bool은 true/false. 오버플로우 방지로 생성자에서 클램프 추가: TotalDamage = FMath::Clamp(TotalDamage, 0, 9999);. 이 함수는 UE5 유틸리티로 범위 제한해줘요.

대안: 블루프린트에서 초기화하려면 EditDefaultsOnly 지정자 써요. 하지만 C++으로 하면 성능 좋아요. 주의: 생성자에서 Super() 호출 잊지 마세요. 에디터에서 값 바꾼 후 플레이 테스트 해보고, 로그로 PrintString(TotalDamage); 찍어 확인하세요. 이 단계까지 하면 UE5 프로그래밍 변수가 완성돼요. 다음 UFUNCTION으로 넘어가기 딱 좋죠.


[자주 묻는 질문]

UE5에서 int32와 uint32 차이는 뭐예요? 언제 써야 하나요?

int32는 -21억~21억 범위로 음수 포함, uint32는 0~42억으로 양수만 다뤄요. UE5 프로그래밍에서 체력처럼 음수가 필요 없으면 uint32가 메모리 효율적이에요. 예를 들어, 돈이나 아이템 수에 uint32 쓰면 오버플로우 시 양수 유지돼 버그 적어요. 팁: 범위 계산 후 선택하세요. uint8로 색상 값(0~255) 저장하면 최적화 돼요. 음수 계산 시 int로 가는 게 안전하죠.

UPROPERTY 지정자 중 EditAnywhere와 VisibleAnywhere 차이점은?

EditAnywhere는 에디터와 블루프린트에서 편집 가능, VisibleAnywhere는 보기만 돼요. UE5에서 계산 결과처럼 수정 금지 변수에 VisibleAnywhere 써요. 예: DamagePerSecond를 VisibleAnywhere로 하면 디테일 패널에 회색으로 표시돼 읽기만 가능하죠. 이게 왜 좋냐면, 실수 수정 방지하고 블루프린트 연동 안전해져요. 팁: Category 추가로 그룹화하면 작업 속도 빨라져요.

UE5 생성자에서 변수 초기화할 때 주의할 점은 뭐예요?

생성자 AMyActor()에서 : 변수(값)이나 { 변수 = 값; }으로 초기화하세요. Super() 호출 필수로 부모 초기화 해요. UE5 프로그래밍에서 float은 f 붙이고, FString은 TEXT() 써야 해요. 팁: Clamp로 범위 제한 추가하면 오버플로우 피해요. 예: Health(100); 후 컴파일하고 에디터 확인하세요. 블루프린트 기본값 우선되니, EditDefaultsOnly와 조합 잘 맞춰요.

목록
글쓰기
한국 서버호스팅
전체보기 →

댓글 0