| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- winapi
- IFileDialog
- Programmers
- DirectX11
- Unreal Engine5
- 언리얼엔진5
- algorithm
- const
- 프로그래머스
- UE5
- 1563
- softeer
- UnrealEngine4
- GeeksForGeeks
- 티스토리챌린지
- directx
- 팰린드롬 만들기
- C++
- 오블완
- NRVO
- 백준
- C
- RootMotion
- UnrealEngine5
- 2294
- TObjectPtr
- RVO
- 줄 세우기
- Effective C++
- baekjoon
- Today
- Total
Game Develop
데디케이티드서버 쓸거면 처음부터 써라 본문
본인 프로젝트에 어차피 나중에 서버를 붙일거면은, 그냥 처음부터 깃허브에서 엔진소스 다운받아서 서버 구축한다음, 서버 띄워놓으면서 클라컨텐츠같은거 구현하는 게 낫다.
나는 원래 서버할 생각 없이 그냥 컨텐츠구현같은거 하다가, 최근에 데디케이티드 서버 연결해서 채팅이랑 애니메이션 동기화같은이슈 경험하려고 지금 하고 있는데, 그러다보니 코드를 꽤나 수정하고 있다.
대충이나마 조금이라도 언리얼 데디서버를 공부해본 사람은 알겠지만, 데디서버로 서버-클라 관계를 구현하려한다고 하면, 이제 기본적으로 서버에 액터같은거를 스폰시키고 그걸 클라이언트에 복제하는 방식이다.
그러다보니 일단 서버에서 레벨로딩 및 액터스폰 등등을 먼저 진행하게 되는데, 이 때 서버고려없이 짰던 코드에서는 매우 높은확률로 여기저기 nullptr 역참조했다는 식의 에러가 많이 발생할 것이다.
예를들어 Monster라는 클래스가 있고 엔진의 AIController를 래핑한 AIControllerBase라는 클래스를 만들었다고 가정하자.
이 AIControllerBase를 Monster라는 클래스 여기저기에서 많이 사용한다면 그냥 아예 멤버변수에다가 저장해서 사용할 수도 있을 것이다. 일일이 함수에서 AIController가져와서 AIControllerBase로 캐스팅하면 중복되는 코드도 많아지고 캐스팅비용도 필요하니까. (틱함수같은거 아니면 크게 체감은 안 될 수도 있겠지만... 결국 메모리를 더 쓰느냐 시간을 더 쓰느냐..)
쨌든 그래서 BeginPlay쯔음에서 m_AIControllerBase = Cast<AIControllerBase>(GetController) 형식으로 미리 저장해놓고 사용했다.
근데 이 상태로 서버 연결하고 실행해보니, GetController가 널값이라고 바로 터졌다. 즉 에디터에서 PIE로 했을때는 BeginPlay에서 GetController 했을 때 이미 컨트롤러가 있는상황이라 널값이 아니였지만, 서버에서 실행하는 시점에서는 아직 컨트롤러가 생성된 시점이 아니라 nullptr을 리턴하게되고, 이걸 Cast해서 에러가 발생한 것이다.
이런식으로 미리 멤버변수에 캐싱해서 사용을 했었어서, 현재는 여기저기 고치고 있는 중이다. 뭐 복잡한거까진 아니라 당장은 그냥 노가다수준이라 어려운 건 아니다만, 어쨌든 중간에 이렇게 바꾸려면 이미 구조를 짜놓은걸 또 바꿔야하니 매우 귀찮아지기 때문에 제목처럼 서버 붙일거면 미리 붙이고 계속 테스트하면서 진행하길 추천한다.
