๋ชฉ๋ก2023/01 (6)
KoreanFoodie's Study

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 ์ ๊ธ๋ก๋ฒ ํ์ด๋จธ ๋งค๋์ ์์ ์ฌ์ฉํ๋ฉฐ..
์ด ๋ณ์ ์๊ณ ๋ ์์ด ์ฐพ์์จ๋ค. ํ ๋ฒ ์๋ค๊ณ ํด์ ๋ค์ ์ฐพ์์ค์ง ์๋ ๊ฒ๋ ์๋๋ฉฐ, ์ด๋ฏธ ๊ฒช์ด ๋ณด์๋ค๊ณ ํด์ ๋ ๊ฒฌ๋๊ธฐ ์ฌ์์ง๋ ๊ฒ๋ ์๋๋ค. ๊ทธ๋ฅ ๊ณตํํจ์ด ๋ด ๋ชธ์์ ํ๊ณ ๋ ๋ค. ํ์ด์ ์ค๊ธฐ, ๊ทธ ์์ ๋ด๊ธด ์ ์ ํ๋ํ๋๊ฐ ๋ด ๋ชธ ์ ๊น์ ๊ณณ๊น์ง ํ๊ณ ๋ค๋ฏ์ด, ๊ณตํ์ ์๊ฐฑ์ด๋ค์ ๊น์ํ ๋ด ์์ผ๋ก ํ๋ชฐ์์น๋ค. ๋๋ ๊ทธ ๋ ์์ด ์ฌ ๋๋ง๋ค, ๊ณง ๋์ณ ํ๋ฅผ ๊ฒ๋ง ๊ฐ์ด ๋ถ๊ธ๊ฑฐ๋ฆฌ๋ ๋๋น๋ฅผ ๋ ์์ด์ฒ๋ผ ์ด์ฉ ์ค์ ๋ชฐ๋ผ ํ๋ค. ๋ฐ๋ปํด์ผ๋ง ํ ๊ฐ์กฑ๋ค์ ์์์๋ฆฌ๊ฐ ๋ง์น ์ธ๊ตฌ๋ ค ๊ณจํ์ง๊ฐ ์ฐ๊ทธ๋ฌ์ง๋ ์๋ฆฌ์ฒ๋ผ ๋๊ปด์ง๊ณ , ์ฌ๋ํ๋ ์ฌ๋๊ณผ ํจ๊ปํ ์๊ฐ์, ๋ง์น ๋์ฌ๊ธฐ๊ฐ์ด ์ ํด์ง ์๊ฟ๋์ด์ฒ๋ผ ๋๊ปด์ง๊ฒ ๋ง๋๋ ๋ถ์น๋ณ. ์ง๋ ํ ๋ณ์ ์กฐ๊ธ์ด๋ผ๋ ๋ฌ๋๊ธฐ ์ํด, ํ์๋ ์ค๋๋ ์ฐ์ธ์ ์๊ฐ์ ๋น๋ ค์ฐ๋ ค ํด๋ํฐ์ ๋ค์ด ๋ฐ์ ๋ชฉ์๋ฆฌ๋ฅผ ๊พธ๋ฉฐ๋ธ๋ค.