-
프로토버퍼 연동(feat. C# 프레임워크)개발/C# 2025. 1. 28. 13:01
C# 프레임워크는 하나가 아니다. C++를 주로 하다가 C#도 이참에 해두면 좋을 것 같아서 시작했는데 프레임워크 종류를 면밀히 살피지 않고 그러려니 했었다. "뭐 대충 다 호환되겠지!". 어떤 일이든 조금이라도 얕잡아 보는 순간 역으로 당하는 법이다.
어디에는 있는 API가 저기에는 없어 프로젝트를 마이그레이션 해야 했고, dll을 복사 붙여넣기 하니까 에러 로그 하나 안 뜨고 제대로 동작하지 않았다. 대상 프레임워크가 다른 것이 이유였음을 알게 됐다. 프로토버프도 마찬가지로, 여기에서 간단하게 설명할 것은 닷넷8.0으로 만든 서버 프로젝트와 2022.3.55f 유니티를 프로토버프로 연동하는 방법이다. 추가적으로 서버 프로젝트의 서버 로직의 dll을 유니티 프로젝트에서도 동작할 수 있게 해볼 거다.
서버
vs에서 NuGet을 이용해 프로토버프를 설치한다. 여기에서는 솔루션 패키지 매니저를 사용했다.
protobuf를 이용해 필요한 프로젝트에 설치해주자.
서버는 이렇게 마무리하면 된다. 컴파일된 cs 파일은 필요한 곳에 넣고 사용하면 된다.
클라이언트
유니티 환경에서는 유니티가 이 프로토버프를 알고 있어야 하기 때문에 서버에서처럼 NuGet을 통해 프로토버프를 설치하는 것이 잘 안 될 수 있다. 버전을 맞춰주기 위해 서버에서 사용하는 프로토버프 dll 파일을 유니티 편집기에 직접 복사하겠다. 중요한 건 두 프로젝트의 타겟 프레임워크도 맞춰야 한다는 점이다.
타겟 프레임워크 확인
유니티의 버전은 2022.3.55f이다. 유니티 편집기에서 사용하고 있는 타겟 프레임워크를 확인해보자. 유니티 편집기 상단의 Edit - ProjectSettings로 이동해 Player 탭으로 가보자. Other Settings에 Api Compatibility Level을 보면 된다.
특별한 이유가 없으면 기본 설정을 바꾸고 싶지 않고 유니티는 더더욱 그래야 할 것 같다.
Google.Protobuf.dll
서버 프로젝트에서 NuGet을 통해 다운로드한 소프트웨어는 별도로 저장이 되어 있다. 사용자 아이디 폴더에 .nuget 폴더를 확인할 수 있고, 들어가면 google.protobuf 폴더가 있다.
다운로드한 버전의 폴더로 들어가 lib 폴더를 들어가면 타겟 프레임워크 별로 dll이 존재한다.
유니티 2022.3.55f은 standard 2.1를 사용하지만 2.0도 호환되므로 netstandard2.0에 있는 dll을 사용하면 된다. 이를 유니티 편집기의 Assets 폴더 하위에 Plugins 폴더를 만들어서 복사 붙여넣기 하자. 복사 붙여넣기 할 때는 편집기에서 직접 하지 않고 해당 폴더의 탐색기로 가서 해야 한다. 그러고 나서 편집기로 돌아가면 컴파일이 되고, 폴더에는 메타 파일이 하나 추가된다.
유니티 편집기에 오류 메시지가 뜰 수 있다. 내 경우는 "System.Runtime.CompilerServices.Unsafe"를 못 찾는다. 이는 C# 환경을 제대로 설치했으면 기본으로 존재하는 파일이지만, 수동으로 프로토버프 dll 파일을 복사 붙여넣기 한 탓인지 유니티 편집기의 버그인지, 편집기가 자동으로 못 찾는다. 이것도 직접 복사 붙여넣기 해주면 해결된다. System.Runtime..은 C# sdk가 설치된 곳에 있다. 내 경우의 경로는 다음과 같다.
C:\Program Files\dotnet\shared\Microsoft.NETCore.App
서버 로직 dll을 유니티에서 사용하기
먼저 타겟 프레임워크를 맞춰야 한다. 서버 프로젝트는 닷넷8.0인데 유니티는 Standard2.1이기 때문에 dll 파일이 서로 호환되지 않는다. 서버 프로젝트를 Standard2.x으로 빌드하면 간단하게 해결된다. dll을 만들고자 하는 서버 프로젝트의 설정으로 가 타겟 프레임워크를 직접 변경하면 된다. 비주얼 스튜디오에서 프로젝트 파일을 클릭해도 나타나고, 직접 csproj 파일을 메모장이나 Notepad++ 같은 편집기로 열어도 된다.
내 프로젝트는 닷넷8.0이라서 net8.0으로 되어 있고 이를 netstandard2.0으로 바꿔서 빌드를 해주자. 그러면 bin/Debug 폴더에 프레임워크 별로 파일이 생긴다.
netstandard2.0의 dll 파일을 유니티 편집기가 알 수 있도록 붙여넣기 한다. 이 파일은 Assets/Libs에 하도록 하자.
Plugins에 해도 작동하겠지만 이 파일은 플러그인보다는 라이브러리 폴더에 놓는 게 자연스러워 보인다. 유니티 편집기는 Plugins, Libs 모두 인식한다.
이렇게 해서 유니티에 들어간 서버 코드가 필요한 네임스페이스를 불러올 수 있게 된다.
'개발 > C#' 카테고리의 다른 글
프로토버프 MergeFrom()에서 만난 오류(feat. 'System.Runtime.CompilerServices.Unsafe) (0) 2025.02.05 빌드 이벤트를 통해 자동화를 완성하자 (0) 2024.12.27 유니티 편집기에서 띄운 프로젝트가 호환되지 않을 때 (0) 2024.12.17 닷넷 프레임워크 프로젝트를 닷넷 프로젝트로 변경하기 (1) 2024.12.16