6.4.5 動(dòng)畫(huà)層
????????圖6-42顯?了動(dòng)畫(huà)層設(shè)置窗?。在動(dòng)畫(huà)狀態(tài)機(jī)?可以添加很多層,層之間可以是覆蓋關(guān)系也可以是疊加關(guān)系,當(dāng)然也可以隨時(shí)屏蔽?些層、啟?另?些層。
每?個(gè)動(dòng)畫(huà)層可以有單獨(dú)的設(shè)置,其選項(xiàng)解釋如下。
①Weight(權(quán)重),本層對(duì)總體動(dòng)畫(huà)效果的影響,取值范圍為0~1。0代表沒(méi)有影響,1代表完全影響。
②Mask(遮罩),每層可以單獨(dú)設(shè)置遮罩,如某些層只負(fù)責(zé)上肢動(dòng)畫(huà)。
③Blending(混合模式),有Override(覆蓋)和Additive(疊加)兩個(gè)選項(xiàng),是指這?層的影響覆蓋其他層,還是疊加到已有動(dòng)畫(huà)上。
④Sync與Timing,?于兩個(gè)動(dòng)畫(huà)層之間的同步。
⑤IK Pass(更新反向動(dòng)?學(xué)),如果勾選,則這?層動(dòng)畫(huà)會(huì)觸發(fā)腳本中的OnAnimatorIK()函數(shù),可以在腳本中進(jìn)?步處理IK??偨Y(jié)來(lái)說(shuō),動(dòng)畫(huà)遮罩和動(dòng)畫(huà)層為開(kāi)發(fā)者進(jìn)?步組合多種不同的動(dòng)
畫(huà)提供了可能。另外,在游戲項(xiàng)?早期或獨(dú)?游戲開(kāi)發(fā)時(shí),美術(shù)資源還不夠豐富,這套系統(tǒng)可以幫助開(kāi)發(fā)者盡可能組合出多種多樣的動(dòng)作。
6.4.6 動(dòng)畫(huà)幀事件
????????很多時(shí)候需要在特定的時(shí)機(jī)執(zhí)?某種邏輯。例如,當(dāng)玩家做揮砍動(dòng)作時(shí),在揮砍的某個(gè)時(shí)刻開(kāi)始,需要持續(xù)判斷是否擊中了物體。這個(gè)時(shí)機(jī)要求?較精確,因?yàn)樗屯婕业膭?dòng)作息息相關(guān),不能在?開(kāi)始抽出武器時(shí)就進(jìn)?攻擊判定,也不能在收招階段判定。攻擊判定的時(shí)間段只能是整個(gè)攻擊動(dòng)作中的?部分。
????????因此引擎需要提供?種機(jī)制,在動(dòng)畫(huà)的時(shí)間軸上做?個(gè)標(biāo)記,在動(dòng)畫(huà)播放到特定幀的時(shí)候觸發(fā)腳本函數(shù)。以揮砍動(dòng)作為例,可以在揮出武器時(shí)執(zhí)?“開(kāi)啟攻擊判定”的函數(shù),?在攻擊收招時(shí)執(zhí)?“關(guān)閉攻擊判定”的函數(shù)。
?提?
????????幀事件讓動(dòng)畫(huà)與游戲邏輯耦合由于動(dòng)畫(huà)幀事件的標(biāo)記必須在動(dòng)畫(huà)的時(shí)間軸上,因此會(huì)和動(dòng)畫(huà)數(shù)據(jù)本?耦合在?起。純粹從程序邏輯的?度看,多種不同系統(tǒng)的耦合并不是好事,但為了增強(qiáng)游戲表現(xiàn)?,這么做也有充分的理由。
????????根?骼動(dòng)畫(huà)也有同樣的特點(diǎn),根?骼動(dòng)畫(huà)是將動(dòng)作與物體運(yùn)動(dòng)耦合在了?起。也許,正是這種?處不在的耦合,才會(huì)讓游戲開(kāi)發(fā)顯得特殊和復(fù)雜。
下?以落地動(dòng)作為例,給落地動(dòng)作添加?個(gè)動(dòng)畫(huà)幀事件。
????????添加動(dòng)畫(huà)幀事件依然是在模型和動(dòng)畫(huà)導(dǎo)?設(shè)置中完成。?先找到落地動(dòng)作,然后在動(dòng)畫(huà)狀態(tài)機(jī)中找到Airborne(空中)狀態(tài),雙擊打開(kāi)融合樹(shù)。經(jīng)過(guò)分析,融合樹(shù)中的HumanoidFall動(dòng)畫(huà)就是落地動(dòng)畫(huà)。單擊該動(dòng)畫(huà),Project窗?會(huì)?動(dòng)跳轉(zhuǎn)到對(duì)應(yīng)的資源?件,也就是HumanoidIdleJumpUp。選中該?件查看導(dǎo)?設(shè)置,在Animation標(biāo)簽?的下?有?個(gè)Events(事件)選項(xiàng),動(dòng)畫(huà)幀事件就在這?添加,如圖6-43所?。但?定要先選中需要修改的動(dòng)畫(huà)?段,即HumanoidFall,再繼續(xù)設(shè)置。
Events設(shè)置中包含?個(gè)時(shí)間軸,時(shí)間軸左側(cè)有?個(gè)添加按鈕,?于添加新的事件,其步驟如下。
01 單擊添加按鈕,會(huì)在時(shí)間軸上多出?個(gè)標(biāo)記。
02 將該標(biāo)記拖到需要觸發(fā)事件的時(shí)刻。注意這?的時(shí)間軸并不對(duì)應(yīng)動(dòng)畫(huà)的真實(shí)時(shí)間?度,?論動(dòng)畫(huà)本?時(shí)間?或短,都會(huì)統(tǒng)?為同樣的?度,在程序中??個(gè)0~1的值表?,這叫作“標(biāo)準(zhǔn)化時(shí)間”或“歸?化時(shí)間”
03 將標(biāo)記拖到合適的位置后,就可以填寫(xiě)事件信息了。Function字段必須填寫(xiě),它既是事件的名稱(chēng),也是會(huì)?動(dòng)調(diào)?的函數(shù)名。例如,填寫(xiě)MyFall就會(huì)調(diào)?腳本組件中的MyFall函數(shù),且這個(gè)函數(shù)還可以帶多個(gè)參數(shù)?便后續(xù)使?,包括1個(gè)浮點(diǎn)數(shù)、1個(gè)整數(shù)、1個(gè)字符串和1個(gè)Object類(lèi)型的引?。
進(jìn)?了設(shè)置后,編輯器中的信息就準(zhǔn)備完畢了,注意要單擊Apply按鈕讓修改?效。接下來(lái)的?步是修改腳本,給腳本添加對(duì)應(yīng)名稱(chēng)的函數(shù)。
在例?中,玩家??已經(jīng)掛載了ThirdPersonUserControl腳本,為了簡(jiǎn)單起?,直接給ThirdPersonUserControl腳本添加MyFall函數(shù)。
void MyFall()
{
Debug.Log(" 觸發(fā)幀事件,落地");
}
????????運(yùn)?游戲,按跳躍鍵進(jìn)?測(cè)試。如果設(shè)置正確就會(huì)在Console窗?中顯?“觸發(fā)幀事件,落地”的信息。這樣幀事件的主要使??法就介紹完畢了。但是如果深究,就還有?些?問(wèn)題,?先是動(dòng)畫(huà)系統(tǒng)查找動(dòng)畫(huà)幀事件的函數(shù)的規(guī)則是怎樣的?
????????簡(jiǎn)單來(lái)說(shuō),動(dòng)畫(huà)會(huì)查找當(dāng)前對(duì)應(yīng)物體的所有腳本,只要有名稱(chēng)和類(lèi)型符合的函數(shù),都會(huì)被調(diào)?。也就是說(shuō),如果玩家?上的兩個(gè)腳本都有名為MyFall的函數(shù)(返回值不是void也可以),那么都會(huì)被調(diào)?;如果?個(gè)函數(shù)都沒(méi)找到,就會(huì)產(chǎn)??條錯(cuò)誤信息。讀者可??試驗(yàn)。
????????其次,上?的MyFall函數(shù)沒(méi)有參數(shù),實(shí)際上可以帶?個(gè)參數(shù),但最多也只能帶?個(gè)參數(shù)。參數(shù)類(lèi)型可以是float、int、string或Object其中之?,參數(shù)的值可以在編輯動(dòng)畫(huà)幀事件時(shí)指定。
????????最后,動(dòng)畫(huà)幀事件不單是3D動(dòng)畫(huà)獨(dú)有的,所有動(dòng)畫(huà)都可以添加動(dòng)畫(huà)幀事件。?般給其他類(lèi)型的動(dòng)畫(huà)添加幀事件是在Animation窗?中操作的。窗?中的Add Property按鈕就是?于添加新事件的,如圖6-44所?。添加的事件也具有前?所提到的參數(shù),具體使??法也類(lèi)似。
6.4.7 反向動(dòng)?學(xué)(IK)
????????IK全稱(chēng)為Inverse Kinematic,?般翻譯為反向動(dòng)?學(xué)。?般來(lái)說(shuō),它是?種極為細(xì)致的動(dòng)畫(huà)微調(diào)技術(shù),例如在以下情景中的應(yīng)?。
????????情景1,??在?上臺(tái)階時(shí),利?IK讓腳總是剛好踩在臺(tái)階上。
????????情景2,???持不同形狀的槍時(shí),?總是剛好抓著槍柄。
????????情景3,??進(jìn)?攀爬時(shí),?部和腳步緊貼墻壁。在上?的這些情景中,有兩個(gè)關(guān)鍵:?是通過(guò)程序檢測(cè)到合適的位置(臺(tái)階、槍柄),讓?腳或其他肢體朝?標(biāo)位置移動(dòng);?是當(dāng)?腳或其他肢體移動(dòng)時(shí),其余所有的關(guān)節(jié)都能配合移動(dòng),如?部運(yùn)動(dòng)時(shí)也會(huì)帶動(dòng)?臂的運(yùn)動(dòng)。IK會(huì)采?相關(guān)算法,盡可能讓運(yùn)動(dòng)看起來(lái)合理。
1. 頭部IK
頭部IK?較簡(jiǎn)單,只需要修改??控制腳本ThirdPersonCharacter就可以?即看到效果。在該腳本中加?的函數(shù)如下。
private void OnAnimatorIK(int layerIndex)
{
// 設(shè)置注視?標(biāo)的權(quán)重為1
m _ Animator.SetLookAtWeight(1);
// ?直注視(0,0,0) 點(diǎn)
m _ Animator.SetLookAtPosition(new Vector3(0, 0, 0));
}
????????運(yùn)?游戲進(jìn)?測(cè)試,會(huì)發(fā)現(xiàn)??頭部會(huì)保持轉(zhuǎn)向某個(gè)?向,但?標(biāo)在??背后時(shí),也不會(huì)過(guò)度轉(zhuǎn)向。使?IK有?些注意事項(xiàng),也只有符合以下規(guī)則,IK才會(huì)?效。
?????????是IK與動(dòng)畫(huà)狀態(tài)機(jī)中的動(dòng)畫(huà)層相關(guān)。在介紹動(dòng)畫(huà)層時(shí),我們看到在每?層的設(shè)置中都有?個(gè)IK Pass選項(xiàng),它?于開(kāi)啟或關(guān)閉IK功能。所有開(kāi)啟了IK Pass的層都會(huì)調(diào)?腳本中的OnAnimatorIK()函數(shù)。?是有與IK相關(guān)的函數(shù),如SetLookAtWeight()函數(shù)和SetLookAtPosition()函數(shù)都只能在專(zhuān)門(mén)的OnAnimatorIK()函數(shù)中調(diào)?。如果編寫(xiě)在其他地??不起作?,Unity會(huì)給出提?信息。
????????上?的SetLookAtPosition()函數(shù)?較好理解,參數(shù)是注視的?標(biāo)位置。?SetLookAtWeight()函數(shù)則是指IK運(yùn)動(dòng)的權(quán)重,可以理解為IK?預(yù)動(dòng)畫(huà)的程度。權(quán)重越?,IK運(yùn)動(dòng)就越明顯,權(quán)重為0時(shí)相當(dāng)于關(guān)閉了IK功能。
????????因?yàn)?物頭部轉(zhuǎn)動(dòng)時(shí),?體各部位都需要跟著配合,所以SetLookAtWeight()函數(shù)有很多參數(shù)可以調(diào)整,通常取默認(rèn)值即可。
// 參數(shù)依次為整體權(quán)重、?體權(quán)重、頭部權(quán)重、眼睛權(quán)重。
// 最后clampWeight是?個(gè)限制參數(shù),防?轉(zhuǎn)動(dòng)過(guò)?,0代表不限制,1代表完
全限制。
void SetLookAtWeight(float weight, float bodyWeight = 0.0f,
float headWeight = 1.0f,
float eyesWeight = 0.0f, float clampWeight = 0.5f);
2. ?腳IK
?部和腳部IK也很常?,其參考代碼如下。
private void OnAnimatorIK(int layerIndex)
{
// pos 是?標(biāo)位置
m _ Animator.SetIKPosition(AvatarIKGoal.LeftHand, pos);
m _ Animator.SetIKPositionWeight(AvatarIKGoal.LeftHand,
1);
// rot 是?標(biāo)朝向
m _ Animator.SetIKRotation(AvatarIKGoal.LeftHand, rot);
m _ Animator.SetIKRotationWeight(AvatarIKGoal.LeftHand,
1);
}
設(shè)置?腳IK時(shí),有4個(gè)常??法(?表6-2)。它們的第?個(gè)參數(shù)是AvatarIKGoal類(lèi)型的枚舉,只有4種取值:LeftFoot(左腳),RightFoot(右腳),LeftHand(左?),RightHand(右?)。
????????在實(shí)際游戲開(kāi)發(fā)中,找到合適的位置和朝向很?煩,?般?法直接做到。通常有以下兩種尋找IK定位點(diǎn)的?式。
?????????是??個(gè)空物體作為參考點(diǎn)位置。例如,玩家??舉槍射擊時(shí),槍柄的?物體?有?個(gè)特殊的空物體,空物體的位置和朝向就是?部定位的點(diǎn)。編程時(shí),指定?部IK的位置和旋轉(zhuǎn)與空物體?樣,然后根據(jù)需要再微調(diào)空物體即可。
?????????是利?物理射線定位。例如,制作上樓梯的動(dòng)作時(shí),可以從??的腳朝下發(fā)射射線,射線碰到地?的位置就是腳部需要踩的位置。從很有限的參數(shù)和?法可以看出,Unity原?僅提供了很基本的IK功能,設(shè)計(jì)偏寫(xiě)實(shí)的游戲時(shí)可能會(huì)遇到功能不夠?的情況,這時(shí)可以求助于Asset Store中的插件。某些IK插件的功能?常強(qiáng)?,可以實(shí)現(xiàn)更復(fù)雜的IK效果。
????????從整體游戲設(shè)計(jì)來(lái)看,IK屬于?個(gè)專(zhuān)注于細(xì)枝末節(jié)的技術(shù)。很多游戲出于性能等因素的考慮?沒(méi)有使?IK。
第7章 腳本與特效
????????美觀且有特?的游戲畫(huà)?在吸引玩家眼球???常重要,?游戲作為動(dòng)態(tài)的藝術(shù)形式,動(dòng)畫(huà)與特效?然更為重要。精美的??動(dòng)作可以制造出極強(qiáng)的節(jié)奏感和打擊感,但更需要特效進(jìn)?步烘托氛圍、增強(qiáng)效果。相對(duì)??動(dòng)作??,特效受到的約束較少,可供發(fā)揮的空間較?。在?格合適的前提下,加?豐富多彩的特效能提升游戲表現(xiàn)?。
????????通常玩家所說(shuō)的特效,從技術(shù)?度來(lái)看其實(shí)可能包含了各種粒?、光效、動(dòng)效和氛圍動(dòng)畫(huà)等,然?各個(gè)系統(tǒng)之間可能并沒(méi)有什么聯(lián)系,僅僅只是搭配在?起形成了綜合的特效?已。本章將分別討論這些特效的?法和相關(guān)的編程要點(diǎn),側(cè)重點(diǎn)是如何使?和管理各種特效素材,?不是特效本?的制作?法。
7.1 特效總覽
????????提到Unity中的特效,?先想到的是粒?系統(tǒng)。其實(shí)?義地看,只要能增強(qiáng)游戲表現(xiàn)?的效果都可以稱(chēng)為特效。按照具體技術(shù)分類(lèi),可以包含粒?、動(dòng)畫(huà)(???動(dòng)畫(huà))、動(dòng)效、貼花、拖尾和后期效果等。
7.1.1 粒?
Unity中的粒?組件叫作Particle System,如圖7-1所?。
????????粒?系統(tǒng)顧名思義,與“微粒”有關(guān)。粒?系統(tǒng)會(huì)?成和發(fā)射很多粒?,通過(guò)控制粒?的?成數(shù)量、??、?度、速度、貼圖和顏?等眾多屬性,可以實(shí)現(xiàn)或真實(shí)或炫酷的各種效果。其中,粒?的每?種屬性還可以根據(jù)時(shí)間變化?隨機(jī)變化,充分釋放特效設(shè)計(jì)師的創(chuàng)造?。
????????例如,?粒?系統(tǒng)可以實(shí)現(xiàn)?焰、?、雪、?流等?然現(xiàn)象,也可以實(shí)現(xiàn)能量球、魔法彈等幻想中的效果。?且現(xiàn)代的粒?系統(tǒng)也?持基于3D模型的粒?,可以實(shí)現(xiàn)模型破碎、模型聚合、模型消散等豐富的視覺(jué)效果。
7.1.2 動(dòng)畫(huà)
????????Unity的粒?系統(tǒng)有它??的局限性,因此美術(shù)設(shè)計(jì)師經(jīng)常結(jié)合動(dòng)畫(huà)系統(tǒng)和粒?系統(tǒng)來(lái)制作特效。有經(jīng)驗(yàn)的美術(shù)設(shè)計(jì)師利?圖?和模型素材,配合精?調(diào)整的旋轉(zhuǎn)、位移、縮放等基本變換,做出華麗的表現(xiàn)效果。
?????????且,由于動(dòng)畫(huà)可以直接對(duì)幀進(jìn)?編輯,相?只能調(diào)整參數(shù)的粒?系統(tǒng)控制?更強(qiáng),從?讓設(shè)計(jì)師更容易調(diào)整動(dòng)態(tài)節(jié)奏,因此某些情況下動(dòng)畫(huà)特效是不可替代的。
7.1.3 動(dòng)效
????????動(dòng)效?般是場(chǎng)景或界?中元素的?幅度動(dòng)態(tài)。例如,UI中?字的彈跳、縮放,圖?的淡?淡出,界?從屏幕外?到屏幕內(nèi),這些都可以算作動(dòng)效。動(dòng)效看似不起眼,但對(duì)于提升?戶(hù)體驗(yàn)來(lái)說(shuō)作?巨?,?且很多休閑類(lèi)游戲都?分注重動(dòng)效設(shè)計(jì)。動(dòng)效是?戶(hù)體驗(yàn)(UE)中舉?輕重的?個(gè)環(huán)節(jié),例如現(xiàn)代?機(jī)端操作系統(tǒng)都?常重視?戶(hù)操作的動(dòng)態(tài)效果,如圖7-2所?。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-853346.html
????????在Unity中,動(dòng)效的實(shí)現(xiàn)有兩個(gè)基本?式,?是使?動(dòng)畫(huà),?是使?Tween(緩動(dòng)動(dòng)畫(huà))。緩動(dòng)動(dòng)畫(huà)是直接?腳本代碼控制的動(dòng)畫(huà),具有易添加、易維護(hù)、易修改的特點(diǎn),它只需添加少量的代碼就能做出各種?動(dòng)的動(dòng)畫(huà),?不?管理?量瑣碎的動(dòng)畫(huà)資源,?常?便。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-853346.html
到了這里,關(guān)于Unity 3D腳本編程與游戲開(kāi)發(fā)【3.8】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!