Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как сделать что бы бег и приседание могли изменять скорость бега вместе в коде на C#

Gnonymous Знаток (357), на голосовании 1 неделю назад
Если в моем коде бег изменяет скорость ходьбы то приседание не делает этого и наоборот. Часть этого кода:
private void Update()
{
Run(Input.GetKey(KeyCode.LeftShift));
Crouch(Input.GetKey(KeyCode.LeftControl));
}

private void Run(bool canRun)
{
_speedwalk = canRun ? _speedRun : _speed;
}

private void Crouch(bool canCrouch)
{
_characterController.height = canCrouch ? 1f : 2f;
_speedwalk = canCrouch ? _crouchSpeed : _speed;
}
Дополнен 1 месяц назад
Почти полный код:
public class Player : MonoBehaviour
{
[SerializeField] private float _speedwalk;
[SerializeField] private float _gravity;
[SerializeField] private float _jumpPower;
[SerializeField] private float _speedRun;
[SerializeField] private float _crouchSpeed;

private CharacterController _characterController;
private Vector3 _walkDirection;
private Vector3 _velocity;
public float _speed;

private void Start()
{
_speed = _speedwalk;
_characterController = GetComponent<CharacterController>();
}

private void Update()
{
Jump(Input.GetKey( KeyCode.Space ) && _characterController.isGrounded);
Run(Input.GetKey(KeyCode.LeftShift));
Crouch(Input.GetKey(KeyCode.LeftControl));
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
_walkDirection = transform.right * x + transform.forward * z;
}

private void FixedUpdate()
{
Walk(_walkDirection);
DoGravity(_characterController.isGrounded);
}

private void Walk(Vector3 direction)
{
_characterController.Move(direction * _speedwalk * Time.fixedDeltaTime);
}



private void Jump(bool canJump)
{
if (canJump)
_velocity.y = _jumpPower;
}

private void Run(bool canRun)
{
_speedwalk = canRun ? _speedRun : _speed;
}

private void Crouch(bool canCrouch)
{
_characterController.height = canCrouch ? 1f : 2f;
_speedwalk = canCrouch ? _crouchSpeed : _speed;
}
Голосование за лучший ответ
Klare Klarov Знаток (414) 1 месяц назад
Думаю что так
private void Update()
{
bool canRun = Input.GetKey(KeyCode.LeftShift);
bool canCrouch = Input.GetKey(KeyCode.LeftControl);

Run(canRun, canCrouch);
Crouch(canCrouch, canRun);
}

private void Run(bool canRun, bool canCrouch)
{
_speedwalk = canRun ? _speedRun : (_speedwalk = canCrouch ? _crouchSpeed : _speed);
}

private void Crouch(bool canCrouch, bool canRun)
{
_characterController.height = canCrouch ? 1f : 2f;
_speedwalk = canCrouch ? _crouchSpeed : (_speedwalk = canRun ? _speedRun : _speed);
}
Вася Пупкин Мудрец (13107) 1 месяц назад
Ну вот ты нажимаешь на shift переменная скорости становится speed+10, нажимаешь ctrl, то speed-20. Всё это дело обрабатываешь в методе Run, переменная скорости, естественно глобальная
GnonymousЗнаток (357) 1 месяц назад
Я дополнил полным кодом, только без гравитации. Посмотри пожалуйста снова. Суть в том что если приседание замедляет персонажа, то бег перестает работать вовсе
Вася Пупкин Мудрец (13107) Gnonymous, Так тебе нужно сделать кучу проверок, которые можно разделить на методы. То есть вот у тебя есть Update, который постоянно вызывает какие-нибудь методы. В этих методах у тебя есть, например,
 //Это в каком-нибудь методе public void Move()
if(shift){
    speed=fast;
}
if(ctrl){
   speed=slow;
} 
if(moveW){ 
 //position x+= speed 
} 
if(moveS){ 
 //position x-= speed 
} 
if(moveD){ 
 //position y+= speed 
} 
if(moveA){ 
 //position y-= speed 
} 
Потом у тебя отдельно обработка нажатий клавиш
 //Это в каком-нибудь методе public void CheckBtnPressed() 
if(Input.GetKeyDown("w")){ 
    moveW = false;
} 
 
if(Input.GetKeyUp("w")){ 
    moveW = true;
} 
//По аналогии с другими клавишами, которые нужно задействовать
 
Похожие вопросы