如何修复 IEnumerator WaitForSeconds 在 Unity C# 中不工作

How to fix IEnumerator WaitForSeconds not Working in Unity C#

我正在为我的 PlayerController 创建一个重新加载脚本。我正在遵循 Brackey 的指南:https://www.youtube.com/watch?v=kAx5g9V5bcM。他的方法使用 IEnumerators 和 WaitForSeconds 来增加重新加载时间。基本上,我在 yield 之前记录 "reloading",在 yield 之后记录 "reloaded"。但是,我同时得到 "reloading" 和 "reloaded"。

我试过增加重新加载时间,以防时间太短,但没有任何效果。

这是我的 class 的内部。我没有收到任何错误。

public float speed;

    private Rigidbody2D rb;
    private Vector2 moveVelocity;

    public GameObject bullet;
    public GameObject shootPoint;
    //public float ammo = 6;
    //[HideInInspector] public bool reloading = false;
    //[SerializeField] private float reloadTime = 3;
    //private float reloadState;

    public int maxAmmo = 10;
    private int currentAmmo;
    public float reloadTime = 100f;
    private bool isReloading = false;

    public float health = 50f;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        health = 50;
        currentAmmo = maxAmmo;
    }

    void Update()
    {
        Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
        moveVelocity = moveInput * speed;

        if (isReloading) {
            return;
        }

        if (currentAmmo <= 0) {
            StartCoroutine(Reload());
            return;
        }

        if (Input.GetButtonUp("Shoot")) {
            Instantiate(bullet, shootPoint.transform.position, Quaternion.identity);
            currentAmmo--;
        }
    }

    void FixedUpdate()
    {
        rb.MovePosition(rb.position + moveVelocity * Time.fixedDeltaTime);
    }

    void OnTriggerEnter2D(Collider2D other) {
        if(other.gameObject.tag == "Bullet") {
            health--;
            //Debug.Log("Player 1 Health: " + health);
            Destroy(other.gameObject);
        }
    }

    IEnumerator Reload()
    {
        Debug.Log("reloading");
        isReloading = true;

        yield return new WaitForSeconds(reloadTime);

        currentAmmo = maxAmmo;
        isReloading = false;
        Debug.Log("reloaded");
    }

正如我所说,我没有收到任何错误。我以为我一秒钟都不能开枪,但我能开枪,而且装弹不花一秒钟。

您已声明

public float reloadTime = 100f;

一个 public 字段被 Unity Inspector 自动序列化 ("stored")。

我的猜测是,一开始你是这样声明的

public float reloadTime;

因此 Unity Inspector 将其存储为默认值 0。后来您尝试从脚本中增加该值。

以后在脚本中对初始值所做的任何更改都不会产生任何效果。 Unity Inspector 将始终用序列化的值覆盖该值。

从现在开始,为了更改您的值,您必须始终要么使用检查器进行设置,要么不序列化该字段(例如,将其设置为 private),要么将其设置在 AwakeStart 方法再次覆盖 Inspector 值。