總結(jié)一下制作紅警2步兵時(shí)需要注意的各種細(xì)節(jié)

ICE Lab Inc. Copyright 2021,All rights reserved.
本文共12000字
曾幾何時(shí),紅警2modder們還在為找到XCC Mixer能打開原版Ra2.mix與Ra2md.mix而欣喜,但隨著modder們對(duì)自身能力的不斷提高,簡(jiǎn)單修改配置文件就算制作了mod的時(shí)代一去不復(fù)返了。各種擁有全新引擎,全新素材,自定義客戶端的mod們的橫空出世讓紅色警戒2在度過了它的21年歲月以后依舊擁有極高的熱度。這些新功能也對(duì)后來的modder們提出了更高的要求。反編譯,進(jìn)階PS,多軟件建模,特效插件與AE這種曾經(jīng)很高級(jí)的功能也逐步走進(jìn)了紅警2modder們制作mod的日常。在玩家眼里,比拼狂獸人血量與天啟攻擊特效是不是核彈爆炸的審美不存在了,取而代之的是接近獨(dú)立游戲的審美標(biāo)準(zhǔn)——戰(zhàn)役劇情的連貫性,與原版完全不一樣的單位多樣性,對(duì)戰(zhàn)地圖的平衡性,單位設(shè)計(jì)的合理性等等。這些新要求對(duì)于每個(gè)modder來說都是挑戰(zhàn),所幸在如今發(fā)達(dá)的互聯(lián)網(wǎng)下,那些曾經(jīng)讓人覺得高高在上的專業(yè)軟件也能在網(wǎng)上輕易的找到教程。這也讓各種modder能較快的達(dá)到前人的成就,并且在更短時(shí)間內(nèi)做出一個(gè)更加優(yōu)秀的作品來。

制作效率的提升一般會(huì)直接體現(xiàn)在學(xué)習(xí)資料的易于獲取上。新引擎的修改需要modder了解C++與反編譯,這些對(duì)于一個(gè)正常coder來說都算是能力范圍內(nèi)的東西;新地圖的制作需要玩家熟練使用FinalAlert2,這對(duì)于經(jīng)常關(guān)注優(yōu)秀mapper們的設(shè)計(jì),時(shí)不時(shí)自己動(dòng)手做出一個(gè)作品的mapper來說也十分輕松;新vxl模型需要熟練掌握vxl section editor或是使用magicavoxel/voxelshop等可轉(zhuǎn)vxl格式的體素建模軟件,這對(duì)于想學(xué)習(xí)vxl制作的新人來說只需針對(duì)性的搜索相關(guān)教程與圈內(nèi)vxler的素材制作視頻即可。然而,新shp素材的制作卻相對(duì)比較自由。除了最后轉(zhuǎn)shp所需要的軟件相對(duì)統(tǒng)一以外(Pal Studio,ImageShaper與Shp Builder),制作shp的前期工作卻是非常個(gè)性化與多元化的。并且適用于一般建模動(dòng)作與流程的教程多半不適用于紅警2,為紅警2素材制作所特別撰寫的教程的缺失讓紅警2 shp制作者們的交流還僅限于互相幫忙與口耳相傳上,這也就是我在B站上寫這些文章的原因。回想我寫的第一篇專欄里,我更多是對(duì)biped這種古老而簡(jiǎn)單的插件在動(dòng)作制作上的一個(gè)入門介紹。那篇文章是我在B站撰寫的第一篇專欄,同時(shí)也是我在max的學(xué)習(xí)里最初得到的成果。但事實(shí)上,制作一個(gè)合理的動(dòng)畫遠(yuǎn)比如何去綁定并拉動(dòng)各部分要簡(jiǎn)單。當(dāng)你完成綁定的時(shí)候,你的動(dòng)畫制作才只邁出第一步。隨著我越來越多的制作各種各樣的步兵,我也遇到了越來越多的問題。

對(duì)于我來說,在制作了許多步兵以后,以下這些問題是我所面對(duì)的常見問題:
1.步兵動(dòng)作如何設(shè)計(jì)更加合理
2.如何讓步兵的步伐與你在ini中設(shè)定的速度匹配
3.動(dòng)作在max內(nèi)的實(shí)時(shí)渲染是否與游戲內(nèi)一致?
4.步兵的體型到底應(yīng)該是怎樣的
5.步兵的游泳動(dòng)作,如何做出來更合適
6.開火動(dòng)畫是否應(yīng)該做進(jìn)步兵
上面這些問題基本上是我要做一個(gè)步兵的時(shí)候常見的一些問題。本文中,我也將會(huì)以這些問題來展開話題,聊一聊關(guān)于我在制作步兵動(dòng)作上的一些心得。希望能起到拋磚引玉的效果,如有錯(cuò)誤,歡迎各位對(duì)我及時(shí)糾正,本人不勝感激。
一.速度與大小
不同于現(xiàn)代游戲,紅警2這種老游戲的幀率會(huì)影響游戲的運(yùn)行速度而并非流暢程度,這也就是玩家嘴里的“不鎖幀”?,F(xiàn)代游戲的高幀數(shù)會(huì)體現(xiàn)在游戲運(yùn)行流暢度上而非游戲時(shí)間流逝速度上,因此現(xiàn)代游戲的模型在設(shè)計(jì)動(dòng)畫上一般會(huì)考慮最高的幀率。比如暴雪的模型在動(dòng)畫設(shè)計(jì)上就使用300fps以便適應(yīng)更高的幀率。紅警2這種老游戲的速度設(shè)置則是播放速度設(shè)置,比如經(jīng)典的6速150+fps,AI反應(yīng)快的玩家根本操作不過來。所以現(xiàn)代電腦在玩紅警2單機(jī)游戲時(shí)更多會(huì)使用5速鎖60fps的方式來防止速度過快難以操作。這點(diǎn)會(huì)直接體現(xiàn)在素材制作上。我使用3dsmax制作紅警2步兵素材時(shí),我往往會(huì)將時(shí)間配置的播放速度設(shè)置成1/4x來匹配紅警2內(nèi)4速的播放速度(因?yàn)閺膽?zhàn)役默認(rèn)速度我們可以知道,4速是西木給玩家設(shè)計(jì)的最優(yōu)速度,也就是30fps)。以下是設(shè)置相關(guān)截圖:


