讓角色媲美真人運動員,EA分享:FIFA、Madden動作互動如何實現的

gamelook 發佈 2022-05-24T02:04:31.386631+00:00

作為互動藝術形式,遊戲裡的互動效果會直接影響玩家體驗,出色的動作匹配會讓玩家身臨其境,但如果互動效果與玩家操作不同步,就很容易讓玩家棄坑。

作為互動藝術形式,遊戲裡的互動效果會直接影響玩家體驗,出色的動作匹配會讓玩家身臨其境,但如果互動效果與玩家操作不同步,就很容易讓玩家棄坑。

在此前的GDC演講中,EA高級軟體工程師Henry Allen介紹了該公司的N-teract運動匹配系統,以及如何給Madden、FIFA以及更多大作設計環境和動態匹配效果。

以下是Gamelook聽譯的演講內容:

Henry Allen:

我是Henry Allen,在EA寒霜動畫團隊擔任高級軟體工程師,今天的目的是分享EA的一些多角色互動的發展,其中有些方法可能會在其他遊戲和引擎中也能被用到。

首先我們會快速了解EA的角色互動系統,由於之前GDC活動中講過這個系統,所以我們對此只做簡短的介紹,隨後我們會進入今天的主要內容,圍繞兩個話題進行,第一,多角色互動系統的拓展,不僅與其他角色互動,還會與遊戲環境以及遊戲內的其他物體互動,以這樣的踢腿動作舉例。

隨後我們會談到運動與姿勢匹配,會了解我們角色系統里的兩種集成運動匹配技術,與右邊的圖片有些關係。

N-teract是互動場景系統的縮寫,也就是EA的多角色互動系統,用來探測多角色互動環境,然後與動畫匹配、並在遊戲裡創造多人玩家互動時刻,在遊戲裡,它們就是這些實時互動。

比如,所有的防守都處理了玩家的所有互動,我們的多角色互動系統負責偵測玩家動畫來決定什麼時候哪個規則應該生效。

那麼,這個系統是怎麼運作的?首先,遊戲動畫狀態機決定系統會考慮哪個選手,同時應答請求互動,並執行快速互動。遊戲創作者對於這樣的互動什麼時候發生、會不會發生,都有著完全的控制權。

互動鑑別器(Interaction Evaluator)是中央處理器,它收集所有請求,並且把同一類型的角色互動請求分為一組,在每個組中,它首先會考慮Master選手作為互動參照,在我們的案例中,運球的人就是Master選手。

評估了Master選手之後,我們隨後進行廣泛核對,快速在我們的資料庫中排除距離比較遠的球員,然後確認合適的規則和剩餘的球員。最後我們在動畫資料庫搜索是否有匹配的動畫。

如果找到了匹配的動畫,狀態機就開始播放這個動畫,並開始進入處理狀態,來調整動畫讓它與角色互動一致。

物體與環境互動

我們解決了動畫與互動的協同問題,但該如何將物體與環境互動加入到這個系統之中呢?為此,我們需要討論再次互動中的被動參與者,我們將其稱之為幽靈互動。

在這個互動當中,我們有兩個角色與中間的受害者互動,中間這個角色沒有主動參與兩個互動當中的任何一個,他是一個被動參與者,在被擊倒之後,沒有參與後續的互動,但第一個到來的角色被另一個主動參與者擊倒,這些都是由玩家或者AI控制,這對於環境互動是有意義的。

這個系統可以用在實時互動之中,一個角色可以完全不參與任何互動,而不是作為一個參照點,這個「影子」由運球者觸發,並且會對其運動作出互動,這是典型的上下文環境互動,被動參與者的互動完全受到其他角色的影響。

由於其他角色只是為被動參與者提供上下文環境,從技術上來說,這個被動角色需要成為另一個角色,匹配這個角色應該比其他角色的配對更簡單。


Runtime是非常直觀的,我們用來匹配角色的參數有好幾個,但我們不希望這些環境使用角色,所以我們決定在遊戲世界裡增加Locators,後者就是帶有我們需要參數的互動點。

另外,我們也不希望角色和Locator有特殊代碼,所以我們增加了一個新的界面處理這類角色的匹配,並將其更新到所有需要與之互動的情況。

其它工具是因果控制器,我們需要追蹤locator,你可以對其進行自定義,並作為在場景中對它進行定位,並確定對應的互動與動畫,我們還在資料庫更新了代碼來匹配這些情況。

這是我們早期角色互動的一個創意原型,我們創作了一些動畫與牆壁互動,以便決定角色的手放在什麼地方可以觸發互動,然後我們用locator來代表牆壁在世界中的位置,角色可以利用這些locator重新與牆壁互動。

你還可以用它做更簡單的互動,比如角色觸摸牆上的紋理、或者玩家角色撞到了牆壁,你可以讓他們用手推牆壁,而不是臉直接撞上去;或者,還可以做不同角度、風格與門把手的互動,甚至是不同的角色類型。亦或者,你還可以做角色與寶箱的互動,或者與家具等任何物體的互動。

