Я написал простой контроллер для персонажа и мучаюсь с приседанием. Проблема в том, что я не могу реализовать скорость приседания для всех случаев, например: когда я приседаю, стоя на земле, я могу прыгать, и скорость будет сохраняться, когда я ползаю. Однако когда я бегаю или иду, я подпрыгиваю и приседаю в воздухе, имитируя то, что в прыжке поджимаю под себя ноги. Эта логика также замедляет скорость, так как нет никаких ограничений или проверок для приседа, так как мы можем приседать как в воздухе, так и на земле. Все, что мне нужно, это поддерживать скорость приседа, когда я прыгаю на земле, и поддерживать скорость прыжка, когда я бегу или иду в воздухе. вот мой код:
[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
Выполните многогранный тест скорости, приседая. ⇐ C#
Место общения программистов C#
-
Anonymous
1769889179
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;
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79880100/perform-a-multi-faceted-speed-test-while-crouching[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия