按下mouse1时播放声音,按下时停止声音

时间:2019-08-12 18:43:45

标签: c# unity3d

我正在Unity中编码,基本上我有一个带有喷雾罐的字符。当我按住mouse1按钮时,我想让“ Spraycan”发出声音。

我在无效更新中尝试过,然后我得到了多个彼此叠加的相同声音。

void Update()
   {
       if (Input.GetButton("Fire1"))
       {
           FindObjectOfType<AudioManager>().Play("Spraycan");
       }
       else if (Input.GetButtonUp("Fire1"))
       {
           //STOP SOUND HERE
       }
   }

编辑:我的AudioManager已完全摘除Brackeys教程,看起来像这样:

using UnityEngine.Audio;
using System;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public Sound[] sounds;

    public static AudioManager instance;


    void Awake()
    {
        if (instance == null)
            instance = this;
        else
        {
            Destroy(gameObject);
            return;
        }

        DontDestroyOnLoad(gameObject);

        foreach (Sound s in sounds)
        {
            s.source = gameObject.AddComponent<AudioSource>();
            s.source.clip = s.clip;


            s.source.volume = s.volume;
            s.source.pitch = s.pitch;
            s.source.loop = s.loop;
        }
    }
    void Start()
    {
        Play("Theme");
    }


    public void Play (string name)
    {
        Sound s = Array.Find(sounds, sound => sound.name == name);
        if (s == null)
        {
            Debug.LogWarning("Sound: " + name + "not found!");
            return;
        }

        s.source.Play();
    }
}

4 个答案:

答案 0 :(得分:2)

山姆

编程的一半是学习如何找到东西。

如果您查看音频源https://docs.unity3d.com/ScriptReference/AudioSource.html上的统一手册

您将看到brackey的“播放”来自何处..再看看还有什么。.您看到什么听起来像是在停止源的播放?

看看您是否可以为此设置停止功能。

答案 1 :(得分:1)

首先,您应该在AudioManager类中定义stop方法。像这样(未测试):

using UnityEngine.Audio;
using System;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public Sound[] sounds;

    public static AudioManager instance;

    void Awake() { ... }
    void Start() { ... }

    public void Play(string name) { ... }

    public void Stop(string name) {
        Sound s = Array.Find(sounds, sound => sound.name == name);
        if (s == null)
        {
            Debug.LogWarning("Sound: " + name + "not found!");
            return;
        }

        s.source.Stop();
    }
}

然后像这样实现它:

void Update()
{
    //Get Button will fire this continuously as you keep it pressed. 
    //Consider using GetButtonDown, or implement delayed repetition.
    if (Input.GetButton("Fire1"))
    {
        FindObjectOfType<AudioManager>().Play("Spraycan");
    }
    else if (Input.GetButtonUp("Fire1"))
    {
        FindObjectOfType<AudioManager>().Stop("Spraycan");
    }
}

侧面说明:您的代码中有一些不利于效率的事情:

  • 如果您使用Dictionary而不是Array进行发音,则查找会更快。

  • FindObjectOfType<AudioManager>()分配给Start()处的变量,并避免在用户按下鼠标按钮时不断查找它。

我不会赘述太多,因为它与问题无关。

旁注2:我完全同意BugFinder的回答。为了成为一名更好的程序员,您应该慢慢开始学习如何浏览API文档并找到所需的内容。

答案 2 :(得分:0)

类似这样的东西:

if (Input.GetButtonDown("fire1")
    AudioManager.Play

if (Input.GetButtonUp("fire1")
    AudioManager.Stop

该AudioManager必须具有Stop()方法。调用AudioSource的.Stop()方法。如果没有,请创建它。

答案 3 :(得分:-3)

Update函数将几乎连续触发,就像每一帧或其他内容一样(我不记得它的间隔) 当按下按钮时,必须使用特定于该按钮的事件。 然后使用一个标志指示该声音正在播放,以便不开始其他播放。 播放关闭时,重新开始播放。 在用户释放按钮之前,您将标志发送为false并停止了声音。