서버, A클라이언트, B클라이언트로 나누어서 A클라이언트의 움직임을 B클라이언트에 즉시 반영해보고 있는 상황입니다.
기본적으로 매 프레임마다 방향키 입력에 반응하여 움직이는데, 1초마다 A클라이언트의 플레이어 오브젝트 좌표를 보내서 B클라이언트가 예측한 위치의 오차를 보완하고 있습니다.
매 프레임 반응하여 움직일 때는, 상대적인 움직임을 보이기 위해 CharacterController.Move를 사용하고, 1초마다 좌표를 보내서 절대적인 위치로 움직일 때는 transform.position을 사용하고 있습니다.
그런데 절대적인 위치로 보내게 되면 그 순간에 잠시 그 위치로 이동했다가, 다시 튕겨나오듯 B클라이언트가 기존에 예측했던 위치로 돌아와버립니다.
정리하자면, CharacterController.Move와 transform.position을 둘다 이용하여 플레이어 오브젝트의 위치를 변화시키고 있는데, 후자가 제대로 적용되지 않고 있는 듯합니다. 이 상황에서 어떻게 문제를 해결해야 할지에 대해 답해주신다면 감사드리겠습니다.
게임업계갤로
시퀀스 넘버+보간 제대로 처리했으면 그럴일이 없는데 서버에서 보내는값 반영하는게 우선이고
지금 제 화면을 봐보면 마치 좌표 두 개가 따로 노는 느낌이 드네요.. 좀 현란하게 움직이다가 멈춰보면, 1초마다 잠깐씩 위치가 바뀌었다가 다시 돌아오고 이럽니다
글만 봐서는 모르겠다. 원인으로 짐작되는게 여러가지라서
https://github.com/enke2120/GSCP-OPT-EXP_2023.IR/blob/main/D_Client.cs
소스 코드 올려봅니다
안들어가짐 그냥 너가 패킷 어떤식으로 보내고 처리하는지만 설명해봐
public으로 바꾸는 걸 깜빡했네요; 말로 설명하는 게 애매해서.. 일단 위 링크 확인해주셨으면 합니다
패킷을 방향/위치/점프로 나눠서 처리하고 있습니다. 패킷을 받아서 수행하는 과정 자체는 D_Client.cs에서 다 확인하실 수 있고, 패킷을 전송하는 것은 Client.cs, D_Client로 보내는 것은 Server.cpp에서 확인 가능합니다.
https://www.gabrielgambetta.com/client-side-prediction-server-reconciliation.html
올려주신 링크는 클라이언트의 입력 예측 방식으로 보이는데요.. 어찌 되었던 제 경우엔 딜레이의 문제는 아닌 듯합니다.
뒤에 데드레커닝 보간도 있지않나 여튼 난 예전에 저거보고 멀쩡하게 구현함
왜인지는 모르겠는데 CharacterController.Move 대신에 gameObject.transform.Translate를 넣어서 해보니 되네요.
아무튼 감사합니다 ;)