Выполните многогранный тест скорости, приседая.C#

Место общения программистов C#
Ответить
Anonymous
 Выполните многогранный тест скорости, приседая.

Сообщение Anonymous »

Я написал простой контроллер для персонажа и мучаюсь с приседанием. Проблема в том, что я не могу реализовать скорость приседания для всех случаев, например: когда я приседаю, стоя на земле, я могу прыгать, и скорость будет сохраняться, когда я ползаю. Однако когда я бегаю или иду, я подпрыгиваю и приседаю в воздухе, имитируя то, что в прыжке поджимаю под себя ноги. Эта логика также замедляет скорость, так как нет никаких ограничений или проверок для приседа, так как мы можем приседать как в воздухе, так и на земле. Все, что мне нужно, это поддерживать скорость приседа, когда я прыгаю на земле, и поддерживать скорость прыжка, когда я бегу или иду в воздухе. вот мой код:
[RequireComponent(typeof(CharacterController))]

public class PlayerMovement : MonoBehaviour
{
private PlayerInputActions _playerInputActions;
private CharacterController _characterController;

[SerializeField] private PlayerCamera _playerCamera;

[SerializeField] private Camera _playerMainCamera;

[SerializeField] private float _walkSpeed = 5f;
[SerializeField] private float _runSpeed = 10f;
[SerializeField] private float _crouchSpeed = 2f;

[SerializeField] private float _gravityScale = 9.81f;

[SerializeField] private float _jumpForce;

[SerializeField] private float _crouchScale = 0.4f;
[SerializeField] private float _standScale = 1.01f;
[SerializeField] private float _crouchSpeedChange = 1.5f;

private Vector2 _moveInput;

private float _verticalVelocity;
private float _movementSpeed;

private void Awake()
{
_playerInputActions = new PlayerInputActions();

_playerInputActions.Player.Jump.performed += context => JumpHandler();

_playerInputActions.Player.Movement.performed += context => _moveInput = context.ReadValue();

_playerInputActions.Player.Movement.canceled += context => _moveInput = Vector2.zero;
}

private void Start()
{
_characterController = GetComponent();

_movementSpeed = _walkSpeed;
}

private void Update()
{
Run();
Gravity();
Crouch();

Vector3 move = transform.right * _moveInput.x + transform.forward * _moveInput.y;
Vector3 gravityVector = new Vector3(0f, _verticalVelocity, 0f);

if(move.magnitude > 0f)
{
_characterController.Move(move * _movementSpeed * Time.deltaTime);
}

_characterController.Move(gravityVector * Time.deltaTime);

}

private void Gravity()
{
if(_characterController.isGrounded && _verticalVelocity < 0)
{
_verticalVelocity = -0.5f;
}
else
{
_verticalVelocity = _verticalVelocity - _gravityScale * Time.deltaTime;
}
}

private void JumpHandler()
{
if(_characterController.isGrounded)
{
_verticalVelocity = _jumpForce;
}

}

private void OnEnable()
{
_playerInputActions.Enable();
}

private void OnDisable()
{
_playerInputActions.Disable();
}

private void Run()
{

if (_characterController.isGrounded)
{
if (Input.GetKey(KeyCode.LeftControl)) return;
bool shiftPressed = Input.GetKey(KeyCode.LeftShift);
_movementSpeed = shiftPressed ? _runSpeed : _walkSpeed;
}

bool isRunning = _movementSpeed > _walkSpeed;

_playerCamera.SetRunningFOV(isRunning);
}

private void Crouch()
{
bool ctrlPressed = Input.GetKey(KeyCode.LeftControl);

float crouchFOV = 70f;
float crouchSpeedChange = 10f;

float targetScale = ctrlPressed ? _crouchScale : _standScale;
float newYScale = Mathf.Lerp(transform.localScale.y, targetScale, _crouchSpeedChange * Time.deltaTime);

transform.localScale = new Vector3(transform.localScale.x, newYScale, transform.localScale.z);

if (ctrlPressed)
{
_playerMainCamera.fieldOfView = Mathf.Lerp(_playerMainCamera.fieldOfView, crouchFOV, crouchSpeedChange * Time.deltaTime);
_movementSpeed = _crouchSpeed;
}

if (Input.GetKeyDown(KeyCode.Space))
{
if (!_characterController.isGrounded)
{
_movementSpeed = _walkSpeed;
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... -crouching
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»