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

时间:2019-06-12 16:20:15

标签: c# unity3d ienumerator

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

我尝试增加装弹时间,以防时间太短,但没有任何效果。

这是我班的内部。我没有任何错误。

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");
    }

正如我所说,我没有收到任何错误。我希望我不能射击一秒钟,但是我可以射击并且重新加载不需要一秒钟。

1 个答案:

答案 0 :(得分:2)

您已声明

public float reloadTime = 100f;

public字段由Unity Inspector自动序列化(“存储”)。

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

public float reloadTime;

因此,Unity Inspector用默认值0存储了它。然后,稍后您尝试从脚本中增加该值。

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

为了从现在开始更改您的值,您总是必须使用Inspector进行设置,不对字段进行序列化(例如通过使其private)或在Awake中进行设置,或者Start方法将再次覆盖检查器值。