목록Game Dev (263)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/QvG6e/btrzPgOCELk/CThkS2AhxeDp59KxRUzOFK/img.png)
화면에 출력하는 로깅시스템 콘솔에 출력했던 것과 비슷하게, 이번에는 UE_LOG 가 아닌 AddOnScreenDebugMessage 함수를 활용해 화면에 값을 출력해보자. 출처는 여기! CLog.h class UE_PROJECT_NAME_API CLog { public: static void Print(int32 InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(float InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(const FString& I..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bTV5ok/btrzMvL285M/WchF8cOoNOgneXGhrLQkk0/img.png)
언리얼 로그 언리얼은 UE_LOG 함수를 이용하여 로그를 출력한다. 먼저, .h 파일에 카테고리를 선언하고, 그에 맞는 정의를 .cpp 파일에서 Define 해주면 된다. MyGame.h //General Log DECLARE_LOG_CATEGORY_EXTERN(LogMyGame, Log, All); //Logging during game startup DECLARE_LOG_CATEGORY_EXTERN(LogMyGameInit, Log, All); MyGame.cpp #include "MyGame.h" //General Log DEFINE_LOG_CATEGORY(LogMyGame); //Logging during game startup DEFINE_LOG_CATEGORY(LogMyGameInit); 헤더..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/q4Gyz/btrzgie5jc2/CoIPQxC1UX0N3w2LvdaEGK/img.png)
TArray TArray 는 std::vector 와 비슷하게 동작하지만, AddUnique, RemoveAtSwap 등의 부가적인 API 를 제공한다. TArray 는 빠르고, 메모리를 효율적으로 사용하며, 안전하다! TArray ActorArray = GetActorArrayFromSomewhere(); // Tells how many elements (AActors) are currently stored in ActorArray. int32 ArraySize = ActorArray.Num(); // TArrays are 0-based (the first element will be at index 0) int32 Index = 0; // Attempts to retrieve an element at..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ckCUki/btrzhp5MsRX/i3cFshEs2PBUcFOQ4PtV0K/img.png)
언리얼 게임플레이의 4대 main class type 언리얼에는 게임플레이에 사용되는 4대 main class type 이 있다. 바로 UObject, AActor, AActorComponent, UStruct 이다. 이 외에도 사용자 정의 타입을 사용할수는 있지만, 그런 타입들은 엔진에 내장된 기능을 사용하지는 않는다. 하나씩 그 역할과 범위를 알아보자. Unreal Objects (UObject) UObject 는 언리얼 엔진의 building block 으로써, UClass 와 함께 다음과 같은 서비스들을 제공한다 : Reflection of properties and methods Serialization of properties Garbage Collection Finding a UObject ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cEaRDl/btryygjiLKE/9E43GH3etjU95naJzyTT30/img.png)
애니메이션 레이어 언리얼에서는 애니메이션 간의 자연스러운 전환을 위해 블렌드 스페이스를 사용한다. 그런데 만약 UpperBody 만 총을 드는 모션을 재생하고 싶다고 하자. 블렌드 스페이스를 이용해 특정 부위만 동작을 바꾸는 등의 기능도 구현할 수 있을까? 언리얼에서는 애니메이션 레이어를 활용해 위의 기능을 구현할 수 있다. 방법은 아래와 같다. 1. 먼저 블렌드할 애니메이션을 선택한다. 2. 게임 모드의 Default Pawn Class 를 우리가 사용할 애니메이션이 타깃된 스켈레톤으로 바꿔준다. 3. 애님 몽타주를 생성한다. 4. 애님 몽타주에서 돋보기 클릭 후, 우리가 원하는 슬롯으로 지정한다. 5. 슬롯이 없을 경우 새로 생성한다. 6. 원하는 슬롯을 지정한다. 7. 애님 그래프로 이동한다. 8...
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/mqs7p/btryyeFokOf/Ot5zVy3bnOrKl4oQ4Rty30/img.png)
블렌드 스페이스 만약 속도에 따라 걷는 애니메이션과 뛰는 애니메이션을 재생하고 싶다면 어떻게 할까? 단순히 속도가 낮을 때는 걷는 애니메이션을, 높을 때는 뛰는 애니메이션을 연결하면 될 것 같지만, 속도가 float 값으로 연속적일 때는 속도가 바뀌는 시점에 따라 애니메이션이 급속도로 변하는 것이 부자연스러워 보일 것이다. 애니메이션 동작에서의 자연스러움을 보장하면서, 프로그래머가 특정 변수에 맞게 애니메이션을 설정하는 일 따위의 하드코딩을 줄이기 위해, 언리얼에서는 블렌드 스페이스를 제공하고 있다. 블렌드 스페이스란, 말 그대로 애니메이션들을 주어진 input 값에 맞게 호출하도록 섞어(블렌드) 만든 공간(스페이스) 라고 볼 수 있다. 예시 블렌드 스페이스를 만들면, 왼쪽에서 축의 최댓/최솟값을 결정하..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cBemlz/btryn70vLeH/LwuXgp4cebidlgFKtSFYv1/img.png)
애셋 레지스트리 애셋 레지스트리란 에디터가 로드될 때 로딩되지 않은 애셋들에 대한 정보를 비동기적으로 수집하는 서브시스템이다. 파일이 추가되거나 삭제되는 것을 자동으로 추적하는데, 콘텐츠 브라우저가 애셋 레지스트리의 주 고객이라고 보면 된다. Obtaining a List of Assets 코드상으로 애셋 레지스트리를 통해 원하는 타입의 애셋을 불러올 수 있다. FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); TArray AssetData; const UClass* Class = UStaticMesh::StaticClass(); AssetRegistryModule.Get().GetA..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/oXPeG/btrykzKhaYP/phfybGHQ9Jr77kaFkknuJK/img.png)
Hard Reference vs Soft Reference A 가 B 를 하드 참조(Hard Reference) 하고 있다고 하면, A 가 로딩될때 B 도 로딩된다. 반면 A 가 B 를 약하게 참조(Soft Reference) 한다면, B 애셋의 경로 등을 string 의 형태로 갖고 있다는 뜻이다. 먼저 하드 참조부터 살펴보도록 하자. Direct Property Reference (Hard Reference) UPROPERTY 를 붙여 변수를 선언하면, 해당 변수(혹은 블루프린트)가 로드될 때 이에 대응하는 애셋 또한 로딩된다. 예시 코드를 보자. /** construction start sound stinger */ UPROPERTY(EditDefaultsOnly, Category=Building)..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bmFGcZ/btryevHLq8H/925ABoIbqqHti6nCjvZusK/img.png)
코어 리다이렉트란? 프로젝트를 멋지게 완성했는데, 만약 변수 명이나 애셋 명을 바꿔야 한다면 어떨까? 해당 변수나 애셋을 참조하는 모든 코드를 전부 헤집어 놓는 것은 상당한 낭비를 수반할 것이다. 이를 위해, 언리얼에서는 "기존 이름 -> 새로운 이름" 을 한번에 바꿔주는 기능을 제공하는데, 그것이 바로 '코어 리다이렉트' 이다. 코어 리다이렉트는 DefaultEngine.ini 파일이나, Default.ini 파일 등에 넣어주면 된다. 예시를 보자. [CoreRedirects] +ClassRedirects=(OldName="Pawn",NewName="MyPawn",InstanceOnly=true) +ClassRedirects=(OldName="/Script/MyModule.MyOldClass",NewN..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bTnerL/btryp4auk6i/KfiHcRySzwph4FYdb6d3gK/img.png)
FSoftObjectPath 와 TSoftObjectPtr 사용할 때마다 로드하는 것이 아니라, 애셋을 전부 로딩하지 않으면서 로딩하고 싶은 애셋을 미리 준비시켜 놓고 싶다면 어떨까? 그럴 경우, FSoftObjectPath 와 TSofrObjectPtr 를 이용하면 된다. FSoftObjectPath 는 실제로 애셋의 경로를 FName 으로 저장하고 있는 구조체이며, TSoftObjectPtr 는 FSoftObjectPath 를 wrapping 한 TWeakObjectPtr 이다. TSoftObjectPtr.Get( ) 으로 참조된 애셋을 가져올 수 있으며, FSoftObjectPath 로 애셋을 로딩할 수 있다. The Asset Registry and Object Libraries 애셋 레지스트리는..