#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Class1Character.generated.h"
GENERATED_BODY() : 언리얼 매크로 시스템에서 필수로 넣어야 하는 매크로generated.h 파일 : 리플렉션 처리를 위한 자동 생성 파일✅ 클래스 : UCLASS
UCLASS()
class AClass1Character : public ACharacter
✅ 변수 : UPROPERTY
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera, meta=(AllowPrivateAccess="true"))
USkeletalMeshComponent* Mesh1P;
UPROPERTY를 붙이면 언리얼의 가비지 컬렉터가 해당 변수를 관리함VisibleAnywhere : 어디서든 편집 가능BlueprintReadOnly : 블루프린트에서는 읽기만 가능AllowPrivateAccess : private 변수라도 에디터에서 노출✅ 함수: UFUNCTION
UFUNCTION(BlueprintCallable, Category="MyFunctions")
void DoSomething();
UFUNCTION은 해당 함수를 언리얼 시스템(특히 블루프린트)에 노출시킴BlueprintCallable : 블루프린트에서 직접 호출할 수 있음BlueprintImplementableEvent : C++에서는 선언만 하고, 실제 로직은 블루프린트에서 구현 가능Server, Client, NetMulticast : 네트워크 함수 지정❓ 언제 UPROPERTY가 필요할까
| 상황 | UPROPERTY 필요 여부 | 이유 |
|---|---|---|
| 클래스 내부에서만 사용 | ❌ 필요 없음 | C++ 코드 안에서만 쓰면 일반 변수로 충분 |
| 에디터에서 값을 수정하고 싶음 | ✅ 필요 | 디자이너가 수정할 수 있도록 하기 위해 |
| 블루프린트에서 읽거나 쓰고 싶음 | ✅ 필요 | 리플렉션을 통해 노출되어야 함 |
| 언리얼의 가비지 컬렉터(GC)가 관리해야 함 | ✅ 필요 | UPROPERTY를 통해 메모리 관리 대상 등록됨 |
❓ UPROPERTY를 쓰는 이유
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera, meta=(AllowPrivateAccess="true"))
USkeletalMeshComponent* Mesh1P;
VisibleAnywhere 에디터의 모든 섹션에서 해당 값을 보기만 가능 (수정 불가) BlueprintReadOnly 블루프린트에서 읽을 수는 있으나 값 대입은 불가능 meta = (AllowPrivateAccess="true") : private으로 선언된 변수라도 에디터에 노출 가능⚠️ 기본형(int 등) 변수와 UPROPERTY 사용 여부
🧩 예시
❌ 일반 변수 (C++ 내부에서만 사용)
int KillCount;
⭕ 에디터에서 보여주고 싶은 변수
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Stats")
int KillCount;
EditAnywhere : 에디터에서 수정 가능BlueprintReadWrite : 블루프린트에서 읽고 쓸 수 있음| 접두어 | 의미 | 예시 |
|---|---|---|
A | AActor 기반 클래스 (게임 내 존재하는 객체) | AClass1Character, AMyEnemy |
U | UObject 기반 클래스 (컴포넌트, 데이터 등) | USkeletalMeshComponent, UAnimInstance |
F | 구조체 (struct) | FVector, FRotator |
E | 열거형 (enum) | EWeaponType, EMovementState |
I | 인터페이스 (interface) | IInteractable, IDamageable |
🧩 예시
USkeletalMeshComponent* Mesh1P;
U UObject 기반 클래스SkeletalMeshComponent 메시(모델)와 애니메이션을 처리하는 컴포넌트* 포인터 (참조를 위한 것)Mesh1P 보통 1인칭 캐릭터의 몸체에 붙이는 메시| 타입 | 설명 |
|---|---|
FName | 한 번 생성 후 수정 불가. 성능 최적화됨 |
FText | UI용 텍스트, 로컬라이징 가능 |
FString | 일반 문자열 |
FName(TEXT("MyComponent")) ← TEXT() 매크로와 함께 사용Mesh1P->SetOnlyOwnerSee(true); // 나만 보이게 설정
Mesh1P->bCastDynamicShadow = false; // 그림자 비활성화
InputComponent->BindAction("Jump", IE_Pressed, this, &AClass1Character::Jump);
"Jump"라는 입력이 들어오면 해당 함수를 실행하도록 연결