我們還允許內容創作者識別這些locator,以支持更為複雜的互動,這意味著我們的遊戲系統承載了他們需要用到的邏輯信息。

說到更複雜的互動,這是Madden遊戲裡的一個場景,紅色的locator代表了角色第一次跌倒的位置。在遊戲裡,當一個犯規行動在某條線發生的時候,你可以用這條線上的locator匹配對應的動畫。

在這種情況下,當角色走近locator的時候,就可以觸發對應的動畫,呈現合適的多角色互動。在實時遊戲中,它們只是作為互動的參照點。

那麼,這些locator能夠與運動中的物體互動嗎?最大的問題是彈道弧,因為你不能改變locator的位置去適應運動的物體,這樣會看起來不自然,所以與之互動的角色需要移動。但你也不能將它當前位置匹配,因為角色離開原來的位置在追逐球的運動方向,他們需要保持一致,所以我們需要預測運動以確定未來的位置。

我們將運動物體未來的位置增加多個locator怎麼樣?這樣隨著時間的變化,系統就可以自動選擇角色與不同位置之間的互動。

比如Madden團隊在這裡預測了足球可能運動的位置,每個點都代表了一個系統中的locator,這樣玩家就可以根據實際情況匹配並與任何一個位置互動。雖然這種方法可能看起來非常簡單和直觀,但我們發現它非常好用。

運動匹配與互動

如果你對此不熟悉,動態匹配是一種動畫技巧,給出一條通道讓角色照著走,我們越來越多的動畫團隊開始依賴這個技術,它可以在不犧牲玩家控制的情況下做到高保真度的動畫,在多角色情況下,我們也同樣需要這樣的能力。

在Madden遊戲裡,我們讓動態與拉力系統匹配以實現恰當的互動。

比如這種情況下,角色之間的距離太遠沒辦法斷球,系統可以預測未來的互動,並提前選擇可能發生的互動,並且把有意向參與互動的角色引導至理想的位置。

這裡藍色路線是運球者的預測路線,灰色路線是搶球運動員的路線,如果兩者的路線有了交集,我們會找到與這種情況對應的互動,然後用動態匹配將防守者帶到理想的位置,以便動畫不需要任何的延遲就能呈現。

這種情況下,它可以適配多種防禦情況,能夠適應不同角度的互動,因為參與者在使用動態匹配提前預測,在互動和動畫開始之前就達到了最理想的位置。

不過,這只是單個角色的動態匹配,在多角色情況下如何實現?

這個技術實際上在EA最初的8人團隊就已經開始研究了,他們調整了運動匹配技術以檢查不同姿勢下的運動匹配質量,以便讓玩家在不同參照點得到最佳的動態效果,然後讓這個參照點可以被另一個角色使用,這樣就可以在多角色場景下使用。

這是最早的創意動畫,展示了兩個角色對打和對打反映的動畫,甚至做了非常具有吸引力的demo,比如兩個角色通過遊戲代碼匹配。然而他們很快遇到了多玩家匹配的問題,並且很多年都沒解決。

比如多種可能的情況下,你如何挑選參與的合作者?或者在有效距離之外的參與者怎麼辦?如何處理被動或者幽靈參與者?比如被擊打者如果有更恰當的運動,就會讓整個互動顯得更自然。

經過多年的嘗試之後,很明顯的是,如果將多角色互動匹配與現有的角色運動系統分開研發,會是對資源的浪費。我們意識到團隊需要一起努力解決這個問題,我們有兩個強大的系統,但如何讓他們一起工作呢?

由於運動匹配支持了多角色,他們都在通過參照角色做匹配,並且都是通過動畫資料庫驅動。所以我們一開始是用後匹配資料庫取代最初的場景資料庫,這也是行之有效的,但並沒有發揮兩個系統的潛力。

我們得到了需要的效果,但丟失了相當多的功能。

為此,我們回到了原點,以尋求不同的方法。

一個可能的選項是將兩個資料庫合併起來,但問題在於兩個資料庫的功能差別很大,對於運動匹配,每一個與功能的匹配都是基於它與原始動畫的匹配度多高,如果任何一個失敗,我們都會拒絕匹配。

兩個功能在各自問題解決方面都有不錯的效果,所以我們覺得不需要改變任何一個。

因此,我們保持了兩個系統不便,但如果遇到多角色動畫,我們將其發送到運動匹配資料庫以尋找解決方案,為同一個動畫找到了多個進入點。

比如,這裡20幀當中每4幀就有一個進入點,下面這張圖是為每個進入點匹配的資料庫,被選擇的資源在左側,被選擇條件在右邊。比如我們可以將地16幀與起始幀匹配在一起。

這樣做可以讓我們保留兩種資料庫,使用選定功能並保持匹配風格,我們希望通過互動、匹配和拒絕一些幀數,我們的伺服器可以做到寬相匹配、限制需要檢查的幀數,解決一些規模化性能方面的擔憂。

