遊戲中的角色是如何“動”起來的?

遊資網發表於2019-09-03
從紅白機時代的超級瑪麗,到PC時代CS裡面的反恐精英,再到如今主機上栩栩如生的“荒野大鏢客”。隨著技術的進步,遊戲中的這些角色,在移動的表現上愈加真實。

遊戲中的角色是如何“動”起來的?

我們會想,為什麼有些遊戲中的人物,移動起來非常不自然?而有些製作精良的遊戲裡,每個角色動起來都栩栩如生。這些角色是如何在我們遊戲世界中移動的呢?今天這篇文章就會簡單的給大家分享一下,遊戲角色在遊戲世界中的移動原理。

遊戲世界

-真實世界的複製版-

談到移動,首先不得不談一下我們遊戲中的世界。遊戲世界分為2D世界和3D世界,不妨先從3D遊戲的世界說起。3D遊戲世界是一個三維立體世界,和我們和現實中的世界相似,我們遊戲中的所有角色,都會在這個三維的世界裡面出生、移動、互動直至死亡。除了角色以外,遊戲中的其他物件也是如此產生的,比如說建築、武器、道具等等。他們身上都儲存著自己的座標位置,當我們在移動我們的角色的時,其實就是在不斷的修改當前角色的座標值。

對於2D遊戲,原理要簡單很多,所有物體都存在於一個平面世界,他們的移動也只是改變其X,Y兩個座標軸而已。

遊戲中的角色是如何“動”起來的?

移動效果≠動畫效果

-有動作不代表有位移-

現在,讓我們再把焦點放在角色的移動上。這裡先丟擲一個問題,當我們看見一個角色在奔跑時,他真的是在移動麼?

很多人可能會說這不是理所當然的麼?難道還能原地跑麼?沒錯,遊戲中的角色還真就可能是原地奔跑。事實上一個角色的移動和你看見他做什麼動作是沒有直接關係的。因為在遊戲裡面,移動表現“不等於”動畫表現。不妨看一下下面這張圖

遊戲中的角色是如何“動”起來的?

圖中的這個角色一直在播放移動的動畫,但是並沒有產生一丁點的位移,因為沒有任何邏輯去修改這個角色的位置。

動畫

-像拍電影一樣把動作連起來-

說到這裡,我們引出了一個新的遊戲概念——動畫,那麼如何理解遊戲中的動畫?為什麼播放動畫不會修改玩家座標呢?

所謂動畫,其實就是角色行為的一種表現方式,和電影或者動漫一樣,將一個物件在一段時間內的動作記錄並播放,就是一個完整的動畫。遊戲中針對每個角色都需要美術去單獨的為其製作很多段動畫,匯入到遊戲引擎中進行混合與切換,最後實現遊戲中的效果。比如說,角色在跑步時有跑步的動畫,跳起來會有跳躍的動畫,戰鬥會播放戰鬥的動畫,這些都是不同的動畫片段,需要美術們去提前製作。

遊戲中的角色是如何“動”起來的?

動畫其實也是分為2D動畫與3D動畫的,以前的遊戲都是2D遊戲,本質上和我們小時候看的小人書一樣,給一個角色建立多張圖片,每張上的圖片都有著不同的動作,將這些圖片連在一起播放就是一個2D動畫。

遊戲中的角色是如何“動”起來的?

不過與2D動畫將每一幀的畫面記錄下來不同,3D動畫記錄的角色的3D座標資料。目前的3D動畫實現方式都是由骨骼+蒙皮來做的,也就是說其實我們的每一個角色身上會有一些骨骼,當我們執行某個動畫時對應的這些骨骼位置就會發生變化,然後再驅動這個骨骼的“蒙皮”(可以認為我們玩家的皮膚)變化。比如說,一個玩家把手舉起來的時候,我們手臂對應的骨骼就會動起來然後包裹著他外面的皮膚也會隨之移動,這樣你就能看到一個真正的動畫了。那麼為什麼他執行動畫的時候不會移動呢?因為所有的動畫預設都是相對他自身變化的,相對遊戲世界他就是原地靜止的。(其實也可以做到相對世界發生變化,這個概念叫RootMotion,在後面的文章裡面會進一步講解)

遊戲中的角色是如何“動”起來的?

我們的角色在播放移動動畫的時候,其實就是一個迴圈的動畫,你可以看到這個角色的兩個腿在不停的走動,手臂也在不停的擺動,但是它只是在不斷的播放一個動畫。只要處理好動畫的開頭與結尾就能很好的表現出角色的移動。

