protobuf의 최신 버전이나 내 게임서버에서 사용된 버전을, 아니면 적어도 언리얼에 내장된 프로토 버프를 언리얼 클라이언트에서 쓰고싶어서 며칠동안 다양한 방법으로 시도해봤지만 모두 실패했다. 그래서 결국은 게임서버 강의에서 사용된 3.21.12 버전을 그대로 가져왔다. 시도한 방법들은 따로 글을 남겨봐야겠다.

https://dodontak.tistory.com/312

 

이참에 지금까지 프로젝트에서 사용된 protobuf의 버전을 전체적으로 살펴봤다.

게임서버 강의 윈도우 환경에서 사용된 버전은 3.21.12 버전

인증서버에서 debian 컨테이너에서 apt로 설치한 버전도 3.21.12 버전

내가 vcpkg로 윈도우 환경에서 설치한 버전이 4.29.5 버전.

현재 protobuf 최신 버전은 35.x 버전이다. (아마 4.35.x버전)

 

참고로 3.21.12 버전 다음은 4.22.0 버전이고, 이 때 abseil-cpp 의존성이 추가됐다.

 

어쨌든 언리얼 클라이언트의 protobuf는 게임서버에서 썼던 21.12버전을 그대로 쓴다.


언리얼에 ProtobufCore 프로젝트 추가하기

아래와같이 ProtobufCore 폴더를 추가해준다.

GameServerProject/
├── Client (언리얼)
│   └── Source
│       ├── Client (기존에 있는 프로젝트)
│       └── ProtobufCore (새로 추가)
│           ├── Include/...
│           ├── Lib/...
│           └── ProtobufCore.Build.cs
└── Project_Island (c++ 게임 서버)

 

ProtobufCore.Build.cs

아래와 같이 써준다.

using System.IO;
using UnrealBuildTool;

public class ProtobufCore : ModuleRules
{
	public ProtobufCore(ReadOnlyTargetRules Target) : base(Target)
	{
		Type = ModuleType.External;
		PublicSystemIncludePaths.Add(Path.Combine(ModuleDirectory, "Include"));
		PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "Include"));
		PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "Lib", "Win64", "libprotobuf.lib"));

		PublicDefinitions.Add("GOOGLE_PROTOBUF_NO_RTTI=1");
	}
}

Include 폴더는 21.12버전의 Include를 그대로 복붙하고, Lib폴더에는 Win64 폴더를 추가해 이미지와 같이 libprotobuf.lib 파일을 넣어준다.

 

21.12 버전의 libprotobuf 빌드 방법과 protoc 설치방법은 아래 게시글에서 참조하자. 게임서버 강의 들으면서 정리했던 글이다.

 

66. Protobuf

26.01.11 에 남기는 메모protobuf를 최신 버전으로 받아보려 했는데 abseil과 googletest 의존성 문제를 해결하지 못해서 구버전(21.12)으로 설치했다. 22버전 이후로는 protobuf에 abseil과 googletest가 포함되어

dodontak.tistory.com

 


GenPacket.bat 수정

서버에서는 vcpkg로 설치하고, 윈도우 환경변수 Path에 등록된 vcpkg의 protoc (4.29.5 버전)를 사용중인데, 클라이언트는 21.12버전을 사용할 것이기 때문에 따로 관리해줘야한다. 우선 위에서 설치한 21.12버전의 protoc.exe를 

GameServerProject\Project_Island\Protocol 위치로 이동한 다음 헷갈리지 않게 이름을 protoc_v21_12.exe 로 변경해줬다.

 

이제 GenPacket을 실행할 때 proto를 변환해서 게임서버, 더미클라이언트, 언리얼 클라이언트로 옮겨줘야 한다.

이 때 게임서버, 더미클라이언트는 protoc 명령어를 사용하여 vcpkg의 protoc를 사용하고 (4.29.5)

언리얼 클라이언트는 protoc_v21_12 프로그램을 사용해서 만든 pb.h, ph.cc파일들을 각각 복사해주도록 GenPacket.bat를 수정해준다.

 

상대경로를 이용하기 때문에 아래의 디렉터리 구조와 일치해야만 한다.

GameServerProject/
├── Client (언리얼)
└── Project_Island (c++ 게임 서버)
pushd %~dp0

protoc -I=./ --cpp_out=./ ./Enum.proto
protoc -I=./ --cpp_out=./ ./Struct.proto
protoc -I=./ --cpp_out=./ ./Protocol.proto

GenPackets.exe --path=./Protocol.proto --output=ClientPacketHandler --recv=C_ --send=S_
GenPackets.exe --path=./Protocol.proto --output=ServerPacketHandler --recv=S_ --send=C_

IF ERRORLEVEL 1 PAUSE

XCOPY /Y *.pb.h "..\GameServer\"
XCOPY /Y *.pb.cc "..\GameServer\"
XCOPY /Y ClientPacketHandler.h "..\GameServer\"

