[Unity2D]声音播放

    声音是一个游戏里面必不可少的内容,在Unity游戏引擎里面可以通过Audio Source组件来添加声音的效果。如下图所示:

    我们给摄像机添加Audio Source组件,然后把声音文件拖放到Audio Clip属性上,运行游戏就可以听到声音的播放效果了,实现起来很简单。

下面来看一下Audio Source的属性:

音频剪辑(Audio Clip): 将被播放的声音剪辑文件。

静音( Mute): 如果启用,声音将被播放,但没有声音。

直通效果( Bypass Effects): 应用到音频源的快速"直通"过滤效果。一个简单的方法来打开/关闭所有特效。

唤醒时播放( Play On Awake): 声音会在场景启动的时候开始播放。如果禁用,则需要从脚本中使用的play()命令来启动它。

循环( Loop): 启用这个属性使音频剪辑(Audio Clip)在播放结束后循环 。

优先权( Priority): 确定场景所有并存的音频源之间的优先权。(0=最重要的优先权。256 =最不重要。默认为128。)

音量( Volume): 声音从距离音频监听器(Audio Listener)1个世界单位(1米)处的音量。

音调( Pitch): 改变音调(Pitch)值,可以减速/加速音频剪辑的播放。1是正常播放速度。

3D声音设置(3D Sound Settings):

   平衡调整级别 (Pan Level): 设置多少,3D引擎在音频源上有效果。

   扩散 (Spread): 设置3D立体声或者多声道音响在扬声器空间的传播角度。

   多普勒级别 (Doppler Level): 决定了多少多普勒效应将被应用到这个音频信号源(如果设置为0,就是无效果)。

   最小距离 (Min Distance): 在最小距离之内,声音会保持最响亮。 在最小距离之外,声音就会开始衰减。

   最大距离 (Max Distance): 声音停止衰减距离。超过这一点,它将在距离侦听器最大距离单位,保持音量,不在衰减。

衰减模式 (Volume Rolloff): 声音淡出的速度有多快。该值越高,越接近侦听器最先听到声音(这是由图形决定)。 • 对数衰减(Logarithmic Rolloff): 当你接近的音频源,声音响亮,但是当你远离对象,声音下降显着快。 • 线性衰减(Linear Rolloff): 越是远离音频源的,你可以听到的声音越小。 • 自定义衰减(Custom Rolloff): 根据你设置的衰减图形,来自音频源的声音行为。

2D声音设置(2D Sound Settings):

   2D平衡调整 (Pan 2D): 设置多少,引擎在音频源上有效果。

    在Unity里面我们可以对声音文件进行编辑设置其效果,点击声音文件,可以看到Inspector视图如下所示:

下面我们来看一下这几个属性的含义:

音频格式(Audio Format): 在运行时被应用到声音上的特定格式。 • 原生的(Native):较大文件尺寸,质量较高。最适用于很短的音效。 • 压缩的(Compressed):较小文件尺寸,质量较低/不稳定。最适用于中等长度音效与音乐。

三维声音(3D Sound):如果启用,音乐将在3D空间中播放。

强制单声道(Force to mono):如果启用,该音频剪辑将向下混合到单通道声音。

加载类型(Load Type): 运行时Unity加载音频的方法。 • 加载时解压缩(Decompress on load): 加载后解压缩声音。使用于较小的压缩声音,以避免运行时解压缩的性能开销。(将使用比在它们在内存中压缩的多10倍或更多内存,因此大文件不要使用这个。) • 在内存中压缩(Compressed in memory): 保持声音在内存中(压缩的)在播放时解压缩。这有轻微的性能开销(尤其是OGG / Vorbis格式的压缩文件),因此大文件使用这个。 • 从磁盘流(Stream from disc): 直接从磁盘流读取音频数据。这只使用了原始声音占内存大小的很小一部分。使用这个用于很长的音乐。取决于硬件,一般建议1-2线程同时流。

