목록Game Dev/Unreal C++ : Dev Log (48)
KoreanFoodie's Study
[언리얼] 어떤 개념 : 어떻게 하기 핵심 : 1. UObject 라면, UWorld::GetRealTimeSeconds() 함수를 사용할 수 있다. 2. C++ 클래스라면, FDateTime::Now() 를 쓸 수도 있다. 3. milisecond 를 원한다면 FDateTime::UtcNow() 를 쓰자. 1. UObject 일 경우 UWorld* World = GetWorld(); float PrevSeconds; float ElapsedSeconds; if (World) { ElapsedSeconds = MyWorld->GetRealTimeSeconds() - PrevSeconds; PrevSeconds = MyWorld->GetRealTimeSeconds(); UE_LOG(LogTemp, Warn..
언리얼 UI 최적화 핵심 : 1. UI 최적화를 위해서는 먼저 UI 구조와 렌더링 프로세스를 이해해야 한다. 2. UI 최적화의 핵심은 결국 Tick 이다. Tick 을 필요할 때만 호출하게 만들거나, Tick 당 담기는 연산의 크기를 줄여야 한다. 전자는 게임쓰레드와, 후자는 렌더링 쓰레드와 연관이 깊다. 3. 게임 쓰레드 최적화에는 Invalidation Box, Visibility, Widget Binding 등이 있고, 렌더링 쓰레드 최적화에는 Merging Batches, Retainer Box 등이 있다. 언리얼에서 UMG 를 이용한 UI 작업을 상당히 많이 하는데, 일정에 쫓기다 보니 프로젝트 차원에서 최적화를 고려하면서 만드는 경우가 잘 없는 것 같다는 생각이 들었다. 또한 최적화를 한다고..
[언리얼] 다음 틱에 특정 동작 수행시키기 핵심 : 1. SetTimerForNextTick 을 사용한다 때로는 영 좋지 못한 이유로, 특정 동작을 다음 틱에 실행시켜야 하는 상황이 존재한다. 그럴때는, 아래 함수를 사용하면 된다. 언리얼 글 중 제일 짧은 글인 듯 하다. 😅
보호되어 있는 글입니다.
보호되어 있는 글입니다.
[언리얼] UI 에서 애니메이션의 이벤트가 끝났음을 알려주는 방법 핵심 : 1. UI 에 삽입된 애니메이션에서 이벤트를 추가하고, 그래프에서 이벤트가 발생했을 때 호출할 함수를 C++ 에서 검색해서 연결해 주면 된다. 가끔 그런 경우가 있다. 코드로 풀어야 하는 동작과 연출을 함께 사용해야 할때, 특정 동작을 연출이 끝나는 타이밍에 의존해야 하는 경우가. 대표적으로 애니메이션이 있는데, 애니메이션이 완전히 끝나거나, 특정 시점에 왔을 때 코드에서 특정 동작을 수행하도록 만들어야 하는 케이스가 왕왕 생기곤 한다. 보통 스킬 쪽 구현을 하다보면, Notify 같은 걸 만들어서 이를 해결하기도 하지만.. UI 의 경우에는, 이벤트 트리거를 통해 이를 해결할 수 있다. 이제 예시를 보자. 일단 원하는 UI 를 ..
[언리얼] 스크롤박스에서 왼쪽 클릭으로 드래그하기 핵심 : 1. UScrollBox 에서는 기본적으로는 오른쪽 클릭을 통해 잡아끌기(마우스 클릭으로 드래그) 가 가능하다. 2. 좌클릭으로 드래그를 활성화 하려면, 하위 위젯에 버튼을 넣고, 버튼에서 Click Method / Touch Method 설정을 각각 Precise Click, Precise Tap 으로 바꾸어 주면 된다. 3. 자세한 것은 영상 참조. UScrollBox 에서 좌클릭으로 스크롤을 하고 싶으면, UScrollBox 아래에 버튼을 만들고, 버튼의 속성을 위와 같이 변경해 주면 된다. 참고로, Horizontal 하게 아이템을 담을 때는 WrapBox 를, Vertical 하게 아이템을 담을 때는 VerticalBox 를 UScrol..
[언리얼] UnrealVS 로 메모리 이슈 예방하기 (-stompMalloc) 핵심 : 1. Stomp Allocator 로 잠재적인 메모리 이슈를 잡아낼 수 있다. 2. 바인딩을 꼬리물기처럼 만들면 안된다(상위 > 중위 > 하위 위젯 순으로 열리는 경우, 같은 타입의 델리게이트가 바인딩되면 안됨) 3. stompmalloc 은 실제 가상 메모리 대신 물리 메모리 주소에 할당/해제 작업을 직접적으로 하도록 도와준다. 게임을 다 만들고 나서 실행을 했는데, 자꾸 크래시가 나서 게임이 꺼져버리면 매우 허망할 것이다. 특히 메모리 이슈의 경우, 정확히 어디서 메모리가 오염되었는지 개발 단계에서는 파악하기가 매우 어렵고 테스트 비용이 큰 편이다. 메모리 이슈를 디버깅하기 위한 좋은 방법이 하나 있는데, 바로 U..
언리얼에서 TMap 에 Compare Functor 지정하기 핵심 : 1. C++ 에서는 Functor class 를 넣어 주기만 하면 된다. 2. TMap 에서는 TMap 자체가 그냥 unordered_map 이라 그런 건 없다. 만약 Predicate 를 지정하고 싶으면, TSortedMap 을 사용하자! 3. TMap 을 정렬할 때는 Sort 를 사용하자... 후... C++ 에서는 TMap 에서 Key 값을 이용한 정렬을 역순으로 하고 싶을 때, std::less 나 std::greater 같은 predicate 클래스를 사용했다. 혹은 아래와 같이 Functor class 를 만들어 3번째 인자에 넣어 주기만 하면 되었는데... #include #include #include class MyCo..
언리얼 에러 : Missing '*' in Expected a pointer type 핵심 : 1. UFUNCTION 함수의 인자로, UStruct 타입이 있는데 포인터 형식이 아닐 경우 2. 추후 추가 3. 추후 추가 언리얼 에러 로그 중 아래와 같은 내용이 뜰 때가 있다 : Missing '*' in Expected a pointer type 위와 같은 에러의 경우, 정확히 뭘 고치라는지 몰라 헤멜때가 있다. 그럴 때는 아래와 같은 상황을 체크해 보자! 1. UFUNCTION 함수의 인자로, UStruct 타입이 있는데 포인터 형식이 아닐 경우 다음과 같은 예제를 보자 : UFUNCTION() void OnSomeEvent(UObject* InObject, UUserWidget& InWidget); ..