首页 > 解决方案 > 设置武器的射速 - Unity

问题描述

我才刚刚开始尝试在 Unity 中开发游戏,并且只有大约 7 个月的编码经验,因此将不胜感激。

正如标题所说,我正在尝试为这款游戏中的武器设置射速,这是我的代码。

{
    [SerializeField]
    private GameObject _arrowPrefab;
    [SerializeField]
    private float _fireRate = 1f;
    [SerializeField]
    private bool allowFire = false;


    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        fireArrow(); 
    }

    public void fireArrow()
    {
        if (Input.GetMouseButton(0) && allowFire)
        {
            StartCoroutine(FireRate());
        }

        IEnumerator FireRate()
        {
            allowFire = false;
            Instantiate(_arrowPrefab, transform.position, Quaternion.identity);
            yield return new WaitForSeconds(_fireRate);
            allowFire = true;
        }
    }


}

所以如果我按原样运行代码,武器就不会开火。如果我检查 Unity 引擎中的 allowFire 框并将布尔值设置为 true,它会按预期以一秒的间隔触发。但是,如果我回到代码中并最初将布尔值设置为 true,则武器不会开火。

我假设这是我遗漏的一些小东西,但我的搜索只导致我找到看起来完全像我的代码。

标签: c#unity3d

解决方案


检查员在和你一起玩:)

公共字段自动序列化,您的私有“allowFire”由 [SerializeField] 序列化 - 因此它在 Inspector 中公开,并且您已经注意到,您可以在 Inspector 中更改值。

Unity 会记住脚本中的第一个值 (false) 并将其保存(序列化)在 Inspector 中。这在您有多个游戏对象时尤其有用,因为您可以设置不同的值,而与脚本中的值无关。

这意味着,您可以在代码中将变量更改为“true” ,但 Inspector 将使用序列化值覆盖/替换它。

您有多种选择:

  • 在中将值设置为 trueStart()
  • 单击脚本组件(检查器)右侧的 3 个点,然后选择重置
  • 只需在游戏未运行时勾选复选框即可使 Unity 序列化“真实”状态。

许多人为此而堕落。请记住:公共/序列化字段上的代码更改被 Inspector 替换,并且看起来更改您的代码“什么都不做”。


推荐阅读