๋ชฉ๋ก์ ์ฒด ๊ธ (1103)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ILK8w/btrx6Zvewmo/aHkowhDskykoWT8JgUVyQ0/img.png)
์๋ฆฌ์ผ๋ผ์ด์ ์ด์ ์๋ฆฌ์ผ๋ผ์ด์ ์ด์ ์ด๋ผ๋ ๊ฐ๋ ์, ํ ๋ ํฌํธ์ ๊ฐ๋ค๊ณ ์ดํดํ๋ฉด ์ฝ๋ค. ํ ๋ ํฌํธ๋ก ์ฌ๋์ ์ ์กํ๋ค๊ณ ํ์ ๋, ์ ์์ ์ผ๋ก ์๋ํ๋ ํ ๋ ํฌํฐ๋ ์ฌ๋ ์ ์ฒด๋ฅผ ์จ์ ํ ์ฃผ๊ณ ๋ฐ๋ ํํ์ผ ๊ฒ์ด๋ค. ์ฆ, ์ ๋ฐ๋ง ๋ณด๋ธ๋ค๊ฑฐ๋, ๋๋ ์ ๋ณด๋ด์ง ์๋๋ค๋ ๋ป์ด๋ค. (๋๋ ์ ๋ณด๋ด๋ฉด... ๊ทธ๊ฑด ํ ๋ ํฌํฐ๊ฐ ์๋๋ผ ์ด์๋ฌด๊ธฐ๊ฐ ์๋๊น) ์๋ฆฌ์ผ๋ผ์ด์ ์ด์ ์ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ํ๋ฒ์ ์์ ํ๊ฒ ์ ๋ฌํ๊ธฐ ์ํด FArchive ํด๋์ค๋ฅผ ๋ง๋ค์ด ํ์ผ, ๋ฉ๋ชจ๋ฆฌ ๋ฑ๋ฑ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ชจ๋ ๋งค์ฒด๋ฅผ ๊ด๋ฆฌํ๊ณ ์๋ค. ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ชจ๋ ๋งค์ฒด๋ FArchive ํด๋์ค๋ฅผ ์์๋ฐ์์ ๊ตฌํํ๋ค. FArchive ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ํ์ผ์ ๋ง๋ค๊ณ ์ฐ๊ธฐ/์ฝ๊ธฐ๋ฅผ ๊ตฌํํ ์์ ์ฝ๋๋ฅผ ๋ณด์. FString FullPath = FString::Printf(..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/3xwUa/btrx6MubvY2/rL6vh80tQCSAZP1MjPCKCk/img.png)
๋ธ๋ฆฌ๊ฒ์ดํธ C# ์์๋ ๋ฐํ์-๊ตฌ๋ ์(Publisher-Subscriber) ํจํด์ ๊ตฌํ์ด ๊ฐ๋ฅํด, ํน์ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ ๊ฐ์ฒด๋ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐํ๋์์ ๋ ์ํ๋ ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋๋ก ๋ง๋ค ์ ์๋ค. ์ด๋, ์์ ์ด์ผ๊ธฐํ ํน์ ์ด๋ฒคํธ๋ฅผ ๋ค๋ฅธ ๋ง๋ก "๋ธ๋ฆฌ๊ฒ์ดํธ"๋ผ๊ณ ํ๋ค. C++ ์์๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ์์คํ ์ด ์์ง๋ง, ์ธ๋ฆฌ์ผ์ ์์ฒด์ ์ผ๋ก ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๊ธฐ์กด์ ํจ์ ํฌ์ธํฐ ๋ฑ์ ์ด์ฉํ๋ ๊ฒ๋ณด๋ค ๊ฐํธํ๋ฉฐ ์์ ํ๋ค. ๋๋ฆฌ์๋ฅผ ํตํด ํจ์๋ฅผ ํธ์ถํ๋ฏ๋ก ํธ์ถํ ํจ์๋ ์ด๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๊ฐ ์์ด์ ธ๋ ๋๋ฆฌ์๊ฐ ์ฒดํฌํด ์์ ํ๊ฒ ํจ์๋ฅผ ํธ์ถํ ์ ์์ผ๋ฉฐ, ๋์ผํ ํ์ ๊ฐ์ง ํจ์ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋๋ฆฌ์๊ฐ ๋ฌถ์ด์ ๊ด๋ฆฌํ๊ณ ํ์ํ ๋ ๋์์ ๋ชจ๋ ํธ์ถํ ์๋ ์๋ค. ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/u3X0d/btrx5AN86mJ/Gb6VnefGqC6hNIXridnFik/img.png)
ํ๋ ๋ ํผ๋ฐ์ฑ vs ์ํํธ ๋ ํผ๋ฐ์ฑ CDO ์์ฑ์, ์์ฑ์์์ ์ ์ ์ ์ ๋ฌด๋ฅผ ํ์ธํ๊ธฐ ์ํด ConstructorHelpers ํจ์๋ฅผ ํธ์ถํด ์ ์ ์ ๋ก๋ํ๋ค. ํ์ง๋ง ๊ฒ์ ์์ ์ ์ ๋ฐ๋์ ์กด์ฌํ๋์ง ์ฒดํฌํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์๋๋ฐ, ์ ์์ ๊ฒฝ์ฐ๋ฅผ ํ๋ ๋ ํผ๋ฐ์ฑ(Hard Referencing), ํ์๋ฅผ ์ํํธ ๋ ํผ๋ฐ์ฑ(Soft Referencing) ์ด๋ผ๊ณ ํ๋ค. ์ํํธ ๋ ํผ๋ฐ์ฑ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋์๋ FStringAssetReference ๊ตฌ์กฐ์ฒด๋ฅผ, ์ ์ ์ ํด๋์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋์๋ FStringClassReference ๊ตฌ์กฐ์ฒด์ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค. ์ฌ๋ฌ ์ ์ ์ ๊ฐ์ ธ์ฌ ๋๋ TArray ํ์์ ์ฌ์ฉํ๋ฉด ๋๋ค. ABPawn.h (๋ก๋ฉํ ์ ์ ์ ์ค์ ์ฌ์ฉํ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ccu9gq/btrx1xdw9r4/K8mpPFswe1BEAXUIljF8ik/img.png)
์ธ๋ฆฌ์ผ INI ํ์ผ ์ค์ ๋ง์ฝ ์บ๋ฆญํฐ์ HP ๋ฅผ ํธ์งํ๊ณ ์ถ์๋ฐ, HP ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๋งค๋ฒ ์บ๋ฆญํฐ๋ฅผ ์๋ํฐ์์ ์์ ํด์ผ ํ๋ค๋ฉด ๋งค์ฐ ๋นํจ์จ์ ์ผ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด, ์ธ๋ฆฌ์ผ์ INI ํ์ผ์ ์ด์ฉํด ๋ธ๋ฃจํ๋ฆฐํธ๋ ๋ณ๋์ ์๋ํฐ ์์ ์ด ์์ด๋ ์์ฑ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค. (์๋ INI ํ์ผ์ ์๋์ฐ์์ ์์คํ ๊ตฌ์ฑ ์์์ ์ค์ ์ ์ํด ๋ง๋ค์ด์ง ํ์ผ ํ์์ด๋ค) INI ํ์ผ์ ํ์์ ์์ฑ๊ณผ ๊ฐ, ๊ทธ๋ฆฌ๊ณ ์ด ๋ ๊ฐ์ง๋ฅผ ํฌ๊ดํ๋ ์น์ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์น์ : ํ์ฌ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ C++ ํด๋์ค ์๋ณ์ ์์ฑ : C++ ํด๋์ค์์ INI ๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ ํ UPROPERTY ๋ฉค๋ฒ ๋ณ์ ๊ฐ : ์์ฑ์ ์ง์ ํ ๊ฐ C++ ํด๋์ค ์๋ณ์๋ ๊ณ ์ ํ ์๋ณ์๋ก ๊ตฌ๋ถ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ํ์์ ๊ฐ์ง๋ค. {..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Phpbs/btrx4RXmkGU/rDjjGsmwsQ8K3KdzzVKrck/img.jpg)
..์ ํ๋ค๋ค. ์ด์ ๋ ์ฌ๋ฌ๊ฐ์ง ์๊ฒ ์ง๋ง, ์ญ์ ์๊ฐ์ด ๋ถ์กฑํ๋ค๋๊ฒ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ค. ์ฌํ์ ํ๋ค๋ฉด ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ง๊ธ๊ฐ์ ์ํฉ์์๋.. ํ์ผ์๋ ์ค์ ๊ฐ๋ฐ์ 1-2 ์๊ฐ์ด๋ ํฌ์ ํ ์ ์๋ ์ถ๋ค. ์ฃผ๋ง์ ์ ํ์ฉํ๋ค๊ณ ํ๋ค ์ ๋์ ์ผ๋ก ์๊ฐ์ด ๋ถ์กฑํ๋ค. ๊ธฐํ์ ๊ณ์ ๋ฐ๋๋ค. ๊ฐ๋ฐ์ ๋ฌด์จ ์ง์ฒ์ด ์๋๊ฒ๋ ์๋๋ฐ ๋ง์๋ง ๋์ด๊ฐ๋ ๋๋์ด๋ค. ์ ํ์ ์๊ฐ์ด ์ ์ ๋ค๊ฐ์ค๋ ๊ฒ ๊ฐ๋ค. ๋๋ ต๊ธฐ๋ ํ๊ณ ๋จ๋ฆฌ๊ธฐ๋ ํ์ง๋ง, ๋๋ ต์ง ์๋ค๋ฉด ๊ทธ๊ฑด ๋์ ์ด ์๋๋ผ๋ ๊ฒ์ ์๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ์ ์ธ์ ๋ ๋ด ์์์ ๋ฐ์ด๋๋ ๊ฐ์น๊ฐ ์์๋ค๋ ๊ฒ๋ ์ ์๊ณ ์๋ค. ๋ฐ์ผํ๋ก ํญํ์ ์ผ.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/vPbs6/btrxVHPqhbd/XTKbKfVhm20wG7bX2kAQr0/img.png)
์ธ๋ฆฌ์ผ ์กํฐ ์์ฑ ์์ ์ฐธ๊ณ ๋ก ์กํฐ ์์ฑ์์๋ ConstructorHelpers ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค. AWeapon::AWeapon() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; Weapon = CreateDefaultSubobject(TEXT("WeaponHashValue")); RootComponent = Weapon; static ConstructorHelpers::FObjectFinder SK_BlackKnight(TEXT("SkeletalMesh'/Game/Infinit..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bOjLDi/btrxXpm7eaX/Z4Ehir1mTLJuU9fa3Cosok/img.png)
์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ ์์ฑ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก NewObject( ) ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฒ์๋ ABGameInstance ์์ WebConnection ์ด๋ผ๋ DefaultSubobject ๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ABGameInstance ์์๋ GetDefaultSubobject ๋ฅผ ํธ์ถํด WebConnection ์ ์กฐํํ๊ณ , WebConnection ์์๋ GetOuter ๋ฅผ ํธ์ถํด ABGameInstance ๋ฅผ ์กฐํํ ์ ์๋ค. NewObject vs CreateDefaultSubobject ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๊ฒ์ ์จ์ผ ํ ๊น? ๋ ๊ฐ์ง ๋ชจ๋ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ๊ฐ์ผ๋, ์์ฑ ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค. ๋ค์์ ์ฝ๋๋ฅผ ๋ณด์. ... #include "ABGameInsta..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bRy07z/btrx0uHER1b/dq4uGyMqKqKPd7pE5Dtsf0/img.png)
๋ฆฌํ๋ ์ : ๋ฐํ์์ ์๊ธฐ ์์ ์ ์กฐ์ฌํ๊ฒ ๋ง๋ค์ ์ธ๋ฆฌ์ผ์ UHT(Unreal Header Tool) ์ ์ด์ฉํด ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ, ๋ฉค๋ฒ ๋ณ์/ํจ์ ๋ฑ์ ์ ๋ณด๋ฅผ UClass ์ ์ ์ฅํ๋ค. ์ด๋ฅผ ๋ฆฌํ๋ ์ ์ด๋ผ๊ณ ๋ ํ๊ณ , ํ๋กํผํฐ ์์คํ ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ๋ฆฌํ๋ฆฌ์ผ์ด์ ์์คํ ์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ผ๋ก, ๋ฆฌํ๋ ์ ์์คํ ์ ๋ณด์ด๋๋ก ํ์ผ๋ฉด ํ๋ ์ ํ์ด๋ ํ๋กํผํฐ์ ์ฃผ์์ ๋ฌ์๋๋ฉด UHT ๊ฐ ์ปดํ์ผ์ ํด๋น ์ ๋ณด๋ฅผ ์์งํ๊ฒ ๋๋ค. ํ๋กํผํฐ ์์คํ ๊ณ์ธต ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค. (UField ์๋์ UStruct, UEnum, UProperty ๊ฐ ์์) ์ค์ ์์ ์ฝ๋๋ฅผ ๋ณด์. #include "MyObject.generated.h" UCLASS(Blueprintable) class UMyObject : public UObject ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dnQVXg/btrxUPNctci/Cjh1KMG5Pb9igQh5SyKGYK/img.png)
CDO ๋ ๋ฌด์์ด๊ณ , ๋ ์ ์ฌ์ฉํ ๊น ์ธ๋ฆฌ์ผ์์๋ ๋ฐํ์์ ๋น ๋ฅธ ํ์ ์ฒดํน๊ณผ ํด๋์ค ๊ฒ์์ ์ํด, ์ปดํ์ผ ํ์์์ ํด๋์ค์ ํ์ ๋ฑ์ ๋ฉํ ์ ๋ณด๋ฅผ ์์ฑํ๋ค. ์ด๋ฌํ ๋ฉํ ์ ๋ณด๋ UClass ๋ผ๋ ์ธ๋ฆฌ์ผ ํด๋์ค์ ๋ณด๊ด๋๋ค. UClass ์๋ ํด๋์ค์ ๊ณ์ธต ๊ตฌ์กฐ๋ ๋ฉค๋ฒ ๋ณ์/ํจ์์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์๋ค. ์ด๋ฌํ UClass ๋ฅผ ์ด์ฉํ๋ฉด, ๋จ์ํ ํ์ ์ ๊ฒ์ํ๋ ๊ฒ์ ๋์ด ๋ฐํ์์์ ์ธ์คํด์ค์ ๋ฉค๋ฒ ๋ณ์ ๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ฉค๋ฒ ํจ์๋ฅผ ํธ์ถํ ์๋ ์๋ค. (Java, C# ์์๋ ์ด๋ฐ ๊ธฐ๋ฅ์ ๋ฆฌํ๋ ์ [Reflection] ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค) ๋ฐํ์ ๊ณผ์ ์์๋ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ฅผ ์ด๊ธฐํํด์ผ ํ๋๋ฐ, ์ด๋ ์์ฑ๋๋ ์ธ์คํด์ค๊ฐ CDO(Class Default Object), ํด๋์ค ๊ธฐ๋ณธ ๊ฐ์ฒด์ด๋ค. ์ธ๋ฆฌ์ผ์ CDO ๋ฅผ ๋ฏธ๋ฆฌ ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bLYNay/btrxWCGPDFa/bK7flCsJSQGkOjsZSu7wEK/img.png)
์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ ์ธ๋ฆฌ์ผ ์์ง์ ๊ด๋ฆฌ๋ฅผ ๋ฐ๋ ๊ฐ์ฒด์ด๋ค. ์ธ๋ฆฌ์ผ์ด ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ ์ด์ ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ๋จผ์ ํด๋์ค์ ํ์ ์ฒดํน์ ๋น ๋ฅด๊ณ ๊ฐํธํ๊ฒ ํ ์ ์๋ค๋ ๊ฒ, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์๋์ผ๋ก ํด ์ฃผ๋ ๊ฒ ๋ฑ์ด ์๊ฒ ๋ค. ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ U ๋ก ์์ํ๊ณ , ์ผ๋ฐ C++ ์ค๋ธ์ ํธ๋ F ๋ก ์์ํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค. ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ์ ์ ์ฒด ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค : CDO(Class Default Object) : ๊ฐ์ฒด์ ์ด๊ธฐ ๊ฐ์ ์์ฒด์ ์ผ๋ก ๊ด๋ฆฌ Reflection : ๊ฐ์ฒด ์ ๋ณด๋ฅผ ๋ฐํ์์์ ์ค์๊ฐ ์กฐํ๊ฐ ๊ฐ๋ฅ GC(Garbage Collection) : ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ ํด์ ํ ์ ์์ Serialization : ๊ฐ์ฒด์ ์์ฑ ์ ๋ณด๋ฅผ ํต์ผ๋ก ์์ ํ๊ฒ ๋ณด๊ดํ๊ณ ..