7.2.5 后期處理舉例
Post Processing(后期處理)并不屬于特效,但現(xiàn)代的特效表現(xiàn)離不開后期處理的?持。本?節(jié)以眩光(Bloom)為例,展??種明亮的激光的制作?法,其效果如圖7-13所?。
1. 安裝后期處理擴展包
????????較新的Unity版本(如2018.4版本)已經(jīng)內(nèi)置了新版的后期處理擴展包。通過添加組件可以判斷是否已經(jīng)安裝了新版的后期處理擴展包。
????????在任意物體下新建組件,搜索“post”,如果看到Post-process Debug等3個后期處理相關(guān)的組件,就說明已經(jīng)安裝了該擴展包,如圖7-14所?。
????????如果沒有相關(guān)組件可以?Package Manager(包管理器)單獨安裝,?且升級該擴展包時也需要使?Package Manager。下?將簡單介紹Package Manager的使??法。選擇主菜單中的Window→Package Manager,打開Package Manager窗?,等待加載完畢后,可以看到?量的擴展包。在搜索框中搜索“Post”就可以找到Post processing擴展包,也可以Update(更新)或Install(安裝)該擴展包。
?提?
顯?擴展包列表時可能有?絡卡頓打開Package Manager窗?后可能只會看到少數(shù)?個擴展包,這
時要稍加等待,待加載完畢后才會看到?量擴展包信息。由于服務器和?絡原因,有時會遇到較?時間的?絡卡頓,列表遲遲加載不全。如果2分鐘后還是沒有完全加載,則需要完全關(guān)閉Unity之后再重試。
2. 添加Post Process Volumn組件
????????Unity的后期處理?持在場景中指定多個后處理區(qū)域,每個區(qū)域稱為?個Post Process Volumn。創(chuàng)建它的?法是先新建?個空物體,可以命名為pp,然后給空物體添加Post Process Volumn組件,如圖7-15所?。
????????添加組件后勾選第?個屬性Is Global,它表?這個后處理設置會應?于整個場景。由于這個例??較簡單,只需要讓全場景使?同?個后期處理配置就可以了。
????????之后單擊Profile(配置檔案)右邊的New按鈕,則會在?程中新建?個配置?件。單擊配置?件的名稱,則系統(tǒng)會在Project窗?中?動定位該?件。
????????選中Profile?件,然后在Inspector窗?中編輯,單擊Add effect按鈕,選擇Unity→Bloom,添加Bloom效果,如圖7-16所?。
Bloom特效的具體參數(shù),可以在配置?件?設置,也可以回到物體pp的組件中設置。勾選該后期效果組件的Intensity(強度)選項,并將它改為2,其他選項可以保留默認或者以后再修改。
3. 添加Post Process Layer組件
????????有了場景中的設置,還需要在攝像機上進?設置才能讓后期效果?效。給場景的主攝像機添加Post ProcessLayer組件,并將Trigger選項設置為Main Camera,再將Layer選項設置為Everything即可,如圖7-17所?。
????????????????????????????????????????圖7-17?Post Process Layer組件
4. 創(chuàng)建激光物體
????????萬事俱備,只差物體本?了。為簡單起?,直接新建?個圓柱體,縮放成細?條狀,旋轉(zhuǎn)到合適的?度,然后再創(chuàng)建?個新的材質(zhì)賦給圓柱體。
????????修改該材質(zhì),使?默認的Standard著?器,修改Albedo(漫反射顏?)為紅?;再勾選Emission(發(fā)光),勾選后會多出?個發(fā)光顏?的選項,修改該顏?為紅?,并注意要選擇顏?窗?下?的Intensity(強度)選項,如圖7-18所?。
發(fā)光顏?是?種特殊的HDR顏?,??般的顏?多了Intensity屬性。這?將強度調(diào)整到2.5以上,就會看到明顯的發(fā)光效果了。再結(jié)合HDR顏?與后期的Bloom效果,物體會具有?常明亮的感覺。
?知識
?動態(tài)范圍HDR
?????????響設備能實際表現(xiàn)出的最低?量與最??量的?例是?量的動態(tài)范圍,同理,顯?屏所能表現(xiàn)的最低亮度與最?亮度的?例,也是動態(tài)范圍。HDR(High Dynamic Range)指的是?動態(tài)范圍圖像,相?普通圖像可以提供更多的動態(tài)范圍和圖像細節(jié)。它能夠更好地反映真實環(huán)境中的光線強度變化。本節(jié)的粒?利?HDR顏?配合Bloom效果得到激光效果。未來的顯?設備也會從硬件上更好地?持HDR效果。
第8章 腳本與?頻
????????對于很多游戲來說,動聽的?樂、恰當?shù)?效與精美的畫?同樣重要。本章將介紹?樂和?效如何使?,以及利?腳本控制?頻播放的?法。此外,由于?頻資源適合?各種?式加載,因此本章也會講解?腳本管理各類資源的?法。
8.1 ?頻基礎概念
Unity的?頻播放功能主要是通過?源(Audio Source)與?頻偵聽器(Audio Listener)這兩個組件實現(xiàn)的。
8.1.1 ?源與?頻偵聽器
????????游戲畫?能夠被觀眾看到,是因為有渲染器和攝像機,同樣?頻能夠被聽到,也要有聲?的發(fā)出者與聲?的接收者。聲?的發(fā)出者叫作?源,?聲?的接收者叫作?頻偵聽器。Audio Source與AudioListener都是組件,可以掛載到任意物體上發(fā)揮作?。
?????????般?頻偵聽器整個場景只有?個Audio Listener,默認掛載在主攝像機上。根據(jù)具體設計需求,Audio Listener也可以掛載到主??上,或其他適合接收?頻的位置。?要播放?樂,只需要創(chuàng)建?個帶有Audio Source組件的物體,并準備播放的?頻資源?件,其步驟如下。
01 準備?個?樂?件,復制到當前?程的Assets?件夾下。?頻格式可以是WAV、MP3、OGG或AIFF等常?格式。
02 在場景列表中單擊?標右鍵,選擇Create→Audio→AudioSource即可創(chuàng)建?個?源物體。也可以在任意物體上添加Audio Source組件。
03 選中?源物體,可以看到Audio Source組件的第?個屬性為AudioClip(?頻?段),將Project窗?中的?頻?件拖曳到該屬性上即可。
04 運?游戲,在默認設置下該?頻會被播放?次。
8.1.2 ?源組件詳解
Audio Source組件可調(diào)節(jié)的參數(shù)較多,?且?部分參數(shù)都可以直接改變聲?的播放效果,如圖8-1所?。
????????????????????????????????????????????????圖8-1?Audio Source組件
下表將詳細解釋Audio Source組件每?個屬性的作?,如表8-1所?。
表8-1?Audio Source組件屬性表
8.2 腳本與?樂、?效
????????在游戲運?的過程中,?效的播放時機與游戲當前內(nèi)容密切相關(guān),?且隨著場景的變化、劇情的推進,背景?樂也需要適時切換,所以恰當?shù)乜刂?樂和?效的播放?常重要。?樂和?效的播放、停?、切換和?量變化等,都需要由腳本控制。
8.2.1 ?腳本控制?樂播放
????????前?已經(jīng)說明了?樂的播放?法,簡單來說只要有Audio Source組件和?頻資源就可以播放?樂了。但通常還需要停?背景?樂或切換?樂等,下???個?例腳本說明?樂的播放?法,其步驟如下。
01 創(chuàng)建腳本TestAudio,掛載到任意物體上。
02 創(chuàng)建?源物體,默認物體名稱為Audio Source。
03 腳本內(nèi)容如下。
using System.Collections.Generic;
using UnityEngine;
public class TestAudio : MonoBehaviour
{
// 從外部指定聲??段
public List<AudioClip> clips;
// ?源組件
AudioSource audio;
void Start()
{
// 獲取?源組件
GameObject go = GameObject.Find("Audio Source");
audio = go.GetComponent<AudioSource>();
// 先停?播放
audio.Stop();// 不循環(huán)
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();
}
// 按空格鍵 暫停/繼續(xù)
if (Input.GetKeyDown(KeyCode.Space))
{
if (audio.isPlaying)
{
audio.Pause();
}
else
{
audio.UnPause();
}
}
}
}
????????腳本的功能是按數(shù)字鍵1播放第?段?頻,按數(shù)字鍵2播放第?段?頻,按空格鍵可以暫?;蚶^續(xù)播放當前?頻。
????????腳本?到了?個公開的列表字段保存?頻資源。要為變量clips賦初始值,只需要在編輯器中找到該腳本組件,將Size填為2,然后就可以具體指定兩個元素的內(nèi)容了。這?給兩個元素指定對應的?樂?段,如圖8-2所?。
以上代碼演?了Audio Source組件的常??法,?源的屬性都可以?腳本修改。
8.2.2 添加?效實例
????????在Unity中使??樂和?效的?法是相同的,但有?些關(guān)鍵點需要注意。?先,?個?源同?時刻只能播放?個?頻。換句話說,如果有10個?效同時播放,就?少需要10個?源。因此?般游戲中的每個??都帶有?個Audio Source組件,如敵?會叫喊,主?會揮動武器,那么就在每個敵?和主?的?上都掛載?個Audio Source組件。如果主?的武器?效、跳躍?效和受傷?效可能會同時播放,那么可以在主??上掛載3個Audio Source組件,分別對應?種?效(當然,也可以把
????????Audio Source組件放在其他物體上)。其次,添加?效的難點在于?效播放的時機,?效???動作稍早或稍晚播放都不好。?且根據(jù)游戲邏輯,同樣的動作有時需要配合?效,有時?不需要,那么弄清楚播放?效的條件也很重要。下?以第6.2節(jié)的2D動畫?程為例,給它配上跳躍?效。
1. 準備?效素材
01 打開第6.2節(jié)的2D動畫?程。
02 在Asset Store中搜索“Sound”就可以找到許多?效素材,這?選?的是?個免費的復古?效素材包Sound FX - Retro Pack,如圖8-3所?。
03 將?效素材包下載并導?。導?后的?效?件在Assets/ZeroRare/Audio?件夾下,有?幣、爆炸等多個分類,每個類別?有多種?效。
2. 給??添加?源組件
給玩家物體添加Audio Source組件,取消勾選Play On Awake(?即播放)選項。
3. 修改腳本代碼
思考?下,什么時候需要播放跳躍?效呢?似乎是按下空格鍵時,但在空中按下空格鍵依然會播放跳躍?效,就不合適了。也就是說,簡單修改輸?腳本很難合適地播放?效。經(jīng)過思考發(fā)現(xiàn),要想在“真的跳躍時播放?效”,就必須要修改??控制腳本Platform Character 2D,找到該腳本的第98?左右,對剛體施加彈跳?的那?段進?修改,其修改如下。文章來源:http://www.zghlxwxcb.cn/news/detail-858785.html
// 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<AudioSource>();
// 動態(tài)加載?效資源
audio.clip = Resources.Load<AudioClip>("jump _ 01");
audio.Play();
}
????????如果在實際跳躍時才播放?效,就只能將播放的時機放在這?。注意修改代碼以后,不能?即試驗,因為系統(tǒng)會找不到?效?件jump_01。需要將Zero Rare/Retro SoundEffects/Audio/Jump/jump_01.wav?件復制到當前?程的Resources?件夾下,系統(tǒng)才能正確找到此?件。(如果Resources?件夾不存在就新建,名稱的??寫和拼寫必須完全正確。)上?的代碼使?了動態(tài)加載?效資源的技術(shù),即Resources.Load?法,它對資源路徑有著嚴格要求。當然也可以使?前?的公開變量的?法指定?效?件,但?效資源?較適合使?動態(tài)?式加載,之后本書會繼續(xù)講解資源管理相關(guān)的問題。
?提?
?事件機制避免函數(shù)臃腫
????????在例?中,為了在跳躍時播放?效,在跳躍的代碼中添加了??代碼。想象?個完整的2D游戲,為了實現(xiàn)多種功能很可能會在跳躍時添加更多代碼,例如,不同地形的?效變化、踩敵?或控制機關(guān)等。隨著功能越來越多,這??段代碼會不可避免地膨脹下去。這種局部的代碼膨脹不僅影響代碼可讀性,?且影響多?協(xié)作,還會成為bug滋?的溫床。
????????如果把跳躍看成?個特定的事件,完全可以利?Unity的事件和消息機制設計代碼,讓所有“關(guān)?”跳躍的系統(tǒng)訂閱跳躍事件。當跳躍發(fā)?時,通知這些系統(tǒng)即可,這些系統(tǒng)的相關(guān)函數(shù)也會被調(diào)?,并做出相應的處理。這樣做的最?好處是,讓邏輯分散在各個?系統(tǒng),?不是所有?系統(tǒng)都集中在唯?的地?,互相影響。Unity的事件機制會在第13章進階編程技術(shù)中進?講解。文章來源地址http://www.zghlxwxcb.cn/news/detail-858785.html
到了這里,關(guān)于Unity 3D腳本編程與游戲開發(fā)【4.1】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!