unity之声音播放

本文详细介绍了在Unity环境中播放声音所需的组件配置,并提供了两种添加声音的方法:手动添加和代码添加。同时,针对Unity4.0版本播放声音时存在的问题,通过对比Unity3.5版本,分享了解决方案。

http://bbs.9ria.com/thread-224197-1-1.html

[size=10.5000pt]今天发现自己在[size=10.5000pt]unity4.0里面用PlayOnAwake这个方法的时候没有反应,然后我在别的电脑上也试了一下,还是不可以用,感觉代码上面是没有什么问题的啊,然后去群里面问别人,得到的回复只是一个菜鸟。好吧,菜鸟来总结下我自己知道的播放声音吧。

[size=10.5000pt]要想声音在场景中播放必须要用到两个组件,一个是音源组件AudioSource.一个是声音的监听的组件AudioListener
[size=10.5000pt]首先,最容易的让它可以播放声音,就是直接手动添加组件。

[size=10.5000pt]先建立一个空对象,或者一个对象cube或者其他
1 
[size=10.5000pt]然后,在这个对象上添加声音源
2 
[size=10.5000pt]这里是刚刚添加的声音源,在声音剪辑[size=10.5000pt]AudioClip上添加声音,(这个声音是自己导入进来的)。
3 
[size=10.5000pt]然后运行,就可以播放声音了。

[size=10.5000pt]这里本来是要添加AudioListener,但是在添加AudioSource的时候,它会自动在Main Camera上添加AudioListener
4 
[size=10.5000pt]如果你希望声音不是在Camera上的,譬如说希望把声音监听就放在声音源的地方,这样就在有声音源的对象上添加AudioListener
5 
6 
[size=10.5000pt]但是如果这样的话,运行的时候,会显示There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.
[size=10.5000pt]是因为场景里面有两个声音监听在监听一个声音,所以,去掉Camera上的那个就好了。
7 



[size=10.5000pt]另外呢,还可以用代码来添加声音。

[size=10.5000pt]使用这句来添加组件[RequireComponent(typeof(AudioSource))]这个是在[size=10.5000pt]C#里面的写法
[size=10.5000pt]在JS里面是@Script [size=10.5000pt]RequireComponent[size=10.5000pt](AudioSource)
[size=10.5000pt][RequireComponent(typeof(这里面是要添加的组件
[size=10.5000pt]不管是[size=10.5000pt]C#还是JS的,后面都是不用“;”来结尾的。
8 
[size=10.5000pt]PlayOneShot[size=10.5000pt] ([size=10.5000pt]clip[size=10.5000pt] : AudioClip[size=10.5000pt], [size=10.5000pt]volumeScale[size=10.5000pt] : float = 1.0F)

[size=10.5000pt]这里要注意的是,用[size=10.5000pt][RequireComponent(typeof(AudioSource))]这种方法来添加组件,是不可以在空对象上添加的,要添加在一个实体上,譬如说[size=10.5000pt]cube
[size=10.5000pt]点击Hierarchy下面的create弹出窗口里面可以选择的对象,都是可以用这种方法来添加组件的
9 
[size=10.5000pt]下面我是在一个[size=10.5000pt]cube上添加该代码,就会自动添加AudioSource组件了。
10 
[size=10.5000pt]这个组件是用代码添加的,所以跟手动添加的有少少不一样,就是当你[size=10.5000pt]remove这个组件的时候,就会弹出如下窗口
11 
[size=10.5000pt]想去掉它必须先去掉这个[size=10.5000pt]sound2的脚本。
[size=10.5000pt]在运行的时候,点击界面上的soundPlay按钮就会播放一次声音。
12 
[size=10.5000pt]当我们再添加一个按钮来播放另外一个声音的时候还是可以共用这个声音源[size=10.5000pt]AudioSource
[size=10.5000pt]譬如我们现在再添加一个按钮321,代码如下
13 
[size=10.5000pt]运行时,控制面板中显示声音源是只有一个的,如下图所示。
14 
[size=10.5000pt]界面上会出现两个按钮,点击不同的按钮就出现不同的声音
15 


[size=10.5000pt]还有一种播放声音的代码跟这个略有不同
代码如下
16 
[size=10.5000pt]这个是定义了声音源跟声音剪辑,还有声音的音量。
[size=10.5000pt]然后添加一个声音源的组件给定义的声音源,声音源的音频剪辑为定义的音频剪辑,声音源的大小为定义的大小[size=10.5000pt]0.6
[size=10.5000pt]然后让声音源在Start里面播放。就是开始运行的时候播放一次。
[size=10.5000pt]然后将代码放到一个GameObject上,如下图所示
17 
[size=10.5000pt]在运行的时候,就会显示声音源的组件,而且这里的声音源是一个声音源配对一个声音剪辑。代码就是,加多一个[size=10.5000pt]AudioSourceAudioClip
18 
[size=10.5000pt]在控制面板里面运行时显示如下

19 

[size=10.5000pt]这里遇到一个问题是,在[size=10.5000pt]unity4.0 的时候使用PlayOnAwake()这个方法没有效果,但是同样的代码,在unity3.5里面是可以实现的。
[size=10.5000pt]下面是写在unity3.5里面的代码
20 
[size=10.5000pt]而且我在别的电脑上使用unity4.0以上版本的用PlayOnAwake()这个都是没有声音的,不过我是用AudioSource.Play()来让其在4.0里面发出声音

[size=10.5000pt]如果说是同一个游戏对象上需要发出不同的声音,可以用第一种代码。
[size=10.5000pt]如果是不同的游戏对象上发出声音,就可以用第二种代码。

Unity中实现音频播放功能可以通过多种方式完成,具体取决于项目的需求,如是否需要流式播放、是否需要跨平台支持、是否需要内存优化等。以下是几种常见的实现方式及注意事项: ### 基本音频播放 Unity 提供了 `AudioSource` 组件用于播放音频文件。开发者可以通过加载 `AudioClip` 并调用 `Play()` 方法来播放音频。以下是一个基础的播放方法示例: ```csharp public void Play(string strSoundName, float autoDestroyTime = 0f, bool bLoop = false, float fPerTime = 1f) { if (!strSoundName.Equals("")) { AudioClip clip = Resources.Load<AudioClip>(strSoundName); if (_csAudio == null) Awake(); if (clip != null) { _csAudio.loop = false; _csAudio.clip = clip; if (_fDelay > 0.0f) _csAudio.PlayDelayed(_fDelay); else _csAudio.Play(); _bLoop = bLoop; _fPerTime = fPerTime; if (_bLoop) { Invoke("AutoLoop", _fPerTime); } else { float fAutoDestroyTime = clip.length; if (autoDestroyTime > 0) fAutoDestroyTime = autoDestroyTime; Invoke("Stop", autoDestroyTime); } } else { Stop(); } } } ``` ### 流式播放WAV音频文件 对于较大的音频文件,可以采用流式播放方式,无需等待文件完全下载即可开始播放。该方法适用于从网络加载音频资源并实时播放的场景,例如从远程服务器下载音频文件并播放: ```csharp Coroutine AudioPlay; AudioClip downloadedClip; public AudioSource audioSource { get; set; } public void Play(params string[] urls) { StopPlaying(); AudioPlay = StartCoroutine(LoadAudioClips(urls)); } IEnumerator LoadAudioClips(string[] audioUrls) { foreach (string url in audioUrls) { if (url != null && url != "") using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.WAV)) { yield return www.SendWebRequest(); if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError("Failed to load audio: " + url + ", error: " + www.error); } else { downloadedClip = DownloadHandlerAudioClip.GetContent(www); audioSource.clip = downloadedClip; audioSource.Play(); while (audioSource.isPlaying) { yield return null; } } } } } public void StopPlaying() { if (AudioPlay != null) { StopCoroutine(AudioPlay); } audioSource.Stop(); } ``` ### 音频资源的内存优化 Unity 在导入音频文件时会自动将其转换为适合目标平台的格式,例如 PCM、ADPCM、Vorbis/MP3 和 HEVAG。不同平台对音频格式的支持程度不同,因此在开发过程中需要注意选择合适的音频格式以优化内存使用[^3]。 ### 相关问题 1. 如何在Unity中实现音频的循环播放? 2. Unity中如何处理不同平台对音频格式的支持差异? 3. 如何在Unity中实现音频的延迟播放? 4. Unity中有哪些方法可以用来优化音频资源的加载和播放性能?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值