【问题标题】:Play sound while button is held down按住按钮时播放声音
【发布时间】:2018-04-15 17:33:41
【问题描述】:

我有一个 1.5 秒的音频文件 - 一声枪响。我希望能够在鼠标按下时播放声音(就像自动武器一样),我使用InvokeRepeating 调用了射击方法,重复率非常低:

if (Input.GetButtonDown("Fire1"))
{
    InvokeRepeating("Shoot", 0f, 1f/currentWeapon.fireRate);
} else if (Input.GetButtonUp("Fire1"))
{
    CancelInvoke("Shoot");
}

这就是Shoot方法:

void Shoot()
{
    shootSound.PlayOneShot(shoot);
}

问题是声音被切断并且听不到镜头,它只播放了几分之一秒,而不是整个音频片段。我试过 play() 和 playOneShot()。

是否有一个选项可以单独播放每个剪辑,比如创建它的克隆?

谢谢!

【问题讨论】:

  • PlayOneShot 适合在这种情况下使用,但如果没有您的代码,就不可能知道您在做什么。
  • 我添加了我提到的方法。感谢您的评论!
  • 1.不,我希望他们互相“叠加”演奏,只需从每个 InvokeRepeating 的重复开始,然后让它演奏到最后。目标是让它听起来像机关枪。 2. Shoot函数是唯一调用PlayOneShot()的函数。 shootSound 是 AudioSource,shoot 是 AudioClip。 3. 一直播放到最后。声音本身很好。

标签: c# unity3d


【解决方案1】:

代码中的大部分内容都是不必要的。你不需要InvokeRepeating。由于您想在按住按钮时继续播放声音(射击效果),因此应使用Input.GetButton 而不是Input.GetButtonDown,因为Input.GetButton 在按住按钮的每一帧都为真,并且适用于自动火。

还应使用带有Time.time 的简单计时器来确定播放声音的速率,然后使用PlayOneShot 函数播放声音。

这应该是这样的:

public float playRate = 1;
private float nextPlayTime = 0;

public AudioSource shootSound;
public AudioClip shoot;


void Update()
{
    if (Input.GetButton("Fire1") && (Time.time > nextPlayTime))
    {
        Debug.Log("Played");
        nextPlayTime = Time.time + playRate;
        shootSound.PlayOneShot(shoot);
    }
}

playRate 变量设置为1,这意味着1 每秒声音。您可以使用此变量来控制播放速率。降低它以播放许多声音。 0.1f 的值似乎没问题,但这取决于声音。

【讨论】:

  • 感谢您的回答和编辑。我试过你的方法,但不幸的是声音一直中断。即使我尝试使用较高的playRate,例如 2.5f(比剪辑长),它仍然在一开始就被切断。还有其他建议吗?
  • 我在一个新的测试场景中尝试过。该脚本有效,但它会播放声音直到结束,然后才开始下一个 - 不管playRate。我试图找到一种方法来一次又一次地播放它,但是在“层”中——比如在每次迭代中添加一个新的AudioSource,它将与之前的迭代同时播放,而不仅仅是循环播放原始声音。希望我说得更清楚。
【解决方案2】:

我解决了这个问题,我使用了一个带有 AudioSource 的空 GameObject,并在每个 Shoot 方法中实例化了它的副本:

GameObject gunObj = Instantiate(gunObject);
Destroy(gunObj, 1f);

现在完美运行!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多