Моя настройка — это «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;
}
Я могу Не верю, что это нормально, должен быть правильный переключатель... верно?
В самом игровом обзоре это не кажется проблемой, но система выносливости с этими событиями на самом деле не работает. Они постоянно переключаются между «Восстановлением выносливости» и «Сливом выносливости».
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
Мобильная версия