Управление физикой игры Coop (движение персонажа, попадание ...) - PullRequest
0 голосов
/ 12 октября 2019

Я уже некоторое время искал в Интернете тихое решение своей проблемы и не мог найти достаточно ресурсов, чтобы помочь мне.

Я разрабатываю совместную 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);
        }
...