遊戲中的角色是如何“動”起來的?

移動

-有“人”暗中操作-

瞭解了動畫與移動的關係,我們現在就知道驅動角色移動的其實另有其人。不過這個“人”是誰呢?其實這個“人”是誰並不重要,任何一個能做這個工作的物件都可以成為這個“人”,你把它交給地上的一塊石頭去處理也是可以的。在程式碼裡面,我們可以隨意抽象出來一個“移動控制者”,他的工作就是控制角色如何在遊戲世界裡面移動。

現在假如我們給他一點點移動速度(比如每秒0.1m),如果這時候他的動畫時邁開步子瘋狂地跑的話,就會發現動畫與速度是不匹配的。同理,如果把動畫調成走路的樣子,而速度改為10m/秒,就會發現他一步還沒邁出去就已經滑到對面牆上了,這就是我們平時所說的滑步現象(不過沒這麼誇張),也是很多遊戲裡面看起表現很差的原因。只有將速度與動畫完全匹配,才能讓遊戲角色移動看起來非常自然。

遊戲中的角色是如何“動”起來的?

當然,真實的情況可能要比這個還要複雜很多。我們的角色在一開始可能還正在緩慢的行走,不一會兒之後就突然開始加速跑了起來。為了模擬真實世界中的移動的樣子,我們需要對他的這個移動的過程要做各種精確的模擬,比如說行走、奔跑、甚至是游泳、飛行,不同的狀態需要以不同的方式去模擬。對於更加真實的遊戲,我們還應該把物理也考慮進去,重力、摩擦力、阻力等等都會影響角色的移動,不過任你怎麼複雜核心就是兩點——速度與加速度。一般來說,包含了上面這些邏輯的模組我們可以稱之為移動系統。同時,由於我們的速度發生變化,還需要動態的修改對應的動畫,這個匹配的處理以及播放的邏輯所在的模組我們稱為動畫系統。如果說,角色的移動是通過你的鍵盤按鍵觸發,那還會涉及到一個輸入系統,輸入系統會根據你的按鍵時長轉換成對應的移動速度或者是加速度,具體的轉換方式要看遊戲的設計邏輯。

遊戲中的角色是如何“動”起來的?

到目前為止,如果你認識到了移動表現=動畫系統+移動系統,你已經基本理解了遊戲角色的移動原理了。現在,不妨再稍微擴充一些。一般美術在製作動畫時只會製作走路的動畫以及奔跑的動畫,他不會製作一個0.5/m的走路動畫然後又製作一個0.6m/s的走路動畫,如果每個速度都要做一個動畫的話美術肯定要累死。那遊戲中的玩家,在走路和奔跑切換時該怎麼處理呢?答案就是把奔跑動畫與行走動畫進行融合,根據速度的不同,去混合這兩種動畫,我們可以稱之為blend space,參考下面的圖片。

遊戲中的角色是如何“動”起來的?

對於遊戲質量比較高的3A大作,他們的動畫遠遠不只這麼簡單,除了有基本的走的動畫,還有各種方向的轉身動畫,包括左轉和右轉,斜著轉,總之各個方向都有一個動畫,然後通過很多動畫的融合,才能達到一個非常流暢的一個表現效果。而且,移動系統的邏輯也需要模擬的非常精確,來和這些動畫達到完美的匹配。

移動同步

-告訴他你在哪-

最後,我們再來簡單談談移動的同步。當我們在玩網路遊戲時,你會在你的顯示器上面看到多個其他的玩家並且可以看到他們在移動,那這個過程中他是怎麼樣做的呢?這在遊戲設計中有一個專有名詞,叫做網路同步,網路同步是遊戲領域裡一塊非常重要也很複雜的一個功能。簡單來說,當其他玩家在移動的時候,他需要把他的座標實時的通過網路傳送到你的客戶端,你就可以看到他在你的客戶端上移動。在遊戲開發中,傳送的頻率,傳送的內容以及傳送方式的不同的都會影響到遊戲的具體表現,我在下一篇文章裡會詳細的分析虛幻引擎裡面的移動元件是如何處理的。

遊戲中的角色是如何“動”起來的?

作者: Jerish  
來源:遊戲開發那些事
原地址:https://mp.weixin.qq.com/s/UI7JPo4NYW58MTf5X9lgHg

相關文章