在設(shè)置好以后,我們?cè)谥谱鲃?dòng)畫上就有了一個(gè)播放速度參考。單獨(dú)建立了播放速度參考會(huì)直觀告訴素材制作者動(dòng)作在游戲內(nèi)的播放速度,但這種直觀又是片面的。以走路動(dòng)作為例,走路動(dòng)作在制作時(shí)模型會(huì)在原地進(jìn)行走路的相關(guān)動(dòng)作,但走路本身是一個(gè)移動(dòng)的過程,我們需要匹配游戲中素材需要的移動(dòng)速度與動(dòng)畫播放速度的值。每次都一次次匹配毫無疑問是麻煩的,所以在此我給出一個(gè)經(jīng)過我多次試驗(yàn)個(gè)人最喜歡的一個(gè)步態(tài)動(dòng)作制作方案供各位讀者參考。
首先我們可以參考現(xiàn)成的方案來輔助我們的設(shè)計(jì),打開西木自己做的素材與原始rules.ini我們不難發(fā)現(xiàn),紅警2步兵們絕大多數(shù)的速度都是4,少數(shù)是5-6,每個(gè)方向的運(yùn)動(dòng)shp幀數(shù)都是7。所以我們可以得到一個(gè)結(jié)論:在人眼的識(shí)別范圍內(nèi),速度是4-6都可以使用7幀循環(huán)步態(tài)動(dòng)畫。而恐怖機(jī)器人的速度是10,大小與普通步兵相似,恐怖機(jī)器人采用了6幀每個(gè)方向,所以我們又可以得到一個(gè)結(jié)論,速度是10左右的步兵可以使用6幀循環(huán)步態(tài)動(dòng)畫。然后我們結(jié)合紅警2自身引擎缺陷與現(xiàn)在普遍使用的ares平臺(tái)中AE動(dòng)畫的增益功能來看,shp單位的實(shí)際速度超過13時(shí)容易卡在原地不動(dòng)(13僅為經(jīng)驗(yàn)數(shù)值并非程序規(guī)定硬性數(shù)值,數(shù)據(jù)僅供參考)(實(shí)際速度就是當(dāng)前單位的真實(shí)速度,就比如一個(gè)ini里設(shè)定速度為7的單位,當(dāng)身上有了一個(gè)速度增益2.0倍的AE動(dòng)畫時(shí),其自身的速度達(dá)到了14,就容易產(chǎn)生卡在原地不動(dòng)的行為)。所以結(jié)合步兵大小來看,一般每個(gè)方向的幀數(shù)為6或7,步兵速度極慢時(shí)用8即可匹配游戲內(nèi)速度。


當(dāng)然,這一切都是建立在大小是步兵大小的shp之下的相關(guān)規(guī)則。為了確立步兵大小,我一般會(huì)以高度來定整個(gè)步兵的尺寸基調(diào),這是因?yàn)椴奖叨葲Q定了其身體比例,而身體比例中腿的尺寸決定了其正常行走的步伐尺寸。學(xué)過繪畫的人都知道,繪畫中的人物設(shè)計(jì)有“n頭身”的概念,即頭的比例占全身的大小可以快速確認(rèn)身體的高矮與畫風(fēng)。紅警2的步兵大多為五頭身左右,即頭占全身高度的比例約為1/5,同時(shí)紅警2的步兵比起正常體型的人來說大多四肢較粗,身體較厚而短,這主要也是為了方便游戲內(nèi)辨認(rèn)。

在紅警2中,一般的步兵自身都是28像素左右(以美國(guó)大兵為案例),算上由于等線視角時(shí)向上的伸手動(dòng)作,單個(gè)步兵的圖像像素高度可能會(huì)25(佝僂)到35(高個(gè)),特殊則可能更高(高個(gè)體型可以拉到40;外骨骼,機(jī)甲等特殊裝備可以拉到50),如果你要設(shè)計(jì)一個(gè)更大的步兵,隨著你單步距離的增大,每個(gè)方向單運(yùn)動(dòng)周期內(nèi)的幀數(shù)一定也會(huì)相應(yīng)變化。

對(duì)于單一步伐的距離來說,我一般會(huì)把步伐長(zhǎng)度跟身體長(zhǎng)度掛鉤,即單一步伐長(zhǎng)度等于主身體長(zhǎng)度。同時(shí)在一個(gè)動(dòng)畫周期內(nèi)應(yīng)該是左右雙腿輪流向前,一個(gè)周期的最后一幀應(yīng)該能無縫連接第一幀的動(dòng)畫才是合理的步伐動(dòng)畫。所以我每次制作行走動(dòng)畫時(shí),往往會(huì)拉一個(gè)比我預(yù)期循環(huán)幀數(shù)多一幀的時(shí)間軸環(huán)境,在第一幀與最后一幀都放上第一幀動(dòng)畫,并在中間建立循環(huán)來保證動(dòng)畫循環(huán)內(nèi)的連貫性。

二.步態(tài)動(dòng)作簡(jiǎn)析
下一個(gè)就是步態(tài)問題,步態(tài)設(shè)計(jì)對(duì)于許多動(dòng)畫設(shè)計(jì)師來說基本是必修課,而且對(duì)于某些需要做步態(tài)分析的程序員來說這也是一個(gè)經(jīng)過專業(yè)訓(xùn)練以后的東西,所以在此我只寫一點(diǎn)個(gè)人的拙見,細(xì)節(jié)也就不過于展開了。

