7.2.5 后期处理举例

Post Processing(后期处理)并不属于特效,但现代的特效表现离不开后期处理的⽀持。本⼩节以眩光(Bloom)为例,展⽰⼀种明亮的激光的制作⽅法,其效果如图7-13所⽰。

1. 安装后期处理扩展包         较新的Unity版本(如2018.4版本)已经内置了新版的后期处理扩展包。通过添加组件可以判断是否已经安装了新版的后期处理扩展包。         在任意物体下新建组件,搜索“post”,如果看到Post-process Debug等3个后期处理相关的组件,就说明已经安装了该扩展包,如图7-14所⽰。

        如果没有相关组件可以⽤Package Manager(包管理器)单独安装,⽽且升级该扩展包时也需要使⽤Package Manager。下⽂将简单介绍Package Manager的使⽤⽅法。选择主菜单中的Window→Package Manager,打开Package Manager窗⼝,等待加载完毕后,可以看到⼤量的扩展包。在搜索框中搜索“Post”就可以找到Post processing扩展包,也可以Update(更新)或Install(安装)该扩展包。⼩提⽰ 显⽰扩展包列表时可能有⽹络卡顿打开Package Manager窗⼝后可能只会看到少数⼏个扩展包,这 时要稍加等待,待加载完毕后才会看到⼤量扩展包信息。由于服务器和⽹络原因,有时会遇到较⻓时间的⽹络卡顿,列表迟迟加载不全。如果2分钟后还是没有完全加载,则需要完全关闭Unity之后再重试。

2. 添加Post Process Volumn组件         Unity的后期处理⽀持在场景中指定多个后处理区域,每个区域称为⼀个Post Process Volumn。创建它的⽅法是先新建⼀个空物体,可以命名为pp,然后给空物体添加Post Process Volumn组件,如图7-15所⽰。

        添加组件后勾选第⼀个属性Is Global,它表⽰这个后处理设置会应⽤于整个场景。由于这个例⼦⽐较简单,只需要让全场景使⽤同⼀个后期处理配置就可以了。         之后单击Profile(配置档案)右边的New按钮,则会在⼯程中新建⼀个配置⽂件。单击配置⽂件的名称,则系统会在Project窗⼝中⾃动定位该⽂件。         选中Profile⽂件,然后在Inspector窗⼝中编辑,单击Add effect按钮,选择Unity→Bloom,添加Bloom效果,如图7-16所⽰。

Bloom特效的具体参数,可以在配置⽂件⾥设置,也可以回到物体pp的组件中设置。勾选该后期效果组件的Intensity(强度)选项,并将它改为2,其他选项可以保留默认或者以后再修改。3. 添加Post Process Layer组件         有了场景中的设置,还需要在摄像机上进⾏设置才能让后期效果⽣效。给场景的主摄像机添加Post ProcessLayer组件,并将Trigger选项设置为Main Camera,再将Layer选项设置为Everything即可,如图7-17所⽰。

                                        图7-17 Post Process Layer组件 4. 创建激光物体         万事俱备,只差物体本⾝了。为简单起⻅,直接新建⼀个圆柱体,缩放成细⻓条状,旋转到合适的⾓度,然后再创建⼀个新的材质赋给圆柱体。         修改该材质,使⽤默认的Standard着⾊器,修改Albedo(漫反射颜⾊)为红⾊;再勾选Emission(发光),勾选后会多出⼀个发光颜⾊的选项,修改该颜⾊为红⾊,并注意要选择颜⾊窗⼝下⽅的Intensity(强度)选项,如图7-18所⽰。

发光颜⾊是⼀种特殊的HDR颜⾊,⽐⼀般的颜⾊多了Intensity属性。这⾥将强度调整到2.5以上,就会看到明显的发光效果了。再结合HDR颜⾊与后期的Bloom效果,物体会具有⾮常明亮的感觉。⼩知识 ⾼动态范围HDR         ⾳响设备能实际表现出的最低⾳量与最⼤⾳量的⽐例是⾳量的动态范围,同理,显⽰屏所能表现的最低亮度与最⾼亮度的⽐例,也是动态范围。HDR(High Dynamic Range)指的是⾼动态范围图像,相⽐普通图像可以提供更多的动态范围和图像细节。它能够更好地反映真实环境中的光线强度变化。本节的粒⼦利⽤HDR颜⾊配合Bloom效果得到激光效果。未来的显⽰设备也会从硬件上更好地⽀持HDR效果。

