Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按下按钮时播放声音_C#_Unity3d - Fatal编程技术网

C# 按下按钮时播放声音

C# 按下按钮时播放声音,c#,unity3d,C#,Unity3d,我有一个1.5秒的音频文件-一个枪声。我希望能够在按下鼠标时播放声音(就像自动武器),我使用invokererepeating调用shot方法,重复率非常低: if (Input.GetButtonDown("Fire1")) { InvokeRepeating("Shoot", 0f, 1f/currentWeapon.fireRate); } else if (Input.GetButtonUp("Fire1")) { CancelInvoke("Shoot"); } 这就

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

if (Input.GetButtonDown("Fire1"))
{
    InvokeRepeating("Shoot", 0f, 1f/currentWeapon.fireRate);
} else if (Input.GetButtonUp("Fire1"))
{
    CancelInvoke("Shoot");
}
这就是拍摄方法:

void Shoot()
{
    shootSound.PlayOneShot(shoot);
}
GameObject gunObj = Instantiate(gunObject);
Destroy(gunObj, 1f);
问题是声音被切断,镜头听不到,它只播放了几分之一秒而不是整个音频片段。我试过play()和playOneShot()

是否有一个选项可以分别播放每个剪辑的全部内容,比如创建它的克隆


谢谢

代码中的大部分内容都是不必要的。您不需要为此调用重复。由于您希望在按住按钮的同时继续播放声音(射击效果),因此应使用
Input.GetButton
而不是
Input.GetButtonDown
,因为按下按钮的每一帧都是真的,并且该按钮是为自动点火等功能而设计的

带有
时间的简单计时器。时间也应用于确定播放声音的速率,然后使用
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
的值看起来不错,但这取决于声音。

我解决了这个问题,我使用了一个带有音频源的空游戏对象,并在每个拍摄方法中实例化了一个副本:

void Shoot()
{
    shootSound.PlayOneShot(shoot);
}
GameObject gunObj = Instantiate(gunObject);
Destroy(gunObj, 1f);

现在效果很好

PlayOneShot适合在这种情况下使用,但是如果没有您的代码,就不可能知道您在做什么。谢谢你的评论!1.不,我想让他们彼此“在上面”,只是从每个调用重复开始,然后让它一直播放到最后。目标是让它听起来像一把机关枪。2.shot函数是唯一调用PlayOneShot()的函数。shootSound是音频源,shoot是音频剪辑。3.它将声音播放到最后。声音本身很好。谢谢你的回答和编辑。我试过你的方法,但不幸的是声音一直被切断。即使我尝试使用高播放速率,比如2.5f(比剪辑长),它仍然在一开始就被切断。还有其他建议吗?我在一个新的测试场景中试过了。脚本可以工作,但它会将声音播放到最后,然后才开始下一个脚本-无论
播放速率如何。我试图找到一种反复播放的方法,但要“分层”——比如在每次迭代中添加一个新的
音频源
,它将与之前的迭代同时播放,而不仅仅是循环播放原始声音。希望我说得更清楚。