unity3d,声音播放

1、audioclip

把音频文件导入到unity以后,音频文件就会变成一个audioclip。


点击,可以看到属性


load type:小文件选择Decompress On Load,大的文件选Compressed In Memory

Compression Format:PCM不压缩,一般选ADPCM,背景音乐,对话啥的选Vorbis/MP3

Sample Rate Setting:一般选Optimize Sample Rate,优化采样率


上面的是根据官方文档得出的结论,不过好像实际运用中还得看具体情况。


2、AudioSource


这是unity播放声音的基本组件,关联了audioclip就能够播放了。声音播放基本是在对这个组件进行操作。


3、AudioListener

每个场景只能有一个的组件,声音播放必须的组件,默认绑在main camera上。


4、示例




点击鼠标左键,生成一个立方体,同时发出声音。(模拟子弹射击,玩家发招的声音情况)

这个声音经常使用,就绑定在控制方

using UnityEngine;
using System.Collections;

public class ThrowCube : MonoBehaviour {

	public GameObject perfab;
	public AudioClip shoot_sound;
	private AudioSource audio_source;

	void Start () {
		audio_source = GetComponent<AudioSource> ();
	}

	// Update is called once per frame
	void Update () {
		if (Input.GetMouseButtonDown (0)) {
			audio_source.PlayOneShot (shoot_sound,GameInfo.effect_sound_volume);

			GameObject shoot_obj = Instantiate (perfab, transform.position, transform.rotation) as GameObject;
			shoot_obj.GetComponent<Rigidbody> ().AddRelativeForce (new Vector3 (Input.mousePosition.x/10, Input.mousePosition.y/5, 50f));
		}
	}
}


立方体掉出屏幕,发出声音并销毁。(模拟怪物被击中的情况)

有种做法,因为这个声音使用频度也可能很高,就把声音绑着控制方,如玩家上。但是,这边为了编程省事,把声音绑着怪物上。

稍微麻烦的地方是要等声音播放完毕再销毁。

using UnityEngine;
using System.Collections;

public class CubeControl : MonoBehaviour
{

	public AudioClip destory_sound;
	private AudioSource audio_source;

	void Awake ()
	{
		audio_source = GetComponent<AudioSource> ();
		audio_source.mute = GameInfo.effect_sound_mute;
	}

	void OnBecameInvisible ()
	{
		audio_source.PlayOneShot (destory_sound,GameInfo.effect_sound_volume);
		InvokeRepeating ("DestorySelf", 0, .1f);
	}

	void DestorySelf(){
		if (!audio_source.isPlaying) {
			Destroy (gameObject);
		}
	}
}


场景开始播放背景音乐

点击鼠标右键更换播放的背景音乐(模拟事件触发背景音改变)

using UnityEngine;
using System.Collections;

public class BgSoundControl : MonoBehaviour
{

	public AudioClip[] bg_sounds;
	private AudioSource audio_source;

	void Awake ()
	{
		audio_source = GetComponent<AudioSource> ();
		audio_source.volume = GameInfo.bg_music_volume;
		audio_source.clip = bg_sounds [0];
	}
	
	// Update is called once per frame
	void Update ()
	{
		if (Input.GetMouseButtonDown (1)) {
			audio_source.clip = bg_sounds [1];
			audio_source.Play ();
		}
	}
}


添加音量控制

为了方便控制,把背景音乐的游戏对象方到指定的tag便于控制。

建立一个静态类存放音量信息,同时便于多方调用

单次播放的声音,在播放的时候,传入音量大小的参数控制音量,背景声音是控制audiosource的volume值控制音量

public static class GameInfo {

	public static float effect_sound_volume;
	public static float bg_music_volume;

	public static bool effect_sound_mute;
	public static bool bg_music_mute;

}


音量设置的类

using UnityEngine;
using System.Collections;
using UnityEngine.UI;




public class SoundSetControl : MonoBehaviour
{
	private AudioSource bg_music;
	public Slider sound_slider;
	public Slider music_slider;
	public Toggle sound_toggle;
	public Toggle music_toggle;
	public Button confirm_button;
	public Button exit_button;
	public AudioClip sound_clip;
	public AudioClip music_clip;
	private AudioSource audio_source;
	public delegate void SoundSetAction();
	public event SoundSetAction OnClose;


	// Use this for initialization
	void Awake ()
	{
		audio_source = GetComponent<AudioSource> ();
		AudioSource[] list = FindObjectsOfType<AudioSource> ();
		for (int i = 0; i < list.Length; i++) {
			if (list [i].gameObject.tag == "BackgroundMusic") {
				bg_music = list [i];
				break;
			}
		}
		LoadSoundSet ();
		SetUI ();
		Confirm ();
		gameObject.SetActive (false);
	}