在描述之前,對(duì)于3D動(dòng)作的文字化記錄,我在此創(chuàng)立一個(gè)空間三維坐標(biāo)系來輔助我的描述。以下是坐標(biāo)系說明:

人類的行走比起輪胎的滾動(dòng)來說有著更多的重心轉(zhuǎn)移。雖然我們都知道雙腿行走是左右腿輪流上前的動(dòng)作,但除了腿與你不自覺擺動(dòng)的手以外,其他細(xì)節(jié)確實(shí)很難被沒有相關(guān)經(jīng)歷的普通人注意到。
首先,一個(gè)合理的步態(tài)一定伴隨著重心的變化。想當(dāng)初我還在用那個(gè)初音模型照著網(wǎng)上的教程學(xué)習(xí)骨骼動(dòng)作制作的當(dāng)年,使用那個(gè)模型來教學(xué)的老師也只是在他的免費(fèi)視頻里拉了一個(gè)腿部的關(guān)鍵幀與簡(jiǎn)單動(dòng)畫就沒了。那個(gè)動(dòng)畫確實(shí)簡(jiǎn)單到草率,但同時(shí)那個(gè)動(dòng)畫也給予了我一個(gè)最基礎(chǔ)的步態(tài)特征,即腿在運(yùn)動(dòng)中的極限位置一定是略微彎曲,前腿較直而后腿朝后,同時(shí)上肢則是相反的互相彎曲。這種狀態(tài)其實(shí)可以用一張圖來簡(jiǎn)單概括——安全出口:

當(dāng)然,這只是極限狀態(tài),而且這種動(dòng)作其實(shí)在實(shí)際制作中稍顯夸張。不過我還是會(huì)在一個(gè)步伐的首尾幀里將身體在XZ平面內(nèi)弄成近乎上圖一樣的樣子,然后我會(huì)在大概正中間的幀時(shí)將四肢的動(dòng)作左右反過來,這樣根據(jù)關(guān)鍵幀規(guī)則,雙腿與雙臂會(huì)形成了一個(gè)大概的往復(fù)動(dòng)作,為之后的調(diào)節(jié)創(chuàng)造更好的條件。

當(dāng)然,光弄好首尾與中間關(guān)鍵節(jié)點(diǎn)是不夠的,系統(tǒng)自動(dòng)運(yùn)算的動(dòng)作會(huì)讓雙腿在XZ平面內(nèi)以最直接的方式——繞大腿根部旋轉(zhuǎn)來運(yùn)動(dòng),此時(shí)我們需要修正這種轉(zhuǎn)動(dòng)以避免與地面的穿模現(xiàn)象。根據(jù)步伐的模擬分析(就是自己在屋里走動(dòng)走動(dòng)體會(huì)一下),我們可以得出一個(gè)結(jié)論:即對(duì)于腳部來說,向后運(yùn)動(dòng)的腳一定是著地的,則其運(yùn)動(dòng)是與地面平行的;向前運(yùn)動(dòng)的腳一定是懸空的,而且懸空向上是一個(gè)向上弓的弧形。腳會(huì)在腳踝向上抬的時(shí)候略微放大與小腿的角度以放松肌肉,而地面端的腳則會(huì)因?yàn)槿梭w保持平衡而保持緊密接觸地面。這也讓人類的運(yùn)動(dòng)會(huì)在XZ平面上上下起伏,當(dāng)你的步伐最大時(shí)你會(huì)相對(duì)矮一些,當(dāng)你的步伐最小時(shí)你又會(huì)相對(duì)高一些。

說完了XZ平面,我們來看一下YZ平面的姿態(tài)運(yùn)動(dòng)。人體行走是一個(gè)規(guī)律性的重心移動(dòng)的過程。這點(diǎn)是會(huì)體現(xiàn)在你的步伐里的左右搖擺上的。誠(chéng)然,我們都看過閱兵式上帥氣的儀仗隊(duì)隊(duì)員在踢正步時(shí)走直線上身不動(dòng)的精彩表演,但即使是他們幾乎平行于X軸的重心移動(dòng)上,上身也會(huì)呈一個(gè)極其微小的周期性的左右變化,而當(dāng)你在跑動(dòng)時(shí)這種變化會(huì)幅度更大。這是因?yàn)槟忝總€(gè)步伐中很少有雙腳同時(shí)著地的情況。當(dāng)你左腳著地時(shí),你運(yùn)算平衡的小腦會(huì)操你的身體將你的重心左移以便平衡你左右質(zhì)量與慣性,右腳時(shí)同理。這種運(yùn)動(dòng)規(guī)律會(huì)使得你的上肢與主身體會(huì)傾斜于你當(dāng)前落地的腳的方向。人類上身的傾斜往往能通過肩部的傾斜來看出,所以我們可以得出一個(gè)結(jié)論,那就是在YZ平面上,落地腳的那邊肩會(huì)更低,上身會(huì)略微向落地腳的那邊彎曲。同時(shí),由于人頸椎在行走中不自覺地平衡腦部,你的頸椎雖然會(huì)跟著左右彎曲,但幅度往往會(huì)小于你的重心擺動(dòng),除非你處于跑步態(tài)勢(shì)。說到跑步態(tài)勢(shì),在跑步中的人類往往上身的左右擺動(dòng)幅度會(huì)更大,而人類在悠閑地走路時(shí)上身的擺動(dòng)非常不明顯。所以上身的擺動(dòng)也可以反應(yīng)步兵的運(yùn)動(dòng)速度。如果你想讓你的步兵是跑步前行,那么你在動(dòng)作中對(duì)于上身的擺動(dòng)需要好好設(shè)計(jì);但如果你只是想讓你的步兵是悠閑的往前走,那么上身擺動(dòng)則一定要小甚至不需要做。


