λͺ©λ‘μ 체 κΈ (1096)
KoreanFoodie's Study
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 μ κΈλ‘λ² νμ΄λ¨Έ 맀λμ μμ μ¬μ©νλ©°..
μ΄ λ³μ μκ³ λ μμ΄ μ°Ύμμ¨λ€. ν λ² μλ€κ³ ν΄μ λ€μ μ°Ύμμ€μ§ μλ κ²λ μλλ©°, μ΄λ―Έ κ²ͺμ΄ λ³΄μλ€κ³ ν΄μ λ 견λκΈ° μ¬μμ§λ κ²λ μλλ€. κ·Έλ₯ 곡νν¨μ΄ λ΄ λͺΈμμ νκ³ λ λ€. νμ΄μ μ€κΈ°, κ·Έ μμ λ΄κΈ΄ μ μ νλνλκ° λ΄ λͺΈ μ κΉμ κ³³κΉμ§ νκ³ λ€λ―μ΄, 곡νμ μκ°±μ΄λ€μ κΉμν λ΄ μμΌλ‘ νλͺ°μμΉλ€. λλ κ·Έ λ μμ΄ μ¬ λλ§λ€, 곧 λμ³ νλ₯Ό κ²λ§ κ°μ΄ λΆκΈκ±°λ¦¬λ λλΉλ₯Ό λ μμ΄μ²λΌ μ΄μ© μ€μ λͺ°λΌ νλ€. λ°λ»ν΄μΌλ§ ν κ°μ‘±λ€μ μμμλ¦¬κ° λ§μΉ μΈκ΅¬λ € 골νμ§κ° μ°κ·Έλ¬μ§λ μ리μ²λΌ λκ»΄μ§κ³ , μ¬λνλ μ¬λκ³Ό ν¨κ»ν μκ°μ, λ§μΉ λμ¬κΈ°κ°μ΄ μ ν΄μ§ μκΏλμ΄μ²λΌ λκ»΄μ§κ² λ§λλ λΆμΉλ³. μ§λ ν λ³μ μ‘°κΈμ΄λΌλ λ¬λκΈ° μν΄, νμλ μ€λλ μ°μΈμ μκ°μ λΉλ €μ°λ € ν΄λν°μ λ€μ΄ λ°μ λͺ©μ리λ₯Ό κΎΈλ©°λΈλ€.
inline κ³Ό FORCEINLINE μ μ°¨μ΄ μ¬μ€ μ΄ λμ μ°¨μ΄λ μ΄λ―Έ λ¨μ΄μμ μ½κ² νμ ν μ μλ€. μΌλ¨ ν¨μμ μΈλΌμΈνλΌλ κ²μ, μ»΄νμΌλ¬κ° ν¨μ λ°λλ₯Ό μ»΄νμΌ νμμ λΆμ¬ λ£μ΄ ν¨μ νΈμΆμ μ€λ²ν€λλ₯Ό μ€μ΄λ μ΅μ ν λ°©μμ΄λΌκ³ λ³Ό μ μλ€. C++ μμ inline μ μ»΄νμΌλ¬μκ² ν¨μλ₯Ό μΈλΌμΈνν κ²μ 'μμ²' νλ€. μ΄λ 'λͺ λ Ή' μ΄λ 'κ°μ 'κ° μλλ€. 볡μ‘ν ν¨μλ κ°μν¨μλ μ»΄νμΌλ¬κ° μΈλΌμΈν ν΄μ£Όμ§ μμΌλ©°, inline ν€μλλ₯Ό μ°μ§ μλλΌλ μκ³ κ°λ¨ν ν¨μμ κ²½μ° μ»΄νμΌλ¬κ° μμμ μΈλΌμΈνλ₯Ό ν΄ μ£ΌκΈ°λ νλ€. λ°λ©΄ FORCEINLINE μ λ§ κ·Έλλ‘ κ°μ μ μΌλ‘ μΈλΌμΈνλ₯Ό μν¨λ€. μμ±μμ μλ©Έμ λ±, μΈλΌμΈν μν€κΈ°μ μ ν©νμ§ μμν¨μλ€μ΄ μκ°λ³΄λ€ λ§μ΄ μ‘΄μ¬νλ―λ‘, FORCEINLI..
C++ μ λν΄ κ³΅λΆν κ²κ³Ό, κ°λ°νλ©΄μ μκ² λ κ²λ€μ λ€λ£Ήλλ€ RTTI RTTI λ κ°λ¨ν λ§ν΄, μ€μκ° νμ μ 보λΌλ λ»μ΄λ€. RTTI λΌλ λ¨μ΄λ₯Ό νμμλ μ λ€μ΄λ³Ό μΌμ΄ μλ€κ°, dynamic_cast λ₯Ό μ¬μ©νκΈ° μν΄ λΉμ£ΌμΌ μ€νλμ€ μ΅μ μ λ€μ μ΄λ μ€ ν΄λΉ νλͺ©μ λ°κ²¬νλ€. μλ€μνΌ, C++ λ 리νλ μ κΈ°λ₯μ μ 곡νμ§ μλλ€. C# μμλ 리νλ μ μ μ 곡νλλ°, ν΄λΉ κΈ°λ₯μ λ°νμμμ ν΄λμ€ νμ , λ©μλ, νλ‘νΌν° λ±μ λ©ν μ 보λ₯Ό μ κ³΅ν΄ μ€λ€. λΉμ£ΌμΌ μ€νλμ€μμλ ν΄λΉ κΈ°λ₯μ λκ³ ν¬ μ μκ² λ§λ€μ΄ λμλ€. κ°λ¨ν λ§ν΄, ν΄λΉ κΈ°λ₯μ ν€κ² λλ©΄ λ°νμμμ νμ μ λν μ 보λ₯Ό μ»μ μ μλ€. RTTI λ κ°μ ν¨μκ° μλ ν΄λμ€μ λν΄μλ§ λμνλ©°, μ΄λ ν΄λμ€μ νμ κ΄λ ¨ μ λ³΄κ° v..