	void OnEnable (){
		GetComponent<AudioSource> ().mute = false;
	}
		
	public void SetEffectSound ()
	{
		audio_source.PlayOneShot (sound_clip, sound_slider.value);
		sound_toggle.isOn = false;
	}

	public void SetBgMusic ()
	{
		audio_source.PlayOneShot (music_clip, music_slider.value);
		music_toggle.isOn = false;
	}

	//根据变量设置游戏音量
	public void Confirm(){
		GameInfo.bg_music_mute = music_toggle.isOn;
		GameInfo.effect_sound_mute = sound_toggle.isOn;
		GameInfo.bg_music_volume = music_slider.value;
		GameInfo.effect_sound_volume = sound_slider.value;

		Save ();

		AudioSource[] list = FindObjectsOfType<AudioSource> ();
		for (int i = 0; i < list.Length; i++) {
			list [i].mute = GameInfo.effect_sound_mute;
		}
		bg_music.mute = GameInfo.bg_music_mute;
		bg_music.volume = GameInfo.bg_music_volume;
	}

	public void Exit(){
		//SoundSetAction ();
		if (OnClose != null) {
			OnClose ();
		}
		gameObject.SetActive (false);
	}
		
	private void LoadSoundSet ()
	{
		if (PlayerPrefs.GetInt ("SoundMute", 1)==1) {
			GameInfo.effect_sound_mute = true;
		} else {
			GameInfo.effect_sound_mute = false;
		}

		if (PlayerPrefs.GetInt ("BgMusicMute", 1)==1) {
			GameInfo.bg_music_mute = true;
		} else {
			GameInfo.bg_music_mute = false;
		}

		GameInfo.effect_sound_volume = PlayerPrefs.GetFloat ("EffectSoundVolume", 1f);
		GameInfo.bg_music_volume = PlayerPrefs.GetFloat ("BgMusicVolume", 1f);
	}

	private void SetUI(){
		sound_slider.value = GameInfo.effect_sound_volume;
		sound_toggle.isOn = GameInfo.effect_sound_mute;
		music_slider.value = GameInfo.bg_music_volume;
		music_toggle.isOn = GameInfo.bg_music_mute;
	}

	private void Save(){
		if (GameInfo.effect_sound_mute) {
			PlayerPrefs.SetInt ("SoundMute", 1);
		} else {
			PlayerPrefs.SetInt ("SoundMute", 0);
		}

		if (GameInfo.bg_music_mute) {
			PlayerPrefs.SetInt ("BgMusicMute", 1);
		} else {
			PlayerPrefs.SetInt ("BgMusicMute",0);
		}

		PlayerPrefs.SetFloat ("EffectSoundVolume", GameInfo.effect_sound_volume);
		PlayerPrefs.SetFloat ("BgMusicVolume", GameInfo.bg_music_volume);
	}
}


关闭的时候,用了事件,这样做的想法是,把这个类绑在canvas上,整个canvas可以做成预制件,方便在多个场景中使用。

事件交由统一的事件处理类,将事件交到其他类去执行。目的是解耦合。

using UnityEngine;
using System.Collections;

public class EventManage : MonoBehaviour {

	private GameManage gameManage;
	private SoundSetControl soundSetControl;

	void Awake(){
		gameManage = FindObjectOfType<GameManage> ();
		soundSetControl = FindObjectOfType<SoundSetControl> ();
	}
		

	// Use this for initialization
	void Start () {
		soundSetControl.OnClose+=gameManage.GamePlay;
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class GameManage : MonoBehaviour {

	//public delegate void GameAction();
	//public event GameAction OnGamePause,OnGamePlay;

	public GameObject sound_canvas;

	private ThrowCube throw_cube;
	private AudioSource bg_music;

	public Text txt;

	// Use this for initialization
	void Awake () {
		throw_cube = FindObjectOfType<ThrowCube> ();

		AudioSource[] list = FindObjectsOfType<AudioSource> ();
		for (int i = 0; i < list.Length; i++) {
			if (list [i].gameObject.tag == "BackgroundMusic") {
				bg_music = list [i];
				break;
			}
		}
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetKey (KeyCode.Escape)) {
			sound_canvas.SetActive (true);
			GamePause ();
		}

		txt.text = GameInfo.bg_music_mute.ToString () + ";" + GameInfo.bg_music_volume.ToString () + ";" + GameInfo.effect_sound_mute.ToString () + ";" + GameInfo.effect_sound_volume.ToString ();
	}

	public void GamePause(){
		throw_cube.enabled = false;
		bg_music.Pause ();
	}

	public void GamePlay(){
		throw_cube.enabled = true;
		bg_music.Play ();
	}
}


内容下载:http://download.csdn.net/detail/wuyt2008/9474143




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值