XCOPY /Y *.pb.h "..\DummyClient\"
XCOPY /Y *.pb.cc "..\DummyClient\"
XCOPY /Y ServerPacketHandler.h "..\DummyClient\"

IF ERRORLEVEL 1 PAUSE

DEL /Q /F *.pb.h
DEL /Q /F *.pb.cc

protoc_v21_12 -I=./ --cpp_out=./ ./Enum.proto
protoc_v21_12 -I=./ --cpp_out=./ ./Struct.proto
protoc_v21_12 -I=./ --cpp_out=./ ./Protocol.proto

XCOPY /Y *.pb.h "..\..\Client\Source\Client\Network\"
XCOPY /Y *.pb.cc "..\..\Client\Source\Client\Network\"
XCOPY /Y ServerPacketHandler.h "..\..\Client\Source\Client\"

DEL /Q /F *.pb.h
DEL /Q /F *.pb.cc
DEL /Q /F *.h

IF ERRORLEVEL 1 PAUSE

PAUSE

 

 

그리고 Client 프로젝트의 Client.Build.cs를 아래 코드로 복붙한다.

 

using UnrealBuildTool;
using System.IO;

public class Client : ModuleRules
{
	public Client(ReadOnlyTargetRules Target) : base(Target)
	{
    		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
    
    		PublicDependencyModuleNames.AddRange(new string[]
    		{
    			"Core",
    			"CoreUObject",
    			"Engine",
    			"InputCore",
    			"EnhancedInput"
    		});
    
    		PrivateDependencyModuleNames.AddRange(new string[] { "ProtobufCore" });
    
    		PrivateIncludePaths.AddRange(new string[]
    		{
    			"Client/",
    			"Client/Network/"
    		});
    	}
}

그리고 언리얼 클라이언트와 에디터등등을 다 닫고, 언리얼 클라이언트 프로젝트 폴더에 있는 uproject 파일을 우클릭해서 Generate Visual Studio project files를 눌러준다.

 

이제 에디터로 언리얼 클라이언트 프로젝트를 열어보면 ProtobufCore 프로젝트가 추가됐다.

 

Protocol.pb.cc(317, 76): [C4800] 'uint64_t'에서 부울로 암시적 변환입니다. 정보가 손실될 수 있습니다.

조금 알아보니 warning 수준의 에러를 컴파일러 옵션으로 인해 (아마 -Warning) 발생하는 에러인 듯 하다.

발생한 파일은 protobuf 자동화로 재생성되는 파일이기 때문에 이 파일 내에서 수정으로 해결하는건 의미가 없고 파일에 보면 아래와 같은 include가 있는데 해당 파일 최하단에 

#include <google/protobuf/port_def.inc>
#ifdef _MSC_VER
#pragma warning(disable: 4800)
#endif

를 추가해 해결했다. (다른 에러가 발생하면 에러코드를 좀 바꾸면 될 듯 하다)

 

이제 빌드를 해보면 잘 된다.


테스트

간단하게 protobuf 가 실제로 사용이 되는지 확인해봤다.

언리얼 에디터에서 Pawn을 상속받은 MyPawn 클래스를 만들고, 이 클래스를 상속받은 블루프린트를 만들어줬다.

그리고 블루프린트를 맵 뷰포트에 끌어다 넣어줬다.

 

void AMyPawn::BeginPlay()
{
	Super::BeginPlay();
	
	Protocol::C_CHAT pkt;
	pkt.set_msg("Hello world!");
	
	UE_LOG(LogTemp, Display, TEXT("%s"), *FString(UTF8_TO_TCHAR(pkt.msg().c_str())));
}

MyPawn 클래스의 BeginPlay에 간단하게 Protobuf 객체를 만들고, 멤버함수를 써서 출력이 되는지 확인해봤다.

잘 됐다!


현재까지의 git 버전

클라이언트

 

Feat: Protobuf 21.12 추가 · Dodontak/Project_Island_Client@44d1391

21.12버전의 protobuf를 추가하고, 프로토버프가 잘 되는지 테스트 하기 위해 MyPawn 클래스와 블루프린트를 추가함.

github.com

게임 서버

 

Feat: 클라이언트를 위한 protoc 21.12추가 · Dodontak/Project_Island_GameServer@e2a4159

protoc 21.12 exe파일 추가 GenPacket.bat 파일 수정 - 클라이언트용 pb.h, cc파일은 21.12버전의 protoc로 생성해서 복사해주도록 수정함. 상대경로를 이용함에 유의 exe파일을 git에 포함하는게 좀 이상한데

github.com

 

'프로젝트 > Project_Island' 카테고리의 다른 글

48. 언리얼 클라이언트 패킷 수신  (0) 2026.04.27
47. 클라와 서버 연결하기  (0) 2026.04.26
45. 언리얼 클라이언트 만들기  (0) 2026.04.20
44. JobTimer  (0) 2026.04.18
43. JobQueue(2) - GlobalQueue  (0) 2026.04.17

+ Recent posts