示例#1
0
        //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);
        }