第8章 脚本与⾳频

        对于很多游戏来说,动听的⾳乐、恰当的⾳效与精美的画⾯同样重要。本章将介绍⾳乐和⾳效如何使⽤,以及利⽤脚本控制⾳频播放的⽅法。此外,由于⾳频资源适合⽤各种⽅式加载,因此本章也会讲解⽤脚本管理各类资源的⽅法。

8.1 ⾳频基础概念

Unity的⾳频播放功能主要是通过⾳源(Audio Source)与⾳频侦听器(Audio Listener)这两个组件实现的。

8.1.1 ⾳源与⾳频侦听器

        游戏画⾯能够被观众看到,是因为有渲染器和摄像机,同样⾳频能够被听到,也要有声⾳的发出者与声⾳的接收者。声⾳的发出者叫作⾳源,⽽声⾳的接收者叫作⾳频侦听器。Audio Source与AudioListener都是组件,可以挂载到任意物体上发挥作⽤。         ⼀般⾳频侦听器整个场景只有⼀个Audio Listener,默认挂载在主摄像机上。根据具体设计需求,Audio Listener也可以挂载到主⾓⾝上,或其他适合接收⾳频的位置。⽽要播放⾳乐,只需要创建⼀个带有Audio Source组件的物体,并准备播放的⾳频资源⽂件,其步骤如下。

01 准备⼀个⾳乐⽂件,复制到当前⼯程的Assets⽂件夹下。⾳频格式可以是WAV、MP3、OGG或AIFF等常⽤格式。 02 在场景列表中单击⿏标右键,选择Create→Audio→AudioSource即可创建⼀个⾳源物体。也可以在任意物体上添加Audio Source组件。 03 选中⾳源物体,可以看到Audio Source组件的第⼀个属性为AudioClip(⾳频⽚段),将Project窗⼝中的⾳频⽂件拖曳到该属性上即可。 04 运⾏游戏,在默认设置下该⾳频会被播放⼀次。

8.1.2 ⾳源组件详解

Audio Source组件可调节的参数较多,⽽且⼤部分参数都可以直接改变声⾳的播放效果,如图8-1所⽰。

                                                图8-1 Audio Source组件 下表将详细解释Audio Source组件每⼀个属性的作⽤,如表8-1所⽰。 表8-1 Audio Source组件属性表

8.2 脚本与⾳乐、⾳效

        在游戏运⾏的过程中,⾳效的播放时机与游戏当前内容密切相关,⽽且随着场景的变化、剧情的推进,背景⾳乐也需要适时切换,所以恰当地控制⾳乐和⾳效的播放⾮常重要。⾳乐和⾳效的播放、停⽌、切换和⾳量变化等,都需要由脚本控制。

8.2.1 ⽤脚本控制⾳乐播放

        前⽂已经说明了⾳乐的播放⽅法,简单来说只要有Audio Source组件和⾳频资源就可以播放⾳乐了。但通常还需要停⽌背景⾳乐或切换⾳乐等,下⽂⽤⼀个⽰例脚本说明⾳乐的播放⽅法,其步骤如下。 01 创建脚本TestAudio,挂载到任意物体上。 02 创建⾳源物体,默认物体名称为Audio Source。 03 脚本内容如下。

using System.Collections.Generic;

using UnityEngine;

public class TestAudio : MonoBehaviour

{

// 从外部指定声⾳⽚段

public List clips;

// ⾳源组件

AudioSource audio;

void Start()

{

// 获取⾳源组件

GameObject go = GameObject.Find("Audio Source");

audio = go.GetComponent();

// 先停⽌播放

audio.Stop();// 不循环

audio.loop = false;

}

void Update()

{

if (Input.GetKeyDown(KeyCode.Alpha1))

{

// 切换到⾳乐0并播放

audio.clip = clips[0];

audio.Play();

}

if (Input.GetKeyDown(KeyCode.Alpha2))

{

// 切换到⾳乐1并播放

audio.clip = clips[1];

audio.Play();

}

// 按空格键 暂停/继续

if (Input.GetKeyDown(KeyCode.Space))

{

if (audio.isPlaying)

{

audio.Pause();

}

else

{

audio.UnPause();

}

}

}

}

        脚本的功能是按数字键1播放第⼀段⾳频,按数字键2播放第⼆段⾳频,按空格键可以暂停或继续播放当前⾳频。         脚本⽤到了⼀个公开的列表字段保存⾳频资源。要为变量clips赋初始值,只需要在编辑器中找到该脚本组件,将Size填为2,然后就可以具体指定两个元素的内容了。这⾥给两个元素指定对应的⾳乐⽚段,如图8-2所⽰。

以上代码演⽰了Audio Source组件的常⽤⽅法,⾳源的属性都可以⽤脚本修改。

