我正在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();
}
}
答案 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并停止了声音。