[Unreal] ν”„λ‘œνΌν‹°(λ¦¬ν”Œλ ‰μ…˜), 맀크둜, κ°€λΉ„μ§€ μ»¬λ ‰μ…˜

2024. 6. 30. 15:39Β·πŸ“ Game/✏ Unreal

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://upbo.tistory.com/79

 

[Unreal Engine] λ¦¬ν”Œλ ‰μ…˜(ν”„λ‘œνΌν‹°)κ³Ό κ°€λΉ„μ§€ μ»¬λ ‰μ…˜

λ¦¬ν”Œλ ‰μ…˜ μœ„ν‚€ν”Όλ””μ•„μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 μ„€λͺ…ν•˜κ³  μžˆλ‹€. Reflection is the ability of a process to examine, introspect, and modify its own structure and behavior. λŸ°νƒ€μž„μ— 객체의 νƒ€μž…μ„ λ³΄λŠ” Type Introspection을 포함해

upbo.tistory.com

https://www.unrealengine.com/ko/blog/unreal-property-system-reflection

 

언리얼 ν”„λ‘œνΌν‹° μ‹œμŠ€ν…œ (λ¦¬ν”Œλ ‰μ…˜)

λ¦¬ν”Œλ ‰μ…˜(Reflection)은 ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰μ‹œκ°„μ— 자기 μžμ‹ μ„ μ‘°μ‚¬ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. μ΄λŠ” μ—„μ²­λ‚˜κ²Œ μœ μš©ν•œ 데닀 언리얼 μ—”μ§„ ν…Œν¬λ†€λ‘œμ§€μ˜ 근간을 μ΄λ£¨λŠ” κ²ƒμœΌλ‘œ, μ—λ””ν„°μ˜ λ””ν…ŒμΌ νŒ¨λ„, μ‹œλ¦¬μ–ΌλΌ

www.unrealengine.com

https://hyo-ue4study.tistory.com/182

 

[언리얼엔진] λ¦¬ν”Œλ ‰μ…˜ (aka. ν”„λ‘œνΌν‹° μ‹œμŠ€ν…œ)

μ–Έλ¦¬μ–Όμ—”μ§„ν•˜λ©΄μ€ 닀룬닀고 ν•˜λ©΄ μ•Œμ•„μ•Όν•  λͺ‡κ°€μ§€λ“€μ΄ μžˆλ‹€. κ·Έ μ€‘μ—μ„œ μ–Έλ¦¬μ–Όμ—”μ§„μ—μ„œ λ² μ΄μŠ€κ°€ λ˜λŠ” ν”„λ‘œνΌν‹° μ‹œμŠ€ν…œμΈ λ¦¬ν”Œλ ‰μ…˜ 이 μžˆλ‹€. λ¦¬ν”Œλ ‰μ…˜μ΄λΌλŠ” 것은 μžλ°”λ‚˜ C#등에선 μ§€μ›ν•˜μ§€λ§Œ,

hyo-ue4study.tistory.com

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Game/✏ Unreal' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Unreal] νŒ¨ν‚€μ§•
  • [Unreal] 캐릭터 μ• λ‹ˆλ©”μ΄μ…˜ κ°œμ„ 
  • [Unreal] κ²Œμž„ μΈμŠ€ν„΄μŠ€, μ„œλΈŒμ‹œμŠ€ν…œ
  • [Unreal] Object, Actor, Component
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[Unreal] ν”„λ‘œνΌν‹°(λ¦¬ν”Œλ ‰μ…˜), 맀크둜, κ°€λΉ„μ§€ μ»¬λ ‰μ…˜
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”