λͺ©λ‘μ 체 κΈ (1099)
KoreanFoodie's Study
ENUM_CLASS_FLAGS μ¬μ©νκΈ° (μΈλ¦¬μΌ νλκ·Έ μ¬μ©λ²) ν΅μ¬ : 1. μ¬λ¬ 쑰건μ λμμ κ°μ§ μ μλ μν©μ λ€λ₯Ό λλ, Enum Class μ κ°μ Shift μ°μ°μλ₯Ό νμ©ν΄ Bit Flag μ²λΌ μ¬μ©νλ κ²μ΄ μ’λ€. 2. EnumClassFlags νμΌμ μ μλ ν νλ¦Ώ ν¨μλ€(e.g. EnumHasAnyFlags)μ νμ©νλ©΄, Enum Class μ μ μλ νλκ·Έλ€μ μ΄μ©ν΄ μΌμ΄μ€λ€μ μ€μ²©μ ν¨μ¨μ μΌλ‘ 체ν¬ν μ μλ€. 3. μΌλ°μ μΌλ‘ Enum Class λ΄μ κ°λ€μ Flag λ‘ νννλ κ²½μ°λ UI λ νκ²½μ€μ μΈν λ±μ΄ μλ€. μΌλ°μ μΌλ‘ Enum Class λ κ°μ μ£Όμ λ΄μμ μ¬λ¬ 쑰건λ€μ λ€λ£° λ μ¬μ©νλ€. κ·Έλ°λ° λ§μΌ μ¬λ¬ 볡ν©μ μΈ μν©μ λμμ λ€λ€μΌ νλ μΌμ΄μ€κ° μλ€κ³ νλ©΄ ..
TimerHandle λ°°μ΄ μ¬μ©νκΈ° (TimerHandle Array) ν΅μ¬ : 1. TArray νμ μ μ¬μ©νλ©΄ λλ€. 2. μλ‘μ΄ FTimerHandle μ λ£μ λλ Emplace λ₯Ό μ¬μ©νλ€. 3. κ°μ²΄κ° νκ΄΄λκ±°λ μ 리νλ μμ μ ClearTimer λ° λ°°μ΄μ λΉμμ£Όλ μμ μ ν΄ μ£Όμ. μ€λͺ ν κ²μ μμ 3μ€ μμ½μμ λ€ νμΌλ, μ½λλ§ λ³΄μ. // μ μΈ // μΌμ μκ° ν UTextBlock λ³Έλ μμμΌλ‘ λμκ°κ² λ§λ€λ μ¬μ©νλ νμ΄λ¨ΈνΈλ€ TArray timerHandleList; // ꡬν void UTestWidget::NativeConstruct() { for (int i = 0; i < 10; ++i) { FTimerHandle newTimerHandle; timerHandleList..
λμ μΌλ‘ μ»΄ν¬ν΄νΈ μμ±νκΈ° (Dynamically create ActorComponent) ν΅μ¬ : 1. μΌλ°μ μΌλ‘ ActorComponent λ μμ±μμμ CreateDefaultSubobject ν¨μλ₯Ό ν΅ν΄ CDO κ° μμ±λλ€. 2. λμ μΌλ‘ μ‘ν° μ»΄ν¬λνΈλ₯Ό μμ±ν λλ λ κ°μ§ λ°©λ²μ΄ μλ€. λΈλ£¨νλ¦°νΈμμλ AddComponent ν¨μλ₯Ό μ¬μ©νλ©΄ λλ©°, C++ μμλ NewObject λ‘ ActorComponent λ₯Ό μμ± ν, κΈ°μ‘΄ RootComponent μ Attach νλ λ°©μμ νμ©νλ€. 3. 컀μ€ν AddComponent ν¨μλ₯Ό λ§λ€μ΄μ νΈνκ² νμ©νκ±°λ, ν νλ¦Ώ ν¨μλ₯Ό λ§λλ κ²λ μ’μ λ°©λ²μ΄λ€. λΈλ£¨νλ¦°νΈμμ AActor ν΄λμ€μλ AddComponent λΌλ, λ΄λΆμ μΌλ‘ NewObj..
SetTimer μ ν¨μ λ° λλ€(Lambda) μ°κ²°νκΈ° ν΅μ¬ : 1. UObject μμ ν΄λμ€μμλ κΈ°μ‘΄ ν¨μλ₯Ό SetTimer ν¨μμμ λ°λ‘ μ°κ²°ν μ μλ€. 2. μΌλ°μ μΌλ‘λ FTimerDelegate μ Lamda ν¨μλ₯Ό μ°κ²°ν΄ μ¬μ©νλ©°, UObject λ₯Ό μμνμ§ μλ ν΄λμ€μμλ μ΄ λ°©λ²μ μ¬μ©ν μ μλ€. 3. FTimerHandle μ μ μμ΄λ©°, μ¬μ© μλ£ νμλ ClearTimer λ₯Ό μ΄μ©ν΄ νμ΄λ¨Έλ₯Ό ν΄μ ν΄ μ£Όλλ‘ νμ! μ΄μ κΈμμ μΈκΈν λ° μμ§λ§, μΌμ μκ° μ΄ν νΉμ ν¨μκ° νΈμΆλλλ‘ λ§λλ λ°©λ²μ μ‘°κΈ λ μμΈν κΈ°λ‘ν΄λ³΄λ € νλ€. SetTimer μ ν¨μμ λλ€λ₯Ό μ°κ²°νλ λ°©λ²μ μΆκ°λ‘ μκ°νλ€! 1. κΈ°μ‘΄ ν¨μμ κ·Έλλ‘ μ°κ²° (UObject ν΄λμ€μμ μ¬μ© κ°λ₯) FTimer..
νμ¬ μκ° λ‘κ·Έ μ°κΈ° ν΅μ¬ : 1. FDateTime ꡬ쑰체λ₯Ό μ΄μ©ν΄μ κ°μ’ μκ°μ 체ν¬ν μ μλ€. 2. FDateTime::Now() λ₯Ό ν΅ν΄μ νμ¬ μκ°(μ΄κΉμ§)λ₯Ό ꡬν μ μλ€(static). 3. FDateTime::GetMillisecond() λ₯Ό ν΅ν΄ νμ¬ λ°λ¦¬ μ΄λ₯Ό ꡬν μ μλ€(non-static). μλ μ½λλ₯Ό μ΄μ©ν΄μ νμ¬ μκ°μ ꡬνλ κ°λ¨ν λ‘κ·Έλ₯Ό μ°μ΄ λ³Ό μ μλ€! FDateTime dateTime; UE_LOG(Error, FText::FromString( FString::Format(TEXT("Current Time : %s:%d ms"), { FDateTime::Now().ToString(), dateTime.GetMillisecond() }))); UE_LOG 맀ν¬λ‘λ F..
SafeZone μμ ― ν΅μ¬ : 1. SafeZone μμ ―μ μ¬μ©νλ©΄, μ½μ/PC/λͺ¨λ°μΌ λ± μμ ν¨λ κ°μ₯μ리μ UI λ° μ»¨ν μΈ κ° μ λλ‘ μΆλ ₯μ΄ λμ§ μλ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€. λ¨Όμ , SafeZone ν¨λμ λν μΈλ¦¬μΌ μμ§μ μ€λͺ μ λ€μκ³Ό κ°λ€ : μΈλ¦¬μΌ 곡μ λ¬Έμμ μλ μΈμ΄ν μ‘΄μ λν κ·Έλ¦Όμ 보μ. μΌμͺ½μ SafeZone μμ ―μ΄ μλ κ²½μ°μ΄κ³ , μ€λ₯Έμͺ½μ SafeZone μμ ―μ΄ μλ κ²½μ°μ΄λ€. μ€λ₯Έμͺ½μ κ²½μ°, Uniform Safe Zone (κ· λ± μΈμ΄ν μ‘΄) μμμ 0.9(λΉ¨κ°) μΌλ‘ μ€μ νλ€. μ΄λ κ² μΈμ΄ν μ‘΄μ νμ©νλ©΄, κ°μ₯μ리μ "Unsafe" ν μ‘΄μ μμ ―μ΄ μ리λ κ²μ λ°©μ§ν μ μλ€! μ°Έκ³ : μΈλ¦¬μΌ 곡μ λ¬Έμ
μΈλ¦¬μΌμ Cast λμ μ리 ν΅μ¬ 1. Cast λ UObject μ μ°μ¬μΌ νλ€. Cast λ static_cast μλ λ¬λ¦¬ νμ μμ μ±μ μ§λλ€(nullptr λ₯Ό 리ν΄). 2. Cast μ λ°νμ λΉμ©μ μλν° νκ²½μμλ O(O(Depth(InheritanceTree))) μ΄κ³ , μλν°κ° μλ λλ O(1) μ΄λ€. 3. Cast λ dynamic_cast λ₯Ό μ¬μ©νμ§ μλλ€. dynamic_cast λμ Cast λ₯Ό μ¬μ©νλΌ! μ€μ λ‘ μΈλ¦¬μΌμ Cast λ λ€μκ³Ό κ°μ΄ ꡬνλμ΄ μλ€ : // Dynamically cast an object type-safely. template FORCEINLINE To* Cast(From* Src) { return TCastImpl::DoCast(Src); } λ΄λΆ..
UObject μ ν΄λμ€ νμ μ²΄ν¬ (λ°νμ) μ°λ¦¬κ° μμ΄ν μ μ¬μ©νλλ°, μλͺ¨νμΌ κ²½μ° μλμ κΉλ μ½λλ₯Ό μ§ λ€κ³ κ°μ ν΄ λ³΄μ. μ½λλ λ€μκ³Ό κ°λ€. if (nullptr != Cast(myItem)) { this->consumeItem(myItem); } else { this->useItem(myItem); } (λ¬Όλ‘ νμ€μ μΌλ‘ μ΄λ° κ²½μ°, FConsumable ν΄λμ€μμ useItem μ override νκ² μ§λ§.. μ¬νΌ) μμ²λΌ, κ°μ²΄μ ν΄λμ€ νμ μ 체ν¬νλ κ²½μ°, μ΄λ»κ² νλ κ²μ΄ ν¨μ¨μ μΌκΉ? μμ κ°μ κ²½μ°μ, λ§μ½ μΊμ€ν μ΄ μ€μ λ‘ νμν κ²½μ°κ° μλλΌλ©΄(μ¦, κ·Έλ₯ νμ 체νΉλ§ νλ©΄ λλ κ²½μ°λΌλ©΄), Cast(μΈλ¦¬μΌμ Cast λ μ /λ€μ΄ μΊμ€ν μ ν μ μλλ‘ κ΅¬νλμ΄ μλ€)λ₯Ό μ°λ κ²λ³΄λ€..
ν μ€νΈ μ‘°ν λ³΄ν΅ νλ‘μ νΈ κ·λͺ¨κ° 컀μ§κ² λλ©΄, κ°μ’ μ€νΈλ§λ€μ μ€νΈλ§ ν μ΄λΈμ λ£μ΄μ μ¬μ©ν κ²μ΄λ€. μ΄λ μ€νΈλ§ ν μ΄λΈμ Namespace μ ν€ κ° λ κ°κ° μκ³ , μνλ Namespace μμ ν€λ₯Ό λμ ν΄ μνλ ν μ€νΈλ₯Ό μ°Ύκ² λλ€. Namespace λ κ°λ¨ν λ§ν΄ μ€νΈλ§ ν μ΄λΈ νμΌμ μ΄λ¦μ΄λΌκ³ 보면 λλ€. μ€μ λ‘ C++ μ½λλ‘ μ§λ©΄, λ€μκ³Ό κ°λ€ : FText findText; FText::FindText(TEXT("your_namespace"), TEXT("your_key"), findText); your_namespace μ your_key μ μ ν©ν κ°μ μ£Όλ©΄, μνλ κ°μ΄ findText μ λ€μ΄κ° κ²μ΄λ€. μμ°Έ, μ€νΈλ§ ν μ΄λΈμ λ§λ λ€μ, μλ¨μ 'λ€μμ€νμ΄μ€' λ₯Ό μ λλ‘ μ€μ ν΄ ..
Delay μ€ν λ§μ½ μΌμ μκ°μ΄ μ§λ ν ν¨μκ° μ€νλκΈΈ μνλ€λ©΄, FTimerHandle μ μ΄μ©ν΄ λ€μκ³Ό κ°μ΄ μ½λλ₯Ό μ§λ©΄ λλ€. FTimerHandle myTimerHandle; GetWorld()->GetTimerManager().SetTimer(myTimerHandle, FTimerDelegate::CreateLambda([&]() { // λ΄κ° μνλ μ½λ ꡬν DoSomething(); // νμ΄λ¨Έ μ΄κΈ°ν GetWorld()->GetTimerManager().ClearTimer(fadeOutTimerHandle); }), InDelayTime, false); // λ°λ³΅ μ€νμ νκ³ μΆμΌλ©΄ false λμ true λμ μ, μ°Έκ³ λ‘ FTimerHandle μ κΈλ‘λ² νμ΄λ¨Έ 맀λμ μμ μ¬μ©νλ©°..