處理好上身重心的左右搖擺與腿部運(yùn)動(dòng)以后,最后我才會(huì)處理上臂的運(yùn)動(dòng)。一方面,上臂的運(yùn)動(dòng)并不是一個(gè)固定的左右搖擺,畢竟空手的步兵并不是很多,不同的步兵其持有的不同武器決定了上肢的運(yùn)動(dòng)軌跡。我最近做的這個(gè)黑色步兵的案例是一種典型的雙手持槍步兵案例。如果是單手手槍案例或是擲雷兵案例,讀者可以參考美國(guó)大兵的類似無武器手部運(yùn)動(dòng),如果是雙手持手槍或是持長(zhǎng)槍的案例,則手部位置會(huì)相對(duì)限定與一個(gè)點(diǎn)或是一根軸上。這同時(shí)會(huì)影響上肢在步態(tài)中的運(yùn)動(dòng)。不過,肩部圍繞人中軸的轉(zhuǎn)動(dòng)的主要規(guī)律并不會(huì)因?yàn)槟阕藙?shì)的改變而改變,而是恒定的以根部為轉(zhuǎn)軸進(jìn)行左右各畫圓的運(yùn)動(dòng),這種圓形由于整個(gè)肩膀可視作剛體的轉(zhuǎn)動(dòng)而左右方向一致,但相位完全相反。從前方看左右肩膀都是上下移動(dòng),但從右邊看,雙肩的運(yùn)動(dòng)圍繞轉(zhuǎn)軸則一定是順時(shí)針轉(zhuǎn)動(dòng)。以下是圖示:



以上就是步態(tài)的相關(guān)分析,接下來我會(huì)寫到一個(gè)在制作中很具有紅警2特色的部分——開火序列。
三.步兵開火序列的注意事項(xiàng)
開火序列對(duì)于紅警2來說是一個(gè)很特別的部分,首先我先展示一些西木的步兵案例:



這三個(gè)示意能很好的體現(xiàn)出我接下來要表述的內(nèi)容,現(xiàn)在我將會(huì)以Q&A的形式來展開我對(duì)開火序列的理解。
a.開火動(dòng)畫到底應(yīng)不應(yīng)該做進(jìn)步兵本體?為什么?
答:應(yīng)該。
既然答案是應(yīng)該,那么如果沒做進(jìn)步兵本體會(huì)怎么樣呢?這點(diǎn)就是ww的經(jīng)典bug了。我們都知道在ares里,載具可以做成32面。AlexB老爺之所以要設(shè)計(jì)這個(gè)功能絕不僅僅是因?yàn)槟茏屳d具轉(zhuǎn)彎變得順滑,因?yàn)楫吘谷魏我粋€(gè)地面載具在紅警2里都只會(huì)以8面的形式向前運(yùn)動(dòng),也就是說除了轉(zhuǎn)彎會(huì)出現(xiàn)32面中其他24面的效果以外其他都不會(huì)出現(xiàn),空中載具由于其直接飛過去的功能,這使32面載具會(huì)極大增加空中shp載具的表現(xiàn)力。但是,每個(gè)單位在art里都是需要寫FLH即開火位置的,而開火位置又是32面的。這就會(huì)直接導(dǎo)致一個(gè)結(jié)果,當(dāng)你的步兵朝一個(gè)方向時(shí),開火動(dòng)畫并不一定是這個(gè)方向。誠(chéng)然,Ares也做了開火動(dòng)畫是32面的功能。只不過AlexB老爺似乎并未100%將開火動(dòng)畫與開火位置對(duì)準(zhǔn),即使是32面開火動(dòng)畫的開火單位依舊會(huì)出現(xiàn)開火位置/移動(dòng)位置與單位目前方向不匹配的情況。有炮臺(tái)的單位往往不會(huì)出現(xiàn)這種情況,這是因?yàn)榕谂_(tái)會(huì)實(shí)時(shí)跟隨自己攻擊的目標(biāo)的方向精準(zhǔn)的運(yùn)動(dòng)。但如果無炮塔單位的話,那就不一定是精準(zhǔn)朝向了。以下是示意圖


而上圖都是vxl單位的示意,vxl單位好歹作為紅警2這個(gè)2.5D游戲里唯一的還算與3D沾點(diǎn)邊的玩意能表現(xiàn)出自由自在轉(zhuǎn)動(dòng)的效果,然而步兵這種純粹的2D圖像可就沒那么正常了。


這種現(xiàn)象在武器很長(zhǎng)的步兵單位里尤為明顯,這也就是我使用防空步兵這種武器很長(zhǎng)的步兵當(dāng)示意的原因。西木肯定是趕工懶得修這個(gè)bug了,于是就在步兵圖像本體上加入開火動(dòng)畫來避免了這個(gè)bug的出現(xiàn)。
當(dāng)然,把開火動(dòng)畫做進(jìn)步兵幀序列內(nèi)是需要一定能力的,我一般會(huì)使用avi動(dòng)態(tài)材質(zhì)的方式,AE轉(zhuǎn)動(dòng)攝像機(jī)+PS仿色+blender幀序列合并的方式,亦或是直接在max里使用開火動(dòng)畫樣子的簡(jiǎn)單幾何體+高亮度材質(zhì)+動(dòng)畫直接模擬的方式將開火動(dòng)畫做進(jìn)步兵幀序列內(nèi),具體怎么做就看各位讀者的聰明才智了。而假如你真的不會(huì)把步兵開火動(dòng)畫做進(jìn)幀序列,我也有三種方法來避免這種情況的發(fā)生:1.制作近戰(zhàn)步兵,2.把步兵的武器做短使bug的影響降到最低,3.把步兵的開火動(dòng)畫改成統(tǒng)一的圓形煙霧,降低開火動(dòng)畫方向bug被看出來的幾率。
同時(shí),每種武器開火都會(huì)伴隨周圍環(huán)境亮度的改變,地板亮度的改變我們可以用開火動(dòng)畫綁武器綁閃光彈頭的方式,但這種光線并不會(huì)與步兵自身產(chǎn)生交互,因此我們可以在制作步兵時(shí)在槍口加入光源閃爍的動(dòng)畫來模擬武器開火對(duì)步兵自身的光學(xué)變化,從而產(chǎn)生更好的效果。(西木也是這么做的,這也就是為何西木的每個(gè)步兵開火時(shí)身體都會(huì)產(chǎn)生光線交互)

