//FixedUpdate is called at a fixed interval and is independent of frame rate. Put physics code here. private void FixedUpdate() { if (!isLocalPlayer) { return; } AlignPositionToGrid(); // куда-то едем if (_targetPosition.HasValue) { Debug.DrawLine(_rb2D.position, _targetPosition.Value, Color.red, Time.deltaTime, false); // достигли ли узла сетки? var distanceToTarget = (_targetPosition.Value - _rb2D.position).magnitude; if (distanceToTarget < Epsilon) { // достигли, стоп машина _targetPosition = null; _rb2D.velocity = Vector2.zero; } } else { _rb2D.velocity = Vector2.zero; } var requestedDirection = GetDirection(_inputX, _inputY); // позволяем менять направление, если находимся в узле сетки, // или если есть коллизии if (!_targetPosition.HasValue || IsInCollision()) { // если игрок жмёт в какую-либо сторону - пытаемся ехать туда if (requestedDirection.HasValue) { _currentDirection = requestedDirection.Value; if (!_brake) { //задаём цель _targetPosition = SnapToGrid(_rb2D.position + DirectionHelper.Directions[_currentDirection] * Constants.GridSize); //едем _rb2D.MovePosition(_rb2D.position + DirectionHelper.Directions[_currentDirection] * Speed * Constants.GridSize); } else { _targetPosition = null; } } else { // стоим на месте _targetPosition = null; } } //иначе просто едем else { var requiredMove = _targetPosition.Value - _rb2D.position; var availableMagnitude = Speed * Constants.GridSize; var magnitudeExcess = availableMagnitude - requiredMove.magnitude; // если за следующий тик мы доедем куда нужно - можно послушать, чего же хочет игрок if (magnitudeExcess > 0) { // если игрок жмёт в какую-либо сторону - пытаемся ехать туда if (requestedDirection.HasValue) { //поворачиваемся _currentDirection = requestedDirection.Value; if (!_brake) { //едем _rb2D.MovePosition(_targetPosition.Value + DirectionHelper.Directions[_currentDirection] * magnitudeExcess); //задаём цель _targetPosition = SnapToGrid(_targetPosition.Value + DirectionHelper.Directions[_currentDirection] * Constants.GridSize); } } else { _rb2D.MovePosition(_rb2D.position + requiredMove); } } else { _rb2D.MovePosition(_rb2D.position + requiredMove.normalized * availableMagnitude); } } _rb2D.MoveRotation(DirectionHelper.Rotations[_currentDirection]); _sync.CmdSyncTankPosition(_currentDirection, transform.position); }