压缩(Compression): 压缩量应用于压缩的剪辑,保持在一个足够小的尺寸,以满足您的文件大小/分配需要。可以拖动滑条来调整大小,播放声音来判断音质,滑动条后面可以看到文件大小的统计。

硬件解码(Hardware Decoding):(仅iOS)用于iOS设备压缩的音频。使用苹果的硬件解码来减少CPU的密集解压缩。(同一时间只能有一个硬件音频流解压缩,包括背景的iPod音频。)

无缝循环(Gapless looping):(仅Android/iOS)压缩一个完美的循环音频源文件(非压缩的PCM格式)保持循环。标准的MPEG编码器插入silence循环点,播放时有小的"click" 或 "pop" Unity为你顺畅处理这个问题。

    除此之外我们还注意到 Inspector视图上有一个Audio Listener音频侦听器组件,音频监听器没有属性。必须被添加才能使用,默认地添加到主照相机。每个场景只能有1个音频侦听器正常工作。

 

    在实际的游戏项目中通常是需要通过脚本来控制音频的操作和管理的工作,下面我们来看一下如何使用脚本来管理和操作音频播放。首先创建一个声音管理的脚本添加到摄像机上:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class SoundManager : MonoBehaviour {
    
    public int channelCount;
    public  IList<AudioSource> _channels;
    public AudioClip[] clips;//声音对象数组

    void Awake()
    {
        channelCount = 10;
        _channels = new List<AudioSource>();
        for (int i = 0; i < channelCount; i++)
        {
            // 通过代码添加多个AudioSource组件,不同声音对应不同的频道,这样就可以同时播放多个声音
            _channels.Add(this.gameObject.AddComponent<AudioSource>());
        }
    }

    public void PlaySound (int id,bool loop, float vol)
    {
        int c = FindChannel();
        if (c == -1)
        {
            return;
        }
        _channels[c].clip= clips [id];//播放的声音对象
        _channels[c].loop = loop;//是否循环
        _channels[c].volume = vol;//音量大笑傲
        _channels[c].Play();//播放
    }
    // 搜索一个空的频道来设置声音
    public int FindChannel ()
    {
        for (int i =0; i<channelCount;i++)
        {
            if (_channels[i] != null)
            {
                if (!_channels[i].isPlaying) return i;//不在播放
            }
        }
        return -1;
    }
    //暂停所有声音的播放
    public void StopSound()
    {
        foreach (AudioSource source in _channels)
        {
            source.mute = true;
        }

    }
    // 取消暂停
    public void ResumeSound()
    {
        foreach (AudioSource source in _channels)
        {
            if (source.isPlaying)
            {
                source.mute = false;
            }
        }
    }
    // 降低音量
    public void ChangePitch()
    {
        foreach (AudioSource source in _channels)
        {
            if (source.isPlaying)
            {
                source.pitch = 0.70f;
            }
        }
    }
    // 升高音量
    public void ResumePitch()
    {
        foreach (AudioSource source in _channels)
        {
                source.pitch = 1f;
        }
    }
    
}

    这个脚本将用来管理整个游戏的声音播放,那么Audio Source组件也是采用脚本来创建。然后我们在Inspector视图上来对脚本的变量进行赋值。

    那么在摄像机的脚本里面就可以通过下面的代码来播放声音,如:

    void Start () 
    {

        // 获取声音管理器
        soundScript = this.gameObject.GetComponent<SoundManager>();
        soundScript.PlaySound(0, true, 0.1f);
        soundScript.PlaySound(1, true, 0.1f);
        
    }

    或者在其他的游戏对象上,通过下面的脚本进行声音播放:

    SoundManager soundScript;

    void Start()
    {
        // 获取摄像机的组件
        soundScript = Camera.main.GetComponent<SoundManager>();
    }


    soundScript.PlaySound(32, false, 0.5f);

 

posted on 2014-09-16 16:26  linzheng  阅读(3983)  评论(0)    收藏  举报

导航