b.步兵的開火頻率與動(dòng)作設(shè)計(jì)是否有關(guān)聯(lián)?
答:有,且很大。
這又不得不說到紅警2的一個(gè)bug了。每次開火之前步兵也好shp載具也好一定會(huì)在開火前一幀強(qiáng)制回到空閑幀ready/guard的狀態(tài)。所以開火頻率高的步兵其平時(shí)空閑動(dòng)作一定要與開火時(shí)的動(dòng)作非常接近,不然就會(huì)抽搐。

那么解決方案是什么呢?很簡(jiǎn)單,開火動(dòng)作與站立動(dòng)作很相近即可。這也是我放出第二個(gè)案例——魔鬼終結(jié)者的開火效果的原因。

c.是否所有的shp單位都能隨心所欲的制作攻擊前搖與后搖?
答:不能,甚至shp載具無法制作攻擊前搖。
開火動(dòng)畫一般都存在攻擊后搖的過程,即單位在攻擊之后需要放下武器或是其他解除攻擊姿態(tài)的動(dòng)作。在步兵本體的art里有個(gè)字段叫“FireUp=(后接int型整數(shù))”(非幀序列內(nèi)的FireUp,幀序列內(nèi)的FireUp是用來給開火動(dòng)畫幀序列確定位置與幀數(shù)的),這個(gè)字段決定了步兵開火的幀序列中,第幾幀才會(huì)播放開火動(dòng)畫并且武器會(huì)運(yùn)行。而如果你的武器過早開火而ROF(武器開火頻率值)時(shí)間又低于你的攻擊后搖,那么你的攻擊后搖會(huì)強(qiáng)制播放完整,這會(huì)導(dǎo)致ROF強(qiáng)制高于某個(gè)數(shù)值而無法更低。

shp載具的開火前搖又十分奇怪。在心靈終結(jié)中三輪使用了“DelayedFireDelay=”與“FiringSyncFrame1=”來控制shp載具的開火前搖,但是通過應(yīng)用了這兩句話的巨齒鯊機(jī)甲的傷害作用時(shí)間來看,這兩句話好像沒起到任何作用。我之后也測(cè)試過諸多其他的需要開火前搖的shp載具,發(fā)現(xiàn)他們的開火都強(qiáng)制在第一幀起效了。我去ini英文教程,modenc在線字典與Ares說明書中查找這兩句話的來源發(fā)現(xiàn),第一句話僅對(duì)建筑起效,而第二句話更是不知道來源如何(所以三輪就瞎寫的唄)。所以我暫時(shí)得出一個(gè)結(jié)論,即shp載具無法規(guī)定攻擊前搖,也就是說你的shp酷炫機(jī)甲只要做成載具模式,那么你的開火動(dòng)畫設(shè)計(jì)就不能有任何攻擊前搖。(如果有讀者發(fā)現(xiàn)了給shp載具增加指定幀開火的方法歡迎告訴我,本人不勝感激)

這三個(gè)問題詳細(xì)的描述了開火動(dòng)畫的相關(guān)問題,即:建議將步兵開火動(dòng)畫與火光閃爍做進(jìn)步兵本體,應(yīng)該合理設(shè)置開火動(dòng)畫幀數(shù)以匹配ini,shp載具應(yīng)設(shè)計(jì)無攻擊前搖的動(dòng)作以防止bug。
四.兩棲步兵
步兵的水上幀動(dòng)畫的制作是個(gè)特殊的問題。首先,我們需要了解一個(gè)事實(shí),那就是在相同幀數(shù)下,步兵游泳的幀率更大。也就是說,如果一個(gè)步兵的游泳幀與陸地幀使用相同的幀,游泳的動(dòng)畫播放會(huì)更快。

下面來分析動(dòng)作。相同人類的游泳姿勢(shì)中,爬泳姿勢(shì)是速度最快也是最耗體能的(自由泳比賽不限泳姿,大家都在用爬泳的方式進(jìn)行游泳主要是因?yàn)樗羁?,并且開局用一小段潛泳的方式加速)。蛙泳的速度是最慢也是動(dòng)作最慢的。然而,蛙泳的聲音與水花相對(duì)最小,而且蝶泳太費(fèi)體力,仰泳又看不見路。所以我們會(huì)看見紅警3的忍者使用蛙泳進(jìn)行游泳,譚雅也會(huì)使用后腳上下擺動(dòng)的半蛙泳方式。因此一般我們做兩棲步兵會(huì)使用蛙泳的方式來完成自己的水上行走幀。

我曾經(jīng)做過一個(gè)兩棲步兵,由于我想用爬泳姿勢(shì),然后又誤以為游泳幀的播放速率與行走幀一致,這導(dǎo)致我的那個(gè)兩棲步兵的游泳姿勢(shì)極其滑稽……從這個(gè)反例可以說明,原版譚雅的游泳姿勢(shì)毫無疑問是最適合紅警2步兵游泳的姿勢(shì),所以各位步兵制作者們可以參考譚雅的運(yùn)動(dòng)姿勢(shì)來制作自己的兩棲步兵。如果硬要使用標(biāo)準(zhǔn)蛙泳姿勢(shì),請(qǐng)務(wù)必把游泳幀的運(yùn)動(dòng)周期拉長(zhǎng)一點(diǎn),比如正常的如譚雅這種半蛙泳的泳姿約為6-7幀,正常蛙泳就應(yīng)該為20幀左右。

