๋ชฉ๋ก์ ์ฒด ๊ธ (1107)
KoreanFoodie's Study
๋์ ์ผ๋ก ์ปดํฌํดํธ ์์ฑํ๊ธฐ (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 ์ ๊ธ๋ก๋ฒ ํ์ด๋จธ ๋งค๋์ ์์ ์ฌ์ฉํ๋ฉฐ..
์ด ๋ณ์ ์๊ณ ๋ ์์ด ์ฐพ์์จ๋ค. ํ ๋ฒ ์๋ค๊ณ ํด์ ๋ค์ ์ฐพ์์ค์ง ์๋ ๊ฒ๋ ์๋๋ฉฐ, ์ด๋ฏธ ๊ฒช์ด ๋ณด์๋ค๊ณ ํด์ ๋ ๊ฒฌ๋๊ธฐ ์ฌ์์ง๋ ๊ฒ๋ ์๋๋ค. ๊ทธ๋ฅ ๊ณตํํจ์ด ๋ด ๋ชธ์์ ํ๊ณ ๋ ๋ค. ํ์ด์ ์ค๊ธฐ, ๊ทธ ์์ ๋ด๊ธด ์ ์ ํ๋ํ๋๊ฐ ๋ด ๋ชธ ์ ๊น์ ๊ณณ๊น์ง ํ๊ณ ๋ค๋ฏ์ด, ๊ณตํ์ ์๊ฐฑ์ด๋ค์ ๊น์ํ ๋ด ์์ผ๋ก ํ๋ชฐ์์น๋ค. ๋๋ ๊ทธ ๋ ์์ด ์ฌ ๋๋ง๋ค, ๊ณง ๋์ณ ํ๋ฅผ ๊ฒ๋ง ๊ฐ์ด ๋ถ๊ธ๊ฑฐ๋ฆฌ๋ ๋๋น๋ฅผ ๋ ์์ด์ฒ๋ผ ์ด์ฉ ์ค์ ๋ชฐ๋ผ ํ๋ค. ๋ฐ๋ปํด์ผ๋ง ํ ๊ฐ์กฑ๋ค์ ์์์๋ฆฌ๊ฐ ๋ง์น ์ธ๊ตฌ๋ ค ๊ณจํ์ง๊ฐ ์ฐ๊ทธ๋ฌ์ง๋ ์๋ฆฌ์ฒ๋ผ ๋๊ปด์ง๊ณ , ์ฌ๋ํ๋ ์ฌ๋๊ณผ ํจ๊ปํ ์๊ฐ์, ๋ง์น ๋์ฌ๊ธฐ๊ฐ์ด ์ ํด์ง ์๊ฟ๋์ด์ฒ๋ผ ๋๊ปด์ง๊ฒ ๋ง๋๋ ๋ถ์น๋ณ. ์ง๋ ํ ๋ณ์ ์กฐ๊ธ์ด๋ผ๋ ๋ฌ๋๊ธฐ ์ํด, ํ์๋ ์ค๋๋ ์ฐ์ธ์ ์๊ฐ์ ๋น๋ ค์ฐ๋ ค ํด๋ํฐ์ ๋ค์ด ๋ฐ์ ๋ชฉ์๋ฆฌ๋ฅผ ๊พธ๋ฉฐ๋ธ๋ค.
inline ๊ณผ FORCEINLINE ์ ์ฐจ์ด ์ฌ์ค ์ด ๋์ ์ฐจ์ด๋ ์ด๋ฏธ ๋จ์ด์์ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค. ์ผ๋จ ํจ์์ ์ธ๋ผ์ธํ๋ผ๋ ๊ฒ์, ์ปดํ์ผ๋ฌ๊ฐ ํจ์ ๋ฐ๋๋ฅผ ์ปดํ์ผ ํ์์ ๋ถ์ฌ ๋ฃ์ด ํจ์ ํธ์ถ์ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ์ต์ ํ ๋ฐฉ์์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. C++ ์์ inline ์ ์ปดํ์ผ๋ฌ์๊ฒ ํจ์๋ฅผ ์ธ๋ผ์ธํํ ๊ฒ์ '์์ฒญ' ํ๋ค. ์ด๋ '๋ช ๋ น' ์ด๋ '๊ฐ์ '๊ฐ ์๋๋ค. ๋ณต์กํ ํจ์๋ ๊ฐ์ํจ์๋ ์ปดํ์ผ๋ฌ๊ฐ ์ธ๋ผ์ธํ ํด์ฃผ์ง ์์ผ๋ฉฐ, inline ํค์๋๋ฅผ ์ฐ์ง ์๋๋ผ๋ ์๊ณ ๊ฐ๋จํ ํจ์์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ธ๋ผ์ธํ๋ฅผ ํด ์ฃผ๊ธฐ๋ ํ๋ค. ๋ฐ๋ฉด FORCEINLINE ์ ๋ง ๊ทธ๋๋ก ๊ฐ์ ์ ์ผ๋ก ์ธ๋ผ์ธํ๋ฅผ ์ํจ๋ค. ์์ฑ์์ ์๋ฉธ์ ๋ฑ, ์ธ๋ผ์ธํ ์ํค๊ธฐ์ ์ ํฉํ์ง ์์ํจ์๋ค์ด ์๊ฐ๋ณด๋ค ๋ง์ด ์กด์ฌํ๋ฏ๋ก, FORCEINLI..