Я уже некоторое время искал в Интернете тихое решение своей проблемы и не мог найти достаточно ресурсов, чтобы помочь мне.
Я разрабатываю совместную RPGигра в Unity 3D, с использованием библиотеки UDP https://github.com/RevenantX/LiteNetLib, и мне удалось установить соединение клиент-сервер, куда я посылаю вектор движения своего игрока (расчет времени не применяется, поэтому сервер может обработать его на своемставьте галочку) на сервер, и он вычисляет новую позицию, в которой должен находиться персонаж, а затем я передаю всем игрокам новый вектор, который я отправил на сервер, чтобы они также могли самостоятельно вычислять физику.
Проблема, с которой я сталкиваюсь, заключается в том, что движение кажется очень запаздывающим и иногда просчитанным.
Я не уверен, связано ли это с моим локальным сценарием PlayerController или с плохой сетью, или с плохим дизайном, где яна самом деле следует отправить новую абсолютную позицию клиента.
Я знаю, что это сложный вопрос, я надеюсь, что некоторые рекомендации oОпыт разработчиков, которые сами пытались создавать многопользовательские игры,
Следует также отметить, что измена меня не касается, потому что это игра в стиле «курятник», а не соревновательная.
Спасибо зазаранее за любую помощь.
Вот фрагмент моего местного кода PlayerController:
void Update()
{
// Get Input for axis
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
// Calculate the forward vector
Vector3 camForward_Dir = Vector3.Scale(UnityEngine.Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;
Vector3 move = v * camForward_Dir + h * UnityEngine.Camera.main.transform.right;
if (move.magnitude > 1f) move.Normalize();
// Calculate the rotation for the player
move = transform.InverseTransformDirection(move);
// Get Euler angles
float turnAmount = Mathf.Atan2(move.x, move.z);
transform.Rotate(0, turnAmount * RotationSpeed * Time.deltaTime, 0);
if (_characterController.isGrounded)
{
_moveDir = transform.forward * move.magnitude;
_moveDir *= Speed;
}
_moveDir.y -= Gravity * Time.deltaTime;
var delta = _moveDir * Time.deltaTime;
_characterController.Move(delta);
if (!IsMoving())
{
//_wasMoving = false;
return;
}
// we send the move direction so that the server and other client`s can calculate for themselves
OnPlayerMoved?.Invoke(_moveDir, Time.deltaTime);
}