游泳的步兵在水里不動(dòng)的時(shí)候是需要保持一個(gè)上浮姿勢(shì)的,這點(diǎn)與地面的idle不一樣。步兵的idle一般我們都會(huì)用一幀就行,畢竟你站在地面不動(dòng),空氣也不能把你淹死。但在水里,你在原地不劃水的話會(huì)沉下去,除非步兵坐在一個(gè)特別機(jī)器上或是這個(gè)步兵是個(gè)機(jī)器人自帶氣墊。因此,西木的游泳閑置組是支持多幀閑置的。而對(duì)于shp載具來說,你可以讓閑置幀播放行走動(dòng)畫,只需要你的代碼中加入“IdleRate=”即可,Ares還為空中載具增加了一個(gè)特殊的“AirRate=”來使氣球類shp單位能在空中閑置時(shí)播放它的行走幀。步兵在水中的上下是會(huì)引起水中波紋的,動(dòng)畫師可以在水平面上增加增大的圓環(huán)來模擬這種變化。由于這種波紋很小,寬度甚至有時(shí)不足1像素,所以材質(zhì)可以簡(jiǎn)單的使用淡淺藍(lán)色或是灰藍(lán)色即可。

我做步兵在水里的時(shí)候一般會(huì)隱去場(chǎng)景中用來渲染陸地影子的那個(gè)平面而改成一個(gè)半透明的平面來模擬步兵身體在水下變色的部分。(當(dāng)然,水的折射效果我就沒弄了,畢竟一般來說步兵小到可以不在乎這個(gè)細(xì)節(jié))
另外,除了游泳動(dòng)畫與原地動(dòng)畫以外,水里的攻擊動(dòng)畫,閑置動(dòng)畫與死亡動(dòng)畫都是特別的,這些動(dòng)畫都需要步兵制作者們?nèi)ヌ畛渲谱鳌V档米⒁獾氖?,水中步兵無法歡呼,當(dāng)你按歡呼鍵時(shí),水中步兵將無法對(duì)你的指令做出反應(yīng)。

五.飛行兵部分
紅警2單位的運(yùn)動(dòng)是由“Locomotor=”,“MovementZone=”與“SpeedType=”決定的。了解ini的人都知道,Jumpjet類單位(標(biāo)準(zhǔn)代表火箭飛行兵,基洛夫,夜鷹直升機(jī)。其中,夜鷹直升機(jī)因?yàn)?strong>BalloonHover=no而能落地,不能落地的我一般會(huì)叫它氣球類單位,因?yàn)槠?strong>BalloonHover=yes得名)的移動(dòng)方式在游戲中是獨(dú)一無二的。你正常撰寫的speed將無法影響其單位速度,jumpjet使用一套獨(dú)特的ini代碼組來控制單位的上浮速率,墜落速率,移動(dòng)速率,是否上下擺動(dòng)等特殊參數(shù)。

而jumpjet類步兵也用一套獨(dú)一無二的幀序列來控制其運(yùn)作方式。其中Hover=對(duì)應(yīng)了地面步兵的Ready=/Guard=(其實(shí)我也不知道這倆有啥區(qū)別,可能guard是原地警戒G以后的動(dòng)作?(僅猜測(cè)未證實(shí))),同時(shí)其也類似于游泳狀態(tài)下的步兵會(huì)原地持續(xù)播放動(dòng)畫的特性,空中的步兵在原地休息時(shí)也會(huì)不停地播放hover幀,這意味著hover與tread一樣都可以做很多幀。Fly=對(duì)應(yīng)了地面步兵的Walk=;FireFly=對(duì)應(yīng)了地面步兵的FireUp=;Tumble=對(duì)應(yīng)了地面步兵的Die1=。最后一個(gè)可以看出,不同于Die1,Die2這種設(shè)置,空中的死亡動(dòng)畫只能有一個(gè)。
飛行兵還有一個(gè)特別的死亡方式就是墜落。盡管墜落補(bǔ)刀導(dǎo)致的升級(jí)bug已經(jīng)讓許多mod禁止了(即Crashable=no),但這個(gè)功能確實(shí)并未消失。墜落與匍匐類似,都需要一個(gè)開啟動(dòng)作與結(jié)束動(dòng)作。正如火箭飛行兵在開始?jí)嬄鋾r(shí)會(huì)四肢向上,背包失去控制,而落地后則會(huì)四肢散成一堆碎片,背包也散落一地一樣,墜落條目由AirDeathStart=,AirDeathFalling=與AirDeathFinish=控制,從前往后第一個(gè)條目是開始?jí)嬄鋭?dòng)畫,第二個(gè)是墜落過程中的動(dòng)畫,第三個(gè)條目是墜落到地面以后的動(dòng)畫。

此外,jumpjet類步兵的影子都會(huì)縮小成一個(gè)點(diǎn)。這是系統(tǒng)強(qiáng)制寫死的效果。與之類似的還有空降時(shí)影子變成一個(gè)點(diǎn)。當(dāng)然,載具jumpjet就沒這個(gè)問題。因此當(dāng)你想做一個(gè)新的火箭飛行兵類單位時(shí),你甚至可以不用做影子,影子也會(huì)是一個(gè)黑點(diǎn)。


同時(shí),jumpjet字段與地面行走字段并不沖突,你可以讓你的步兵既能在空中飛并且開火,也能讓它在地上走路開火。西木甚至為火箭飛行兵制作了地面行走動(dòng)畫。一方面這是方便間諜模仿(玩家得多蠢才看不出來走地的火箭飛行兵是間諜),另一方面在運(yùn)動(dòng)方式上紅警2確實(shí)做得出來近處行走遠(yuǎn)處起飛的效果,只不過因?yàn)楫?dāng)有水時(shí)短距離移動(dòng)火箭飛行兵會(huì)由于不飛行而走到水里淹死才被西木隱藏了起來(所以還是有bug咯)。