8.2.2 添加⾳效实例

        在Unity中使⽤⾳乐和⾳效的⽅法是相同的,但有⼀些关键点需要注意。⾸先,⼀个⾳源同⼀时刻只能播放⼀个⾳频。换句话说,如果有10个⾳效同时播放,就⾄少需要10个⾳源。因此⼀般游戏中的每个⾓⾊都带有⼀个Audio Source组件,如敌⼈会叫喊,主⾓会挥动武器,那么就在每个敌⼈和主⾓的⾝上都挂载⼀个Audio Source组件。如果主⾓的武器⾳效、跳跃⾳效和受伤⾳效可能会同时播放,那么可以在主⾓⾝上挂载3个Audio Source组件,分别对应⼀种⾳效(当然,也可以把         Audio Source组件放在其他物体上)。其次,添加⾳效的难点在于⾳效播放的时机,⾳效⽐⾓⾊动作稍早或稍晚播放都不好。⽽且根据游戏逻辑,同样的动作有时需要配合⾳效,有时⼜不需要,那么弄清楚播放⾳效的条件也很重要。下⾯以第6.2节的2D动画⼯程为例,给它配上跳跃⾳效。

1. 准备⾳效素材 01 打开第6.2节的2D动画⼯程。 02 在Asset Store中搜索“Sound”就可以找到许多⾳效素材,这⾥选⽤的是⼀个免费的复古⾳效素材包Sound FX - Retro Pack,如图8-3所⽰。

03 将⾳效素材包下载并导⼊。导⼊后的⾳效⽂件在Assets/ZeroRare/Audio⽂件夹下,有⾦币、爆炸等多个分类,每个类别⼜有多种⾳效。 2. 给⾓⾊添加⾳源组件 给玩家物体添加Audio Source组件,取消勾选Play On Awake(⽴即播放)选项。 3. 修改脚本代码 思考⼀下,什么时候需要播放跳跃⾳效呢?似乎是按下空格键时,但在空中按下空格键依然会播放跳跃⾳效,就不合适了。也就是说,简单修改输⼊脚本很难合适地播放⾳效。经过思考发现,要想在“真的跳跃时播放⾳效”,就必须要修改⾓⾊控制脚本Platform Character 2D,找到该脚本的第98⾏左右,对刚体施加弹跳⼒的那⼀段进⾏修改,其修改如下。

// If the player should jump...

if (m _ Grounded && jump)

{

// Add a vertical force to the player.

m _ Grounded = false;

m _ Anim.SetBool("Ground", false);

m _ Rigidbody2D.AddForce(new Vector2(0f, m _

JumpForce));

// 获取⾳源组件

AudioSource audio = GetComponent();

// 动态加载⾳效资源

audio.clip = Resources.Load("jump _ 01");

audio.Play();

}

        如果在实际跳跃时才播放⾳效,就只能将播放的时机放在这⾥。注意修改代码以后,不能⽴即试验,因为系统会找不到⾳效⽂件jump_01。需要将Zero Rare/Retro SoundEffects/Audio/Jump/jump_01.wav⽂件复制到当前⼯程的Resources⽂件夹下,系统才能正确找到此⽂件。(如果Resources⽂件夹不存在就新建,名称的⼤⼩写和拼写必须完全正确。)上⽂的代码使⽤了动态加载⾳效资源的技术,即Resources.Load⽅法,它对资源路径有着严格要求。当然也可以使⽤前⾯的公开变量的⽅法指定⾳效⽂件,但⾳效资源⽐较适合使⽤动态⽅式加载,之后本书会继续讲解资源管理相关的问题。⼩提⽰ ⽤事件机制避免函数臃肿         在例⼦中,为了在跳跃时播放⾳效,在跳跃的代码中添加了⼏⾏代码。想象⼀个完整的2D游戏,为了实现多种功能很可能会在跳跃时添加更多代码,例如,不同地形的⾳效变化、踩敌⼈或控制机关等。随着功能越来越多,这⼀⼩段代码会不可避免地膨胀下去。这种局部的代码膨胀不仅影响代码可读性,⽽且影响多⼈协作,还会成为bug滋⽣的温床。         如果把跳跃看成⼀个特定的事件,完全可以利⽤Unity的事件和消息机制设计代码,让所有“关⼼”跳跃的系统订阅跳跃事件。当跳跃发⽣时,通知这些系统即可,这些系统的相关函数也会被调⽤,并做出相应的处理。这样做的最⼤好处是,让逻辑分散在各个⼦系统,⽽不是所有⼦系统都集中在唯⼀的地⽅,互相影响。Unity的事件机制会在第13章进阶编程技术中进⾏讲解。

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: