Unity:重装时如何开始武器重装倒计时?

时间:2017-11-04 07:11:24

标签: c# unity3d unity5

我有一个计时器,每3秒倒计时一次(白色圆圈)。它有一个名为ReloadTimer的脚本。

我有一个脚本可以发射子弹(TankShooter)并重新加载3秒钟。

如何在重装时开始倒计时?

我试过看了很多Unity论坛,这些建议没有用。

ReloadTimer.cs

[ExecuteInEditMode]

public class ReloadTimer : MonoBehaviour
{

public Image filled;
public Text text;
public float maxValue = 3;
public float value = 0;


// UpdateReload is called once per frame
public void UpdateReload ()
{

    value = Mathf.Clamp(value, 0, maxValue);
    float amount = value / maxValue;

    filled.fillAmount = amount;
    text.text = value.ToString();
}
}

TankShooter

public int m_PlayerNumber = 1;
public Rigidbody m_Shell;
public Transform m_FireTransform;
public AudioSource m_ShootingAudio;
public AudioClip m_FireClip;
public float m_ShellVelocity = 100f;

private string m_FireButton;

public int maxAmmo = 5;
private int currentAmmo;
public float reloadTime = 2f;
private bool isReloading = false;

public ReloadTimer reloadTimer;

public class TankShootingT : NetworkBehaviour
{
    public ReloadTimer reloadTimer;

    private void Start()
    {
        if (!isLocalPlayer)
        {
            return;
        }

        currentAmmo = maxAmmo;
        m_FireButton = "Fire" + m_PlayerNumber;
    }

    private void Update()
    {
        if (isReloading) 
            return;

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


            return;
        }

        reloadTimer.UpdateReload();


        if (m_FireButton == "Fire1" && Input.GetButtonUp(m_FireButton))
        {
            // we released the button, have not fired yet
            CmdShoot();
        }

    }

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

        yield return new WaitForSeconds(reloadTime);


        currentAmmo = maxAmmo;
        isReloading = false;
    }



    [Command]
    private void CmdShoot()
    {
        currentAmmo--;

        // Instantiate and launch the shell.
        Rigidbody shellInstance = Instantiate(m_Shell, m_FireTransform.position, m_FireTransform.rotation) as Rigidbody;

        shellInstance.velocity = m_ShellVelocity * m_FireTransform.forward;

        // Server spawns the shell
        NetworkServer.Spawn(shellInstance.gameObject);

        m_ShootingAudio.clip = m_FireClip;
        m_ShootingAudio.Play();
    }
}

1 个答案:

答案 0 :(得分:1)

对于初学者来说,UpdateReload之类的事情并不是每帧会被调用一次&#34;因为这不是一个预定的Unity函数,它只是你创建的一个函数(你可以阅读这个here)。另一个问题是你甚至没有在脚本中的任何其他地方调用该函数。即使您这样做,Mathf.Clamp()也需要放在Update()函数中,以便每帧都可以更新它的值。

我对您发布的脚本进行了一些修改,但我还没有对它们进行过测试。尝试一下,让我知道它是怎么回事:

<强> ReloadTimer.cs

public class ReloadTimer : MonoBehaviour
{
    public static ReloadTimer Instance { set; get; }

    public Image filled;
    public Text text;
    public float coolDownTime = 3;

    public bool isCoolingDown = false;

    void Awake()
    {
        Instance = this;
    }

    void Update()
    {
        if (isCoolingDown == true)
        {
            filled.fillAmount += 1.0f / coolDownTime * Time.deltaTime;

            int percentageInt = Mathf.RoundToInt((filled.fillAmount / coolDownTime) * 10);
            text.text = percentageInt.ToString();
        }
    }
}

<强> TankShootingT.cs

public int m_PlayerNumber = 1;
public Rigidbody m_Shell;
public Transform m_FireTransform;
public AudioSource m_ShootingAudio;
public AudioClip m_FireClip;
public float m_ShellVelocity = 100f;

private string m_FireButton;

public int maxAmmo = 5;
private int currentAmmo;
public float reloadTime = 2f;
private bool isReloading = false;

public ReloadTimer reloadTimer;

public class TankShootingT : NetworkBehaviour
{
    public ReloadTimer reloadTimer;

    private void Start()
    {
        if (!isLocalPlayer)
        {
            return;
        }

        currentAmmo = maxAmmo;
        m_FireButton = "Fire" + m_PlayerNumber;
    }

    private void Update()
    {
        if (isReloading)
            return;

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


            return;
        }

        reloadTimer.UpdateReload();


        if (m_FireButton == "Fire1" && Input.GetButtonUp(m_FireButton))
        {
            // we released the button, have not fired yet
            CmdShoot();
        }

    }

    IEnumerator Reload()
    {
        isReloading = true;
        ReloadTimer.Instance.isCoolingDown = true;

        Debug.Log("Reloading...");

        yield return new WaitForSeconds(reloadTime);

        currentAmmo = maxAmmo;
        isReloading = false;

        ReloadTimer.Instance.isCoolingDown = false;
        ReloadTimer.Instance.filled.fillAmount = 0.0f;
    }



    [Command]
    private void CmdShoot()
    {
        currentAmmo--;

        // Instantiate and launch the shell.
        Rigidbody shellInstance = Instantiate(m_Shell, m_FireTransform.position, m_FireTransform.rotation) as Rigidbody;

        shellInstance.velocity = m_ShellVelocity * m_FireTransform.forward;

        // Server spawns the shell
        NetworkServer.Spawn(shellInstance.gameObject);

        m_ShootingAudio.clip = m_FireClip;
        m_ShootingAudio.Play();
    }
}

希望这有点帮助。