1

我正在尝试制作一个 2d 平台游戏,很久以前我添加了 sprinting,它运行良好。昨天它随机停止工作,我不知道为什么,所以我尝试通过关闭最大化播放并在按住 shift 时选择我的播放器来测试我的速度和当前耐力值是否在按住 shift 时发生变化。当我对其进行测试时,值正在发生变化并且由于某种原因我的冲刺正在工作,但是当我停止选择我的播放器并选择其他东西时,它停止让我冲刺。我不认为这是我的代码的错误我只是认为这是一个统一的故障,但无论如何我都会包含我的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerContoller : MonoBehaviour
{
    private Rigidbody2D rb;
    public float speed = 7.34f;
    public float jumpForce;
    private float moveInput;

    private bool isGrounded;
    public Transform feetPos;
    public float checkRadius;
    public LayerMask whatIsGround;
    public LayerMask Slow;

    private float jumpTimeCounter;
    public float jumpTime;
    private bool isJumping;

    public int maxStamina = 163;
    public int currentStamina;
    public bool canSprint;

    public Stamina stamina;

    private Animator anim;

    void Start()
    {
        anim = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();

        currentStamina = maxStamina;
        stamina.SetMaxStamina(maxStamina);
    }

    private void FixedUpdate()
    {
        moveInput = Input.GetAxisRaw("Horizontal");
        rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);

        if(moveInput == 0)
        {
            anim.SetBool("isRunning", false);
        } else
        {
            anim.SetBool("isRunning", true);
        }

        if (currentStamina > 0)
        {
            canSprint = true;
        } else if (currentStamina < 0)
        {
            canSprint = false;
        }
        if (currentStamina < maxStamina)
        {
            RegenStamina(2);
        }


        if (canSprint == true)
        {
            if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.LeftShift))
            {
                LoseStamina(5);
                speed = 14f;
            }
        } else
        {
            speed = 7.34f;
        }

        if (canSprint == false)
        {
            speed = 7.34f;
        }
    }

    private void Update()
    {
        isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);

        if (moveInput > 0)
        {
            transform.eulerAngles = new Vector3(0, 0, 0);
        }
        else if (moveInput < 0)
        {
            transform.eulerAngles = new Vector3(0, 180, 0);
        }

        if (isGrounded == true && Input.GetKeyDown(KeyCode.Space))
        {
            anim.SetTrigger("takeOff");
            isJumping = true;
            jumpTimeCounter = jumpTime;
            rb.velocity = Vector2.up * jumpForce;
            
        }

        if (isGrounded == true)
        {
            anim.SetBool("isJumping", false);
        }
        else
        {
            anim.SetBool("isJumping", true);
        }

        if(Input.GetKey(KeyCode.Space) && isJumping == true)
        {
            if(jumpTimeCounter > 0)
            {
                rb.velocity = Vector2.up * jumpForce;
                jumpTimeCounter -= Time.deltaTime;
            }
            else
            {
                isJumping = false;
            }

        }

        if (Input.GetKeyUp(KeyCode.Space))
        {
            isJumping = false;
        }
    }

    void LoseStamina(int StaminaGone)
    {
        currentStamina -= StaminaGone;

        stamina.SetStamina(currentStamina);
    }

    void RegenStamina(int AddStamina)
    {
        currentStamina += AddStamina;

        stamina.SetStamina(currentStamina);
    }
}

在另一个脚本中我有

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Stamina : MonoBehaviour
{
    public Slider slider;

    public void SetMaxStamina(int Stamina)
    {
        slider.maxValue = Stamina;
        slider.value = Stamina;
    }

    public void SetStamina(int Stamina)
    {
        slider.value = Stamina;
    }
}

(这是为了让滑块移动)

4

1 回答 1

0

由于您的最大耐力为 163,并且您每次减少 5 耐力FixedUpdate,假设您没有将默认修复更新率从 0.02(50每秒更新)。您可以尝试增加 stamina 值来测试它或减少每次执行该FixedUpdate方法时的 stamina 消耗。

如果您想在 中执行此操作FixedUpdate,请尝试以下操作:

LoseStamina(5 * Time.fixedDeltaTime);

这会将耐力消耗更改为每秒 5,您可以根据需要对其进行调整。

于 2021-02-15T17:51:57.520 回答