unity3d - Unity-游戏收藏品不播放音效
问题描述
我在收藏品上设置了一个脚本,如果当前对象由标记为“播放器”的对象触发,它应该播放声音,更新分数并自行销毁。现在,更新乐谱和销毁对象可以正常工作,但不会播放声音。我不太清楚为什么。这是代码:
[SerializeField] private float cherries=0;
[SerializeField] private Text score;
[SerializeField] private AudioSource ad;
private void Start() {
}
private void OnTriggerEnter2D(Collider2D collision) {
if(collision.tag=="Player" ){
ad.Play();
cherries+=1;
score.text=cherries.ToString();
Destroy(this.gameObject);
}
解决方案
如果您要在正在收集的对象上使用音频源,您需要确保它存在足够长的时间来播放剪辑。
ad.Play();
// Use delayed Destroy overload to give it time to play before the object is destroyed
Destroy(gameObject, 1f);
但是,我建议使用 PlayOneShot(AudioClip) 将您的音频集中在单例音频管理器上,这样您就可以卸载音频剪辑的播放并让对象在应该被销毁时被销毁。
这是一个使用 AudioManager 的示例
public AudioManager : MonoBehaviour
{
public static AudioManager Instance {get; private set;}
[SerializeField]
private AudioClip _cherriesAudioClip; // Assign through inspector
[SerializeField]
private AudioSource _audioSource; // Assign through inspector
void Awake()
{
// Make sure there isn't another instance already
if (Instance != null)
{
Destroy(gameObject);
return;
}
// Instantiate the static game object instance
Instance = this;
// Make sure it stays alive
DontDestroyOnLoad(gameObject);
}
/// Call from another script to play your clip
public void PlayCherriesPickup()
{
_audioSource.PlayOneShot(cherriesAudioClip);
}
然后你像这样使用静态实例从你的可收集脚本中调用它
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag=="Player" )
{
AudioManager.Instance.PlayCherriesPickup();
cherries += 1;
score.text=cherries.ToString();
Destroy(gameObject); // No need to delay the destroy
}
}
推荐阅读
- scala - 将聚合结果转换为列名、聚合函数和值的 3 个单独字段
- html - html doc 不使用外部 css 样式表
- django - “列表”对象没有属性“过滤器”
- google-chrome-extension - 如何在浏览器中中断或暂停 http 状态码 301 请求
- python - 用 Pandas 中的先前值填充多列内容的 nan 行
- wordpress - 有没有办法将完整的 WordPress“Builders Landing Page”主题 DEMO 上传到新的 WordPress 帐户?
- powershell - 索引超出了数组 powershell 的范围
- javascript - 使用 http get 请求获取 javascript 对象的方法?
- javascript - 为什么可扩展列表未显示在选项卡式活动中?
- javascript - bot.sendMessage 不是函数