1. 리νλ μ
리νλ μ (Reflection)μ νλ‘κ·Έλ¨μ΄ μ€ν μκ°μ μκΈ° μμ μ μ‘°μ¬νλ κΈ°λ₯μ΄λ€. μ¬κΈ°μ μκΈ° μμ μ΄λ ν΄λμ€, ꡬ쑰체, ν¨μ, λ©€λ² λ³μ, μ΄κ±°ν λ±μ μλ―Ένλ€. μ¦, λ°νμμ κ°μ²΄μ νμ μ 보λ κ²μ ν¬ν¨ν΄ ꡬ쑰μ νλκΉμ§ μμ νλ κ²μ΄ 리νλ μ μ΄λ€.
2. νλ‘νΌν°
μλ°λ C#μμλ 리νλ μ μ μ§μνμ§λ§, μΈλ¦¬μΌ C++μμλ μ§μνμ§ μκ³ μλ€. κ·Έλμ μΈλ¦¬μΌ μ체 μμ€ν μΌλ‘ 리νλ μ μ μ 곡νκ³ μμΌλ©° κ·Έ μμ€ν μ μΈλ¦¬μΌμ 리νλ μ μΈ νλ‘νΌν°λΌ λΆλ₯Έλ€.
μΈλ¦¬μΌ λ΄μ μ¬λ¬ κ°μ§ μμ€ν λ€μ΄ μ΄ λ¦¬νλ μ κ°μ²΄μ μμ‘΄νλ€.
- λ€νΈμν¬ λ¦¬ν리μΌμ΄μ
- λΈλ£¨νλ¦°νΈμ C++ μ°λ
- μλν°μ λν μΌ ν¨λ
- μλ μ리μΌλΌμ΄μ μ΄μ
- κ°λΉμ§ 컬λ μ
3. 맀ν¬λ‘
ν΄λμ€, λ³μ, ν¨μ λ± μν©μ λ§κ² 맀ν¬λ‘λ₯Ό λ¬μλλ©΄, UHT(Unreal Header Tool)κ° λΉλ μ μ²λ¦¬ μ νμν μ 보λ₯Ό μμ§νμ¬ νλ‘νΌν° μμ€ν μ λ±λ‘νκ² λλ€.
- 맀ν¬λ‘λ₯Ό μ μ‘°μν¨μΌλ‘μ C++μ λΈλ£¨νλ¦°νΈ μ°λμ μν μ μλ€.
- UENUM(), UCLASS(), USTURCT(), UFUNCTIONI(), UPROPERTY() λ±
// 리νλ μ
μ΄ μλ νμ
μ μ΄ ν€λνμΌμ μΈν΄λ£¨λν΄μ UHTμ μλ¦°λ€.
#include "MyObject.generated.h"
// MyObjectλ 리νλ μ
λλ ν΄λμ€μμ λνλΈλ€.
UCLASS()
class UMyObject : public UObject
{
// μλ μμ±λ μ½λκ° μ¬κΈ°μ μ½μ
λλ€λ λ§μ»€.
GENERATED_BODY()
// MyFuncλ 리νλ μ
λλ λ©€λ² ν¨μμμ λνλΈλ€.
UFUNCTION()
void MyFunc(int, double) {}
// MyDataλ 리νλ μ
λλ λ©€λ² λ³μμμ λνλΈλ€.
UPROPERTY()
int32 MyData;
// 리νλ μ
μ΄ λμ§ μλ κ²μ μμ΄λ λλ€.
// νμ§λ§ 리νλ μ
μμ€ν
μ 보μ΄μ§ μμΌλ―λ‘ μ£Όμν΄μΌνλ€.
uint8 MyNum;
// μλ₯Ό λ€λ©΄ 리νλ μ
λμ§ μλ UObject ν¬μΈν°λ₯Ό μ μ₯νλ κ²μ
// κ°λΉμ§ 컬λ ν°κ° λ νΌλ°μ€λ₯Ό νμΈν μ μκΈ° λλ¬Έμ μννλ€.
UObject* MyObjectRef;
}
// MyEnumμ 리νλ μ
λλ μ΄κ±°νμμ λνλΈλ€.
UENUM()
enum class EMyEnum
{
....
};
// MyStructλ 리νλ μ
λλ ꡬ쑰체μμ λνλΈλ€.
USTRUCT()
struct FMyStruct
{
GENERATED_BODY()
UPROPERTY()
int32 MyData;
// ꡬ쑰체μ λ©€λ²ν¨μλ UFUNCTIONμΌλ‘ μ§μ ν μ μλ€!
// UFUNCTION()
void MyFunc(double) {}
}
1) UPROPERTY()
λ³μμ λΆλ 맀ν¬λ‘μ΄λ©° μΈμ κ°μ λ£μ΄μ μ©λμ λ§κ² νμ©ν μ μλ€.
UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = Attack, Meta = (AllowPrivateAccess = true))
float AttackRange;
1) λ³μ 곡κ°μ μμ κΆν
- VisibleDefaultsOnly: λΈλ£¨νλ¦°νΈ μλν° μ°½μ λν μΌ ν¨λμμ κ° λ³΄κΈ° κ°λ₯
- VisibleInstanceOnly: μλ μμ λ°°μΉλ μ€λΈμ νΈμ λν μΌ ν¨λμμ κ° λ³΄κΈ° κ°λ₯
- VisibleAnywhere: λ λ€ λ³΄κΈ° κ°λ₯
- EditDefulatOnly: λΈλ£¨νλ¦°νΈ μλν° μ°½μ λν μΌ ν¨λμμ κ° μμ κ°λ₯
- EditInstanceOnly: μλ μμ λ°°μΉλ μ€λΈμ νΈμ λν μΌ ν¨λμμ κ° μμ κ°λ₯
- EditAnywhere: λ λ€ μμ κ°λ₯
2) λΈλ£¨νλ¦°νΈ κ³΅κ°μ μμ κΆν
- BlueprintReadOnly: λΈλ£¨νλ¦°νΈμμ μ½κΈ° κ°λ₯
- BlueprintReadWrite: λΈλ£¨νλ¦°νΈμμ μ½κΈ°μ μ°κΈ° κ°λ₯
- BlueprintGetter: ν΄λΉ ν¨μλ₯Ό ν΅ν΄ λΈλ£¨νλ¦°νΈμμ μ κ·Ό κ°λ₯
- BlueprintSetter: ν΄λΉ ν¨μλ₯Ό ν΅ν΄ λΈλ£¨νλ¦°νΈμμ μμ κ°λ₯
2) UFUNCTION()
ν¨μμ λΆλ 맀ν¬λ‘μ΄λ€.
// header νμΌ
UFUNCTION(BlueprintCallable, Category = "value")
void Function();
// cpp νμΌ
void AMyActor::Function()
{
// λμ
}
- BlueprintCallable: λΈλ£¨νλ¦°νΈ λ΄μμ μ¬μ© κ°λ₯
- BlueprintPure: λΈλ£¨νλ¦°νΈ λ΄μμ κ° νλ λ°ννλ ννμ μ¬μ©
- BlueprintImplementableEvent, BlueprintNativeEvent
3) UEnum()
UENUM(BlueprintType)
enum class ETestEnum : uint8
{
TE_OptionA UMETA(DisplayName = "Option A"),
TE_OptionB UMETA(DisplayName = "Option B"),
};
- BlueprintType: κ΅¬μ‘°μ²΄κ° λΈλ£¨νλ¦°νΈμμ μ¬μ© κ°λ₯
4) USTRUCT()
USTRUCT(Atomic, BlueprintType)
struct FCustomStruct
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
AActor* actor;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float f;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 i;
};
- Atomic: κ΅¬μ‘°μ²΄κ° νμ νλμ λ¨μλ‘ μ§λ ¬ν(Serialize) λ¨
- BlueprintType: κ΅¬μ‘°μ²΄κ° λΈλ£¨νλ¦°νΈμμ μ¬μ© κ°λ₯
4. κ°λΉμ§ 컬λ μ
κ°λΉμ§ 컬λ μ μ λ μ΄μ νμνμ§ μμ κ°μ²΄λ₯Ό κ°λΉμ§ 컬λ ν°κ° λ©λͺ¨λ¦¬μμ ν λΉ ν΄μ ν΄ μ£Όλ λ°©λ²μ΄λ€. νλ‘κ·Έλ¨μ κ·λͺ¨κ° 컀μ§μλ‘ μλμ κ°μ μν©λ€μ μ κ²½ μ°κΈ°κ° μ΄λ ΅κΈ° λλ¬Έμ λ±μ₯ν κ°λ μ΄λΌκ³ λ³Ό μ μλ€.
- λ©λͺ¨λ¦¬ λμ: λ μ΄μ μ¬μ©λμ§ μλ κ°μ²΄μΈλ° deleteλ₯Ό νμ§ μμ
- Dangling pointer: μμ§ μ¬μ© μ€μΈ κ°μ²΄μΈλ° delete ν΄λ²λ¦Ό
- undefined behaviour: ν λΉλμ§ μμ μμμ λν΄ delete ν΄λ²λ¦Ό
μΈλ¦¬μΌμμλ μ°Έμ‘° κ·Έλνλ₯Ό λ§λ€μ΄ μ΄λ μ€λΈμ νΈκ° μ¬μ© μ€μ΄κ³ μ΄λ κ²μ΄ μ¬μ© μ€μ΄μ§ μμμ§ νμΈνλ€. 루νΈμλ Root setμ΄ μμΌλ©° UObjectκ° μλμ μΆκ°λλ€.
κ°λΉμ§ 컬λ μ μ΄ λ°μνλ©΄ Root setλΆν° μμν΄μ νΈλ¦¬λ₯Ό κ²μνλ€. μ¬κΈ°μ μ°Ύμ§ λͺ»ν μ€λΈμ νΈλ μ°Έμ‘°λμ§ μμ μ€λΈμ νΈμ΄λ―λ‘ ν΄μ νκ³ μ κ±°νλ€. μ΄λ¬ν λ°©μμ Mark & Sweep λ°©μμ΄λΌ λΆλ₯΄λ©° Root setλΆν° Mark λκ³ Mark λμ§ μμ μ€λΈμ νΈλ€μ Sweep λλ€κ³ ν μ μλ€.
μ΄λ κ² Root setλΆν° μλ UObjectλ₯Ό λ°λΌ λ΄λ €κ°κΈ° μν΄μλ νλ‘νΌν°κ° νμνλ€. νλ‘νΌν°κ° κ°μ²΄ λ΄μ UObject ν¬μΈν° μμΉλ₯Ό κ°λΉμ§ 컬λ ν°μκ² μλ €μ£ΌκΈ° λλ¬Έμ΄λ€.
μ°Έκ³
https://www.unrealengine.com/ko/blog/unreal-property-system-reflection