六.雜項(xiàng)
上面是一些步兵制作的一些主要情況,但是通過shp builder工具中的序列書寫工具我們可以看見步兵序列art代碼中的所有種類代碼。下面我就根據(jù)這些代碼來逐個(gè)介紹一些不足以成一個(gè)大段但依舊很重要的重點(diǎn)。


1.幀序列參數(shù)內(nèi)額外的字母
這屬于基本ini知識(shí),但是為了方便個(gè)人查閱我還是在此寫一遍。
在幀序列中,閑置,歡呼,死亡,水中死亡,水中閑置這些參數(shù)內(nèi)后面會(huì)有一個(gè)額外的,由字母組成的參數(shù),其字母的含義代表著朝向。比如你做的閑置動(dòng)畫是步兵面朝左下做出的,那么你寫ini時(shí)最后一個(gè)參數(shù)就需要填"E"。下圖舉出了所有字母及其代表的朝向。

2.幀序列內(nèi)數(shù)字的含義
這也屬于基本ini知識(shí),但是為了方便個(gè)人查閱我也寫一遍。
一般任意幀序列內(nèi)都有三個(gè)數(shù)字。第一個(gè)數(shù)字需要填寫動(dòng)作開始于第幾幀減1。就比如ready序列一般是第一幀開始,所以你第一個(gè)數(shù)字需要寫0;第二個(gè)數(shù)字除死亡,歡呼,閑置動(dòng)作外與第三個(gè)數(shù)字應(yīng)一致;第三個(gè)數(shù)字表示的是你單個(gè)方向的幀長(zhǎng)度,例如你的行走幀每個(gè)方向是7幀,那么你就寫7。死亡,歡呼,閑置動(dòng)作,第一個(gè)數(shù)字還是開始幀數(shù)-1,第二個(gè)數(shù)字是動(dòng)作幀數(shù),第三數(shù)字就寫0,第四參數(shù)是方向,是步兵播放完動(dòng)作后面對(duì)的方向,也是上個(gè)條目已經(jīng)解釋過的內(nèi)容。
3.陰影問題
如果我們打開西木的步兵素材我們可以發(fā)現(xiàn),西木的步兵幀序列腳下一般都是有影子的。值得注意的是,這并不代表正常情況下shp的規(guī)律,即偶數(shù)幀數(shù)的shp的前半部分為本體,后半部分為影子的規(guī)律失效了。西木之所以把影子做進(jìn)了幀序列內(nèi)而非做到后面的原因是shp后半部分的影子幀在紅警2系統(tǒng)內(nèi),只要影子幀的顏色不是色盤0號(hào)色(即第一個(gè)顏色),都會(huì)被強(qiáng)制更換為半透明黑色。但是西木想要步兵的影子始終保持純黑實(shí)心效果,也就是假如步兵的影子在建筑下方依舊可以清晰可見,所以西木的步兵影子被西木做進(jìn)了步兵幀序列內(nèi)。


我反正不喜歡這種做法,所以我自己做的步兵是影子與本體分離。當(dāng)然,如果各位讀者想學(xué)習(xí)西木這種做法的話也是可以的。
4.匍匐與驚恐
控制匍匐的代碼是art里的“Crawls=”。如果這里寫了yes的話步兵在收到攻擊時(shí)會(huì)有匍匐幀。步兵匍匐時(shí)速度減慢且防御會(huì)增加。如果你想讓你的步兵擁有匍匐幀,你需要用你的動(dòng)作填充Crawl=,Up=,Down=與FireProne=。其中Crawl=是趴在地上不動(dòng)的狀態(tài),Down=是從正常站立到趴下的狀態(tài),Up=是從匍匐到爬起的狀態(tài),FireProne=是趴著開火的狀態(tài)。值得注意的是趴下與站起都分別是兩個(gè)動(dòng)作,這并不是簡(jiǎn)單的挨打以后立刻切換為匍匐,步兵是可以擁有趴下與站立起來的過程的,這個(gè)動(dòng)作不僅可以做出低姿態(tài)交戰(zhàn),還能做出持盾的步兵舉盾減傷的效果。

驚恐則是挨打以后步兵速度增加但無序奔跑的效果,在rules里由Fearless=控制,站在動(dòng)畫師的角度上來看就是一種特殊的行走動(dòng)畫。幀序列里由Panic=控制,填寫規(guī)則與Walk一致。

查閱原版英文教程以后我發(fā)現(xiàn),idle能做兩個(gè),分別是Idle1=與Idle2=。wetidle也是兩個(gè),分別為WetIdle1=與WetIdle2=。

5.死亡動(dòng)畫到底要做幾個(gè)?
死亡動(dòng)畫非常特別,所以我認(rèn)為需要單獨(dú)拿出來說明一下。(我能說我寫這一段之前其實(shí)也不算特別清楚么)

Die1=是當(dāng)士兵被指定了InfDeath=1的彈頭殺死后的動(dòng)畫。Die2=則是士兵被指定了InfDeath=2的彈頭殺死后的動(dòng)畫。然而Die3=卻并不是InfDeath=3的彈頭殺死后的動(dòng)畫,而是InfDeath=1殺死后的另一種動(dòng)畫。而且Die2與Die3是一組,當(dāng)InfDeath=2的彈頭殺死了這個(gè)步兵以后會(huì)在Die2與Die3中隨機(jī)播放一組動(dòng)畫。Die1與Die3又是一組,當(dāng)InfDeath=1的彈頭殺死了這個(gè)步兵后會(huì)在Die1與Die3中隨機(jī)播放一組動(dòng)畫。Die4=則是士兵被指定了InfDeath=3的彈頭殺死后的動(dòng)畫;Die5=則是士兵被指定了InfDeath=4的彈頭殺死后的動(dòng)畫。值得注意的是,查閱了InfDeath=條目我們可以知道其參數(shù)分別為0:立即死亡,1:轉(zhuǎn)動(dòng)倒下,2:爆炸,3:彈飛,4:燒死,5:電死,6:尤里造成的大腦爆炸,7:核輻射。InfDeath=不寫時(shí)默認(rèn)是0。燒死動(dòng)畫與彈飛動(dòng)畫在尤里復(fù)仇中其實(shí)都是有默認(rèn)指定的(一個(gè)是燃燒的小人,一個(gè)是被狂獸人打死后血肉橫飛的效果),因此對(duì)于一個(gè)普通步兵來說,最少需要兩個(gè)死亡動(dòng)作Die1=與Die2=。除非你有特殊需求,Die3,Die4與Die5一般都會(huì)被系統(tǒng)默認(rèn)的動(dòng)畫替代。

