C# 音频不能统一播放
我试图编写一个脚本,当你击中敌人时,它会播放声音,问题是我无法让它播放声音,因为它看到音频源,但我的脚本不会将剪辑传递给它 以下是我目前拥有的代码:C# 音频不能统一播放,c#,unity3d,C#,Unity3d,我试图编写一个脚本,当你击中敌人时,它会播放声音,问题是我无法让它播放声音,因为它看到音频源,但我的脚本不会将剪辑传递给它 以下是我目前拥有的代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Audio; public class makeanoise : MonoBehaviour { public AudioClip hurtSou
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class makeanoise : MonoBehaviour
{
public AudioClip hurtSound;
public AudioSource soundSource;
private void Update()
{
if (!soundSource.isPlaying)
{
soundSource.clip = hurtSound;
soundSource.Play();
}
}
}
您如何获得音频源来播放声音?因为连我的队友都不知道怎么做你需要在场景中安装一个AudioListener,还需要检查3D声音设置,最常见的事情是将AudioListener连接到主摄像机上 检查场景中是否有任何内容以及您的设置 我试图编写一个脚本,当你击中敌人时,它会播放 声音 使用碰撞检测+碰撞器而不是更新功能检测碰撞,然后播放音频:
void OnCollisionEnter(Collision collision)
{
soundSource.Play();
}
如果是2D游戏,请改用OnCollisionInter2D
我不能让它播放声音,它看到音频源,但我的
脚本不会将剪辑传递给它
有很多原因导致音频不能统一播放。你的声音不会播放而不是,因为你把它放在更新
函数中。它不是更新
函数的原因是因为你用if(!soundSource.isPlaying)
保护它,所以它只会在第一个doe播放时再次播放
音频无法在Unity中播放的原因(从可能到不可能)
1。未分配音频剪辑
这是你的音频剪辑
public AudioClip hurtSound;
如果未在编辑器中或通过代码分配或初始化hurtSound
,Unity不会抛出任何错误。它根本不起作用
只需将音频拖动到hurtSound
插槽中,您就可以听到声音了。有时,音频引用会丢失,因此只需再次重复此步骤即可重新创建引用
2。编辑器处于静音状态。如果编辑器被禁用,则不会发出声音,但构建应该有声音。检查并禁用编辑器上的静音
3。每帧播放一次声音。这种错误并不罕见,它会导致音频源没有时间反复播放音频 这个错误的例子: 可能的解决方案: 在播放之前先检查音频是否正在播放。(在这个问题的代码中做了这样的操作,这是正确的!)
4。连接
音频源的游戏对象已被销毁。
这也很常见。如果AudioSource
所连接的游戏对象被破坏,音频将无法播放
修复方法是将音频源
附加到不会破坏的游戏对象上。一个空的游戏对象就可以了
或者,您可以播放音频,等待音频播放完毕,然后将其销毁:
IEnumerator playAudio()
{
//Play Audio
soundSource.Play();
//Wait until it's done playing
while (soundSource.isPlaying)
yield return null;
//Now, destroy it
Destroy(gameObject);
}
5。AudioSource
所连接的游戏对象已被停用
如果具有Audiosource
的游戏对象被停用,音频也将停止。不要停用音频源
游戏对象。有关可能的解决方法,请参见#4
6。代码甚至没有执行
您必须确保播放
代码正在执行。一个简单的Debug.Log
函数调用就足以确定这一点
private void Update()
{
if (!soundSource.isPlaying)
{
soundSource.clip = hurtSound;
soundSource.Play();
Debug.Log("Played");
}
}
如果在控制台选项卡中看不到该日志,则代码不会执行
A.脚本未附加到游戏对象。将其附加到游戏对象:
B.脚本附加到的游戏对象未激活。从编辑器中激活它:
C.未启用脚本。启用它:
7。音频源
已静音或音量为0
8。AudioListener
组件不存在。这是非常不可能的,因为它是自动连接到您的相机。检查是否被错误删除,然后将其重新连接到相机。它必须连接到相机,而不是任何其他对象
9。音频不好。替换为另一个音频
10.Bug。转到“帮助”->“报告错误…”。。用于错误报告的菜单和文件
如果上述一切都失败了,该怎么办。这不太可能是问题所在,但在操作系统进行大更新时可能会发生。您确定您的声音不会在每一帧上反复播放,因此无法听到实际声音吗?不是每帧更新吗?它甚至没有将剪辑传递到源代码,但我会将其放在if语句中。我认为您在这里有一个设计错误,不是那么简单,但我认为播放声音if hit功能应该是敌人对象的一部分。只是一个建议,也许其他人有更好的想法。@Vulpex它应该是这样工作的。@Charleh是的,我确信它玩得不是很快,我只是再试了一次,它仍然无法使用编辑过的代码。默认情况下,相机有一个音频侦听器。你的游戏对象靠近相机吗?删除播放音频的脚本,留下长音频(如歌曲),并在音频源“唤醒时播放/启用”中设置,然后尝试将相机移动到离游戏对象越近的位置。你应该听。音频源是在2d空间播放的,无论离源有多远,你都会在音频源->空间混合(2d-3D)中听到itCheck的声音,一旦你听到声音,你必须对所有被击中和播放音频的行为进行编码。代码中有一个小的输入错误。那应该是while(soundSource.isPlaying)
notwhile(!soundSource.isPlaying)
不,我只想在它不播放的时候播放它,如果它是if(soundSource.isPlaying),它就不会执行代码,因为当声音源到达必须播放的代码时,它不会播放!soundsoure.isplaying,因为声源不可用playing@TheAmerica
IEnumerator playAudio()
{
//Play Audio
soundSource.Play();
//Wait until it's done playing
while (soundSource.isPlaying)
yield return null;
//Now, destroy it
Destroy(gameObject);
}
private void Update()
{
if (!soundSource.isPlaying)
{
soundSource.clip = hurtSound;
soundSource.Play();
Debug.Log("Played");
}
}