Input.GetKey(sprintKey) отключается и включается в каждом кадре?C#

Место общения программистов C#
Ответить
Anonymous
 Input.GetKey(sprintKey) отключается и включается в каждом кадре?

Сообщение Anonymous »

В настоящее время я работаю над функцией спринта для моего контроллера от первого лица.
Моя настройка — это «PlayerMovementController», «PlayerStatusController» и скриптовый объект «PlayerStatusData», который StatusController получает информацию о выносливости игрока.
PlayerMovementController:

Код: Выделить всё

    private void Update()
{
HandleMovementInput();
ApplyMovement();
}

private void HandleMovementInput()
{
if (Input.GetKey(sprintKey) && !isSprinting)                 // SPRINTING
{
if (OnCheckStamina != null && OnCheckStamina())
{
StartSprint();
OnStaminaDrain?.Invoke();
}
}
else                                                         // NOT SPRINTING
{
StopSprint();
OnStaminaRegen?.Invoke();
}
/*** SPRINTING ENDE ***/

currentInput = new Vector2(movementSpeed * Input.GetAxis("Vertical"), movementSpeed * Input.GetAxis("Horizontal"));
float moveDirectionY = moveDirection.y;
moveDirection = (transform.TransformDirection(Vector3.forward) * currentInput.x) + (transform.TransformDirection(Vector3.right) * currentInput.y);
moveDirection.y = moveDirectionY;
}

private void ApplyMovement()
{
if (!characterController.isGrounded)
moveDirection.y -= gravity * Time.deltaTime;

characterController.Move(moveDirection * Time.deltaTime);
}

private void StartSprint()
{
isSprinting = true;
movementSpeed = sprintSpeed;

}

private void StopSprint()
{
isSprinting = false;
movementSpeed = walkSpeed;

}
Сам Sprint работает нормально, но я заметил в Инспекторе логическое значение isSprinting и скорость движения постоянно меняется между true и false и от 3f до 1,8f.
Я могу Не верю, что это нормально, должен быть правильный переключатель... верно?
В самом игровом обзоре это не кажется проблемой, но система выносливости с этими событиями на самом деле не работает. Они постоянно переключаются между «Восстановлением выносливости» и «Сливом выносливости».
PlayerStatusController:

Код: Выделить всё

public class PlayerStatusController : MonoBehaviour
{
[Header("Scriptable Object")]
public PlayerStatusData playerStatusData, pSD;

private void OnEnable()
{
PlayerMovementController.OnCheckStamina += HasStamina;
PlayerMovementController.OnStaminaDrain += DrainStamina;
PlayerMovementController.OnStaminaRegen += RegenerateStamina;
}

private void OnDisable()
{
PlayerMovementController.OnCheckStamina -= HasStamina;
PlayerMovementController.OnStaminaDrain -= DrainStamina;
PlayerMovementController.OnStaminaRegen -= RegenerateStamina;

}
private bool HasStamina()
{
return playerStatusData.currentStamina > 0;
}

private void DrainStamina()
{
if (playerStatusData.currentStamina != playerStatusData.minStamina)
{
playerStatusData.currentStamina -= playerStatusData.staminaDrain * Time.deltaTime;
playerStatusData.currentStamina = Mathf.Max(0, playerStatusData.currentStamina); // Ensure stamina doesn't go below 0
Debug.Log("DRAINING STAMINA");
}

}

private void RegenerateStamina()
{
if (playerStatusData.currentStamina < playerStatusData.maxStamina)
{
playerStatusData.currentStamina += playerStatusData.staminaRegen * Time.deltaTime;
playerStatusData.currentStamina = Mathf.Min(100, playerStatusData.currentStamina); // Ensure stamina doesn't go above 100
Debug.Log("REGENERATING STAMINA");
}
}
}
На мой взгляд, система событий должна работать нормально... но я думаю, что есть проблема с включением/выключением сценария спринта, которая вызывает проблемы в системе выносливости. У кого-нибудь есть решение этой проблемы?

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

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

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

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

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

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