Как исправить IEnumerator WaitForSeconds, не работающий в Unity C # - PullRequest
1 голос
/ 12 июня 2019

Я создаю скрипт перезагрузки для моего PlayerController.Я следую указаниям Брэки: 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 Ответ

2 голосов
/ 12 июня 2019

Вы объявили

public float reloadTime = 100f;
Поле

a public автоматически сериализуется («сохраняется») инспектором Unity.

Я думаю, что сначала вы объявили это как

public float reloadTime;

, поэтому Unity Inspector сохранил его со значением по умолчанию 0. Затем вы попытались увеличить это значение из скрипта.

Любые последующие изменения начального значения в скрипте не будут иметь какого-либо эффекта. Инспектор Unity всегда перезаписывает значение на сериализованное.

Для того, чтобы изменить свое значение с этого момента, вам всегда нужно либо сделать его с помощью Инспектора, либо не сериализовать поле (например, сделав его private), либо установить его в методе Awake или Start который снова перезаписывает значение Инспектора.

...