水中死亡效果默認(rèn)WetDie1=與WetDie2=中二選一,規(guī)則與Idle一致。

值得注意的是,如果你死亡動(dòng)畫沒做完,InfDeath=或是Ares的InfDeathAnim=不存在時(shí)。步兵死亡會(huì)直接消失。為了避免這種突兀的情況發(fā)生,死亡動(dòng)畫最少做兩個(gè)(你只做了一個(gè)怎么辦?寫兩次不就完了)

7.幀間動(dòng)畫突變問題
這個(gè)條目是特別針對(duì)我使用3dsmax中遇到的情況而展開的。我們需要堅(jiān)定一個(gè)點(diǎn),即最終效果一定是整數(shù)幀時(shí)刻的效果的幀序列的疊加。這句話看起來有點(diǎn)繞,我用一個(gè)通俗的方法解釋就是說,在你模擬播放時(shí),每個(gè)幀之間的動(dòng)畫其實(shí)在游戲內(nèi)是不顯示的。

為啥我要去強(qiáng)調(diào)這個(gè)點(diǎn)呢?我使用max制作步兵幀序列的時(shí)候,有時(shí)候需要在兩個(gè)動(dòng)作之間插入一個(gè)動(dòng)作,可是這個(gè)時(shí)候攝像機(jī)已經(jīng)轉(zhuǎn)動(dòng)調(diào)好了怎么辦?于是我這時(shí)只能把兩個(gè)動(dòng)作片段中間的那一幀無限放大,然后插入一些動(dòng)作。由于旋轉(zhuǎn)攝像機(jī)的問題,有時(shí)候max的自動(dòng)關(guān)鍵幀功能會(huì)出現(xiàn)bug導(dǎo)致攝像機(jī)在預(yù)覽時(shí)會(huì)快速亂轉(zhuǎn)。但其實(shí)這種亂轉(zhuǎn)是發(fā)生在一幀以內(nèi)的事情,所以后期渲染根本看不出來。(我在制作動(dòng)作時(shí)將動(dòng)作預(yù)覽的播放速度設(shè)置在了1/4,所以這種旋轉(zhuǎn)看著會(huì)格外明顯)

這一點(diǎn)同時(shí)也會(huì)影響到你制作帶旋翼旋轉(zhuǎn)的動(dòng)畫。舉個(gè)例子,當(dāng)你需要制作四片翼的直升機(jī)的升翼旋轉(zhuǎn)動(dòng)畫時(shí),直升機(jī)升翼單幀旋轉(zhuǎn)角度只有接近于45度時(shí)才能獲得最快的旋轉(zhuǎn)效果。而如果直升機(jī)的升翼只有2片的話,你就可以讓機(jī)翼在單幀之內(nèi)旋轉(zhuǎn)45-120度來展現(xiàn)較快的角速度。但如果你只是單獨(dú)追求幀數(shù)最大旋轉(zhuǎn)量的話,可能在預(yù)覽里你轉(zhuǎn)的飛快的機(jī)翼反而在最后渲染中變成了慢悠悠的倒轉(zhuǎn)。這點(diǎn)毫無疑問是我們需要避免的。

8.四肢比例
紅警2的步兵的四肢都需要粗一點(diǎn),太纖細(xì)的四肢會(huì)使步兵的效果很差。(所以如果你要想把你老婆做進(jìn)紅警2里,請(qǐng)做高一點(diǎn),否則你老婆的一個(gè)像素的瘦腿只會(huì)讓你嘔吐而不是蛇爆)


七.后記
到此,這篇專欄的主要內(nèi)容也結(jié)束了。當(dāng)寫到這里時(shí),我才發(fā)現(xiàn)這是我兩年來寫的第二篇萬字專欄。回望過去,從第一篇專欄開始的初入動(dòng)畫坑,到如今轉(zhuǎn)眼已有三年。在這三年里我單算步兵就做了一百余個(gè),算上所有特效與載具可能有一千個(gè)左右,所以這篇文章可以算是我在這三年的懵懵懂懂的探索中積累出的一點(diǎn)經(jīng)驗(yàn)之談。萬字技術(shù)專欄往往意味著讀完全文的人少之又少,但我覺得這篇文章是我這三年來制作的素材中所給我積累的寶貴財(cái)富的總結(jié)。對(duì)于任何一個(gè)圈子里的modder來說,興趣永遠(yuǎn)是他們前進(jìn)的動(dòng)力,創(chuàng)新與分享都是他們戰(zhàn)勝困難的途徑。紅警2至今轉(zhuǎn)眼推出了21年,雖說游戲未變,但是我卻實(shí)實(shí)在在的感受到了modder們平均能力的提高與素材制作工具的進(jìn)化。所以對(duì)于任何一個(gè)熱愛這個(gè)游戲的人來說,只有不斷追求進(jìn)取,才能讓自己在大環(huán)境的不斷進(jìn)步下有著不斷創(chuàng)新的能力。
最后預(yù)祝大家2022年快樂,希望新的一年里疫情能情況好轉(zhuǎn),大家也能開心的開啟自己的又一年學(xué)習(xí)與生活。