갬장장이
'분류 전체보기' 카테고리의 글 목록 (2 Page)

분류 전체보기

게임 제작/Rovenhell (2023)

Rovenhell(로벤헬) 소개

Rovenhell (로벤헬) 개발 기간: 23년 8월 ~ 11월 개발 목적: 취미 겸 기술 역량 향상 개발 환경: 클라이언트 및 게임 로직 서버: 언리얼 엔진 5 (커스텀 넷코드 제작, 언리얼 Replication 사용 X) 미들웨어: Visual C++, IOCP 개발 언어: C++ 기술 분석: https://gamesmith.tistory.com/272 [Rovenhell] 기술 분석 프로젝트 소개글은 여기서 확인하실 수 있습니다. 본 포스트에서는 로벤헬 프로젝트를 진행하며 제가 기술적으로 고민하고, 해결했던 흔적을 남겨두려고 합니다. 개발 과정에서 어떤 어려움이 gamesmith.tistory.com 소스 코드: https://github.com/hagukin/Rovenhell_UE GitHub -..

game engines/Unreal Engine

[UE5] 블루프린트에서 RootComponent가 제대로 설정되지 않을 때

https://forums.unrealengine.com/t/setting-root-component-to-primitive-component-doesnt-work/507801 Setting root component to primitive component doesn't work? If I have a C++ actor like: UCLASS() class MYMOD_API AMyActor : public AActor { GENERATED_BODY() public: AMyActor(); public: UPROPERTY(VisibleAnywhere, Category = "Components") USceneComponent* SceneRootComponent = nullptr; }; AMyActor::AM..

lang/c++

가상 소멸자

1) Animal 클래스와 Cat 클래스가 존재한다. Cat 클래스를 Animal 클래스 포인터로 가리킨 상태에서 (Upcasting) 그대로 삭제하게 되면 ~Animal만 호출되고 ~Cat은 호출되지 않아 Cat의 내용물이 모두 해제되지 않는 메모리 릭이 발생할 수 있다. 2) 이를 해결하기 위해서는 Animal 클래스의 소멸자를 virtual로 선언해주면 된다. 3) 하지만 모든 클래스의 소멸자에 무조건 virtual을 붙여주는 것은 좋지 않다. 이유는 virtual을 붙이는 순간 해당 객체는 vtable을 가리키는 vptr을 내부적으로 가지게 되고, 이는 즉 다시 말해 객체의 크기가 커지는 것을 의미한다. 해당 객체의 개수와 빌드 아키텍처에 따라 고작 virtual 하나를 붙였을 뿐인데 불필요한 메..

lang/c++

템플릿 사용 시 LNK1120 "확인할 수 없는 외부 참조" 발생

분명 필요한 헤더 파일을 전부 include 했지만 계속 해당 오류가 발생하는 경우가 있다. 원인: 템플릿을 .h와 .cpp로 분리해서 작성할 경우 발생하는 에러이다. 해결 방법: 1) 템플릿을 애초에 .cpp로 분리하지 않고 .h에 구현부까지 작성한다 2) 혹은 cpp 구현부 하단부에 가능한 템플릿 목록을 미리 선언해 놓는다 3) 혹은 .cpp를 같이 include 한다 참고: https://ansohxxn.github.io/cpp/chapter13-2/

game engines/Unreal Engine

[UE5] FRunnable, FRunnableThread 사용 시 참고

언리얼 5.2.1 기준으로 작성되었습니다 1. FRunnable의 가상함수들은 직접 호출할 필요가 없다. FRunnableThread의 여러 함수들이 스레드와 연결되어있는 FRunnable의 가상함수를 내부적으로 호출해 사용한다. 때문에 코드 작성 시에는 FRunnableThread로 스레드 동작의 흐름을 제어하며, FRunnable 가상함수를 직접 호출할 일은 거의 없다. 2. FRunnable::Init()의 override가 false를 반환하고 있지는 않은지 확인해야 한다. VS에서 자동으로 정의를 만드는 기능을 사용해 함수 구현부를 자동 생성하면 항상 false를 반환하도록 구현하기 때문에 주의가 필요하다. 3. FRunnableThread::Kill()을 사용할 때는 조심해야 한다. 이 함수는..

game engines/Unreal Engine

[UE5] Standalone Playmode에서 빌드가 업데이트가 안되는 경우

빌드를 하고 나서 뷰포트 Playmode에서는 정상적으로 최신 빌드가 플레이 되지만 Standalone playmode에서는 플레이 되는 경우가 있다. 원인은 Live Coding과 관련된 이슈로 추정되며, Live Coding을 끄고 다시 한 번 빌드를 하고 실행하면 Standalone playmode에서도 제대로 최신 빌드가 실행되는 것을 볼 수 있다.

game engines/Unreal Engine

[UE5] exception_access_violation writing address 0x0000000000000000

결론부터 말하면, 어디선가 Null포인터에 접근하고 있을 가능성이 크다. NULL Check를 코드 전체에서 제대로 하고 있는지 확인하자. 크래시 발생 시 출력되는 로그를 살펴보면 대략적인 에러 지점을 알 수 있는데, 정확한 에러지점이 아닌 경우가 있어 해당 포인트 이전 실행과정들을 거슬러 올라가며 살펴봐야 한다.

game engines/Unreal Engine

[UE5] 윈도우 라이브러리를 사용하며 발생하는 문제들

윈도우 계열의 일부 라이브러리를 사용할 경우, 언리얼에서 정의된 값들 간의 이름 충돌 방지를 위해 헤더 추가지점과 외부 헤더에 정의된 값을 사용하는 코드의 앞뒤를 특수한 헤더로 감싸주어야 한다. 그렇지 않을 경우 링커 관련 에러가 발생할 수 있다.// Socket.h #include // (코드) // 에러 발생// Socket.h #include "Windows/AllowWindowsPlatformTypes.h" #include "Windows/prewindowsapi.h" #include // (코드) #include "Windows/PostWindowsApi.h" #include "Windows/HideWindowsPlatformTypes.h" 또 AllowWindowsPlatformTypes.h는..