前面提到的兩個角色擊打被動角色的案例,也使用了運動匹配,一開始的時候,系統選擇讓第一個互動者從正面擊打受害者,但由於時延的問題,後者被擊打的時候剛好轉過身去,這時候運動匹配就不合適了,雖然出發了新的動畫,但在連貫性方面表現的很差。

經過了調整之後,我們選擇了從背後擊打,並匹配了更自然的動畫,這有了更好的表現,而且不用完全改變被動參與者的前後面。

需要澄清的是,我們最初選擇讓這幀圖片出現在互動中,因為當時設計的角色互動是彼此面對面的,然而當真正相遇的時候,影子參與者轉過了身,所以這裡的交互點失敗,觸發了新的匹配,選擇了從背後擊打。

後來的互動效果更加自然,當然,如果能夠徹底改變動畫,兩個角色的手腳互動會更好一些。這就說到了我們的下一個話題,連貫性選擇。

傳統的互動包括動畫的選擇與播放,如果有時候兩個角色互動變成了三個角色碰撞,運動匹配的一個作用就是按照需要把資料庫里的任何一幀切換成其他資料庫里的任意幀,以做到向玩家呈現互動的連貫性。

比如這裡綠色的路徑是預設路線,藍色的路線是實時更新的動畫匹配。

我們增加了多個功能和選擇,我們最後增加到了互動系統之中以映射運動匹配中可用的功能,以便讓兩個系統儘可能高效率協同,這只是首個類似的改變。

遇到的挑戰

不意外的是,這樣的設計也存在一些挑戰,我沒時間一條條細說,但這裡會談到一些。

首先是不穩定的選擇,當FIFA最初做的時候,我們覺得非常不穩定,超過一幀或者兩幀就很難選擇同一個動畫,本應該根據需要來選擇對應的動畫,但這個方法並不總是能做到。其中一個很大的原因就是存在不同的匹配風格,尤其是互動當中比較複雜的匹配請求,主要是對於每個進入點,因為任何條件不滿足或者特定幀沒能匹配,都會完全改變運動匹配對這一幀的匹配選擇。

我們解決這個問題主要的方法是拓展動畫匹配的容忍度,換句話說,選定了互動之後,我們能夠選擇的匹配範圍應該更大,這讓運動匹配更穩定。

我們面臨的另一個比較大的問題是Pathing的處理,通常來說支持動畫協同的互動會在互動的時候發出指令,也就是使用Root motion。

如動畫所示,我們覺得這個方法比較有前途,但真正使用Root motion協同互動的時候,就奪走了玩家對角色的控制權,嚴重影響了玩法。

比如藍色的玩家控制路徑從來沒有和綠色應該有的路線重合,這對於FIFA來說是破壞遊戲體驗的,幸運的是,FIFA研發引擎讓我們有更多的選擇,我們可以只需要改變動畫而去改變Pathing。

我們做了這樣的嘗試,認為雖然會有一些不協調,但不會如此明顯。因為本質上來說,這是為了做運動匹配,而不是精準的動作協同。

性能也是我們關注的點,FIFA有很多的數據和系統,所以說說我們做的一些優化。我們很快發現這樣的互動系統在傳統互動場景下會有很多幀的靜態圖形。

比如這個非常極端的情況下,兩個角色的互動動畫實際上沒有多大的變化。

默認情況下,我們每4幀就有一個進入點,所以在300多幀動畫裡,我們加入了75個進入點,這時候我們可以改為每8幀一個點,但整體上會讓互動不那麼精準,因為不同的幀之間共享一些匹配條件。

不過,這個動畫裡的很多匹配條件是相同的,因為角色動作和角度很大程度上是靜態的,最終我們的選擇是,從75個進入點,減少為4個進入點,也讓運動匹配需要處理的資料庫大幅減少,對性能提升很顯著。

我想提到的另一個優化是Path Matching,解決方法是在互動系統中增加更多的匹配項,讓運動匹配系統中的Path Matching更有效率,也進一步減少了發送到運動匹配中的幀數。

比如,假設綠色箭頭是遊戲裡需要的路徑,動態路徑會按照紅色箭頭走就很糟糕,因為它會在未來走到錯的方向上,互動沒有未來的匹配概念,所以我們增加了遠距離匹配條件,這增加了很多的動畫,導致動作匹配的表現不佳。

需要注意的是,如果增加互動規模,會答覆增加動畫的覆蓋率,如果互動角色更多,可能會指數級增長。

我們可以從動畫裡看到,這些互動的呈現是在保證玩法為前提的情況下犧牲了一些動作協調性,我認為未來可以在這方面做出提高,比如通過Root motion和精準協同以得到更高的保真度視覺效果。不過,我們隊目前的效果非常滿意,並希望將它用到更多的遊戲之中,以上就是我分享的全部內容。

關鍵字: