unity音效audio

先看了官方的一些文档,了解下基本知识:

音频侦听器 (Audio Listener) http://edu.china.unity3d.com/learning_document/getData?file=/Manual/Sound.html

理解几个概念就够了:

音频片段 (Audio Clip)

简单理解为unity导入的音频文件

音频源 (Audio Source)

控制声音的脚本AudioSource,里面有一些控制声音的属性,其中一个属性就是Audio Clip。Audio Source绑到哪个Gameobject上,声音就从哪里发出来。

音频侦听器 (Audio Listener)

相当于耳朵,unity运行时需要一个Audio Listener存在,才能播放出声音,但是同时只允许存在一个Audio Listener


关于“unity导入的音频文件”,文档里说了很多音频格式可以支持,实际上开发游戏的话全部搞成mp3是最省事的,否则遵循一些原则:
短的效果音可以用wav等大格式无损音频文件,在unity中被称为原生 (Native) 格式,好处是音质很高,缺点是比较大内存占用多些。因为是短音效,用高品质格式且不压缩也没关系,一般每个音效不超过100kb。如果文件源是MP3是无法选择原生 (Native) 格式的,因为mp3本身就是压缩格式。原生 (Native) 格式加载后在内存中无法压缩,只有2个选项:

unity音效audio_第1张图片

unity音效audio_第2张图片
背景音乐必须用mp3格式,而且加载方式必须选择在内存中压缩(compressed in memory)或者流方式(stream from disc),这样会节省很多内存。在内存中压缩的音效在播放时需要解压,解压后占用内存比压缩状态多10倍,流方式一遍从外部读文件一边解析播放出来,适用于非常大的单音频文件。这两种方式对节省内存有好处,但会解压消耗cpu的性能。
unity音效audio_第3张图片
一个Gameobject可以有多个AudioSource。

关于2D和3D Sound:
audio clip还可以设置3D Sound属性,如果不选择,AudioSource对象在任何位置声音大小都一样。3D声音如果距离Audio Listener远就会自动变小,还可以调整其他3D相关属性。
没有音量随距离变化之类的需求就全部设置为2D。

关于Audio Listener:
运行时不许存在多个Audio Listener,如果有2个以上会报一个错误:
There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.
但是还是会用其中一个Audio Listener向扬声器输出声音,一般用相机上那个。
unity会自动在main camera上创建Audio Listener,根据需求决定到底用不用camera的这个Audio Listener。
对于3D audio clip,如果距离camera远处有个AudioSource声音源,这个声音会很小。
如果要实现音量渐变的效果,可以调整AudioSource与Audio Listener的距离,也可以用tween来渐变audio的属性。

tips:
在unity编辑器上部有个音量图标,编辑状态可直接听场景中的音效,相当于让每个有效的音效从头播放。
如果禁止Audio Listener,声音会继续播放,但麦克风不会有声,重新启用Audio Listener声音还在继续,不是从头播放。
可以在多个Gameobject上绑Audio Listener脚本,同时只启用一个就没问题。

unity软件的不稳定有时会造成听不见任何声音,杀掉unity进程重启下。如果在新项目中测试没问题,可以直接把项目发布出来,真机环境没问题。
editor环境都ok,但是发布到ipad可能会没有声音。

看了几个帖子,这个还可以:
http://bbs.9ria.com/thread-224197-1-1.html

接下来要搞个SoundManager
using Engine.Resource;
using System.Collections.Generic;
using UnityEngine;
/**
 * 游戏的声音和音效
 * */
public class SoundManager : MonoBehaviour
{
	public static SoundManager Instance;
	public const string SOUND_PATH = "sound/";

	private AudioSource BGMusicAudio;//只有一个背景乐
	private List SoundAudios = new List();//可同时存在多个音效

	static int musicMute;
	static int MusicMute {
		get {
			musicMute = PlayerPrefs.GetInt("musicMute", 0);
			return musicMute;
		}
		set {
			if(musicMute != value)
			{
				musicMute = value;
				PlayerPrefs.SetInt("musicMute", value);
			}
		}
	}

	static int soundMute;
	static int SoundMute {
		get {
			soundMute = PlayerPrefs.GetInt("soundMute", 0);
			return soundMute;
		}
		set {
			if(soundMute != value)
			{
				soundMute = value;
				PlayerPrefs.SetInt("soundMute", value);
			}
		}
	}

	static float globalVolumeScale = 1f;
	static float GlobalVolumeScale {
		get {
			globalVolumeScale = PlayerPrefs.GetFloat("globalVolumeScale", 1f);
			return globalVolumeScale;
		}
		set {
			if (globalVolumeScale != value)
			{
				globalVolumeScale = value;
				PlayerPrefs.SetFloat("globalVolumeScale", value);
			}
		}
	}

	void Awake()
	{
		Instance = this;
		DontDestroyOnLoad(this);
	}
	void Start()
	{
		BGMusicAudio = this.gameObject.AddComponent();
		BGMusicAudio.loop = true;
		BGMusicAudio.priority = 128;
		PlayMusic("bg1");
	}
	/// 播放音乐
	public void PlayMusic(string musicName)
	{
		PlayMusic(musicName, 1, 1);
	}
	public void PlayMusic(string musicName, float volume, float pitch)
	{
		AudioClip clip = AssetManager.GetInstances().GetAsset(SOUND_PATH + musicName, typeof(AudioClip)) as AudioClip;
		if(clip != null)
		{
			BGMusicAudio.clip = clip;
			BGMusicAudio.volume = volume * globalVolumeScale;
			BGMusicAudio.pitch = pitch;
			BGMusicAudio.Play();
		}
		BGMusicAudio.mute = (musicMute==1);
	}
	public void PauseMusic()
	{
		BGMusicAudio.Pause();
	}
	public void StopMusic()
	{
		BGMusicAudio.Stop();
	}
	public void MuteMusic(bool mute)
	{
		musicMute = mute?1:0;
		BGMusicAudio.mute = mute;
	}
	/// 播放音效
	public void PlaySound(string soundName)
	{
		PlaySound(soundName, 1, 1);
	}
	public void PlaySound(string soundName, float volume, float pitch)
	{
		AudioSource target = null;
		foreach(AudioSource sound in SoundAudios)
		{
			Debug.Log("isplaying" + sound.isPlaying);
			if(!sound.isPlaying)
			{
				target = sound;
			}
		}
		if(null == target)
		{
			target = this.gameObject.AddComponent();
			target.loop = false;
			target.priority = 128;
			SoundAudios.Add(target);
		}
		target.volume = volume * globalVolumeScale;
		target.pitch = pitch;
		target.mute = (soundMute==1);

		AudioClip clip = AssetManager.GetInstances().GetAsset(SOUND_PATH + soundName, typeof(AudioClip)) as AudioClip;
		if(clip != null)
		{
			target.clip = clip;
			Debug.Log("clip name : " + clip.name);
			//target.PlayOneShot(clip);
			target.Play();
		}
	}

	public void MuteSound(bool mute)
	{
		soundMute = mute?1:0;
		foreach(AudioSource sound in SoundAudios)
		{
			sound.mute = mute;
		}
	}
}


 
   

你可能感兴趣的:(经验,心得,unity)