首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个重装武器的协程程序不能工作?

为什么这个重装武器的协程程序不能工作?
EN

Stack Overflow用户
提问于 2020-10-10 19:10:13
回答 1查看 48关注 0票数 0

我有一个重新加载的武器的代码,如果我开始重新加载,切换到不同的武器,然后切换回应该重新加载的武器,武器不会重新加载,不能射击,并且会显示以前武器的AmmoDisplay……知道为什么吗?我尝试将IEnumerator设置为public,但也不起作用。

代码语言:javascript
运行
复制
using UnityEngine;
using System.Collections;
using TMPro;

public class GunScript_SB : MonoBehaviour
{
    public float damage = 10f;
    public float range = 100f;
    public float impactForce = 30f;
    public float fireRate = 15f;

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

    public Camera fpsCam;
    public ParticleSystem muzzleFlash;
    public GameObject impactEffect;
    public TextMeshProUGUI ammunitionDisplay;

    private float nextTimeToFire = 0;

    void Start()
    {
        currentAmmo = maxAmmo;
    }

    void onEnable()
    {
        isReloading = false;
        AmmoDisplay();
    }

    // Update is called once per frame
    void Update()
    {
        if (isReloading)
            return;

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

        if (Input.GetButtonDown("Fire1") && Time.time >= nextTimeToFire)
        {
            nextTimeToFire = Time.time + 1f / fireRate;
            Shoot();
        }

        if (ammunitionDisplay != null)
        {
            AmmoDisplay();
        }

        if (Input.GetKeyDown(KeyCode.R) && currentAmmo < maxAmmo)
        {
            StartCoroutine(Reload());
        }
    }

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

        yield return new WaitForSeconds(reloadTime);

        currentAmmo = maxAmmo;
        isReloading = false;
    }

    void Shoot()
    {
        muzzleFlash.Play();
        currentAmmo--;

        RaycastHit hit;
        if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
        {
            Debug.Log(hit.transform.name);

            Target target = hit.transform.GetComponent<Target>();
            if (target != null)
            {
                target.TakeDamage(damage);
            }

            if (hit.rigidbody != null)
            {
                hit.rigidbody.AddForce(-hit.normal * impactForce);
            }

            GameObject impactGO = Instantiate(impactEffect, hit.point, Quaternion.LookRotation(hit.normal));
            Destroy(impactGO, 1f);
        }
    }

    void AmmoDisplay()
    {
        ammunitionDisplay.SetText(currentAmmo + " / " + maxAmmo);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-10-10 20:47:50

你的协程在换了武器后可能还在运行。添加一个引用字段并停止协程,然后再次启动它:

代码语言:javascript
运行
复制
private Coroutine reloadCoroutine;


if (reloadCoroutine != null){
  StopCoroutine(reloadCoroutine);
}

reloadCoroutine = StartCoroutine(Reload());

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64292743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档