Post

언리얼 리플렉션 시스템

언리얼 리플렉션 시스템 기본

언리얼 리플렉션 시스템

언리얼 리플렉션 시스템


1. 리플렉션 시스템이란?

C++ 클래스, 변수, 함수를 언리얼 엔진이 인식할 수 있도록 등록하는 시스템이다.

리플렉션이 적용되면:

  • 블루프린트 사용 가능
  • 에디터 노출 가능
  • 네트워크 복제 가능
  • 직렬화 가능
  • GC(Garbage Collection) 관리 가능

2. UCLASS

클래스를 엔진에 등록한다.

1
2
3
4
5
UCLASS()
class TPSBASE_API AMyCharacter : public ACharacter
{
	GENERATED_BODY()
};

Blueprintable

블루프린트 상속 가능

1
2
3
4
5
UCLASS(Blueprintable)
class TPSBASE_API AMyCharacter : public ACharacter
{
	GENERATED_BODY()
};

BlueprintType

블루프린트 변수 타입으로 사용 가능

1
2
3
4
5
UCLASS(BlueprintType)
class TPSBASE_API UMyData : public UObject
{
	GENERATED_BODY()
};

Abstract

직접 생성 불가

1
2
3
4
5
UCLASS(Abstract)
class TPSBASE_API ACharacterBase : public ACharacter
{
	GENERATED_BODY()
};

Config

ini 파일 사용

1
2
3
4
5
UCLASS(Config=Game)
class TPSBASE_API UMySettings : public UObject
{
	GENERATED_BODY()
};

3. UPROPERTY

변수를 엔진에 등록한다.

1
2
UPROPERTY()
float HP;

3-1. EditAnywhere

에디터 어디서든 수정 가능

1
2
UPROPERTY(EditAnywhere)
float MoveSpeed = 600.f;

3-2. EditDefaultsOnly

블루프린트 기본값만 수정 가능

1
2
UPROPERTY(EditDefaultsOnly)
float MaxHP = 100.f;

3-3. EditInstanceOnly

배치된 인스턴스만 수정 가능

1
2
UPROPERTY(EditInstanceOnly)
float PatrolRadius;

3-4. VisibleAnywhere

읽기만 가능

1
2
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* Mesh;

주로 컴포넌트에 사용

3-5. BlueprintReadOnly

블루프린트 읽기 가능

1
2
UPROPERTY(BlueprintReadOnly)
float HP;

3-6. BlueprintReadWrite

블루프린트 읽기/쓰기 가능

1
2
UPROPERTY(BlueprintReadWrite)
float HP;

3-7. Category

에디터 카테고리 분류

1
2
UPROPERTY(EditAnywhere, Category="Character")
float HP;

3-8. Transient

저장되지 않음

1
2
UPROPERTY(Transient)
float RuntimeDamage;

런타임 전용 데이터

3-9. Replicated

네트워크 복제

1
2
UPROPERTY(Replicated)
float HP;

3-10. ReplicatedUsing

복제 시 콜백 호출

1
2
3
4
5
UPROPERTY(ReplicatedUsing=OnRep_HP)
float HP;

UFUNCTION()
void OnRep_HP();

3-11. Meta

에디터 표시 방식 설정

1
2
UPROPERTY(EditAnywhere, meta=(ClampMin="0"))
float HP;

ClampMin

최소값 제한

1
2
UPROPERTY(EditAnywhere, meta=(ClampMin="0"))
float HP;

ClampMax

최대값 제한

1
2
UPROPERTY(EditAnywhere, meta=(ClampMax="100"))
float HP;

UIMin / UIMax

슬라이더 범위 제한

1
2
3
UPROPERTY(EditAnywhere,
	meta=(UIMin="0", UIMax="100"))
float HP;

AllowPrivateAccess

Private 변수 BP 노출

1
2
3
4
5
UPROPERTY(
	VisibleAnywhere,
	BlueprintReadOnly,
	meta=(AllowPrivateAccess="true"))
UCameraComponent* Camera;

4. UFUNCTION

함수를 엔진에 등록한다.

1
2
UFUNCTION()
void Heal();

4-1. BlueprintCallable

블루프린트에서 호출 가능

1
2
UFUNCTION(BlueprintCallable)
void Heal();

4-2. BlueprintPure

실행 핀 없는 함수

1
2
UFUNCTION(BlueprintPure)
float GetHP() const;

Getter 함수에 사용

4-3. BlueprintImplementableEvent

블루프린트에서 구현

1
2
UFUNCTION(BlueprintImplementableEvent)
void OnDeath();

CPP 구현 없음

4-4. BlueprintNativeEvent

CPP 기본 구현 + BP 확장 가능

1
2
UFUNCTION(BlueprintNativeEvent)
void OnDeath();
1
void OnDeath_Implementation();

4-5. CallInEditor

에디터 버튼 생성

1
2
UFUNCTION(CallInEditor)
void GeneratePoints();

5. RPC

멀티플레이 함수 호출

5-1. Server

클라이언트 → 서버

1
2
UFUNCTION(Server, Reliable)
void ServerAttack();

5-2. Client

서버 → 특정 클라이언트

1
2
UFUNCTION(Client, Reliable)
void ClientNotify();

5-3. NetMulticast

서버 → 모든 클라이언트

1
2
UFUNCTION(NetMulticast, Reliable)
void MulticastExplosion();

5-4. Reliable

전송 보장

1
2
UFUNCTION(Server, Reliable)
void ServerInteract();

중요한 이벤트

  • 공격
  • 아이템 획득
  • 문 열기

5-5. Unreliable

전송 보장 안함

1
2
UFUNCTION(Server, Unreliable)
void ServerMove();

빈번한 데이터

  • 이동
  • 카메라
  • 조준 방향

6. USTRUCT

구조체를 엔진에 등록한다.

1
2
3
4
5
6
7
8
9
10
11
USTRUCT(BlueprintType)
struct FCharacterData
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere)
	float HP;

	UPROPERTY(EditAnywhere)
	float MP;
};

7. UENUM

Enum을 엔진에 등록한다.

1
2
3
4
5
6
7
8
UENUM(BlueprintType)
enum class ECharacterState : uint8
{
	Idle,
	Run,
	Jump,
	Dead
};

8. 실무에서 가장 많이 쓰는 조합

컴포넌트

1
2
3
4
5
UPROPERTY(
	VisibleAnywhere,
	BlueprintReadOnly,
	Category="Components")
USpringArmComponent* SpringArm;

에디터 설정값

1
2
3
4
5
UPROPERTY(
	EditDefaultsOnly,
	BlueprintReadOnly,
	Category="Character")
float MaxHP = 100.f;

레벨 배치 설정값

1
2
3
4
UPROPERTY(
	EditInstanceOnly,
	Category="AI")
float PatrolRadius;

Getter

1
2
UFUNCTION(BlueprintPure)
float GetHP() const;

액션 함수

1
2
UFUNCTION(BlueprintCallable)
void Attack();

서버 RPC

1
2
UFUNCTION(Server, Reliable)
void ServerInteract();

9. 우선 암기할 것

초반에 가장 많이 보는 태그는 아래 10개다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
UCLASS()

UPROPERTY(EditAnywhere)
UPROPERTY(EditDefaultsOnly)
UPROPERTY(VisibleAnywhere)
UPROPERTY(BlueprintReadOnly)
UPROPERTY(BlueprintReadWrite)

UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintPure)

UFUNCTION(Server, Reliable)

USTRUCT(BlueprintType)
This post is licensed under CC BY 4.0 by the author.