在游戲的世界中,除了看的見的美麗的人物角色、輝宏的游戲場景,炫酷的游戲特效之外。還有一些不被玩家重視的技術內涵,但是這些內涵,承托了游戲的真實性,也體現了游戲一定程度上的科學性。
今天要說的,就是在游戲中運用到的物理特性。
01 物理的用途
其實游戲世界就是對真實世界的再現。很多現實中有的我們可以照搬進游戲,在現實中很難做到的事兒,我們也可以在游戲世界中實現。這就給了我們很多可以遐想的空間。比如炫酷的二段跳、輕功、等等神奇的動作,都可以在游戲世界中幫你實現。
不過回歸現實來說,符合現實物理定律的現象,最常見的就要數拋物線與碰撞了。比如射箭、投擲、發射都是基于現實的物理表現而進行仿真的。
所以,對于一個游戲設計者如果能夠細心去觀察現實生活中的物理現象并配合適當的想象與發散。就可以做出更有意思的或者更逼真的游戲玩法和體驗。
今次,就以世界著名小游戲《憤怒的小鳥》為例,來聊聊拋物與碰撞的設計。
02 拋物與碰撞
所謂拋物:指的是物體受力后以一定速度拋射出去,在空中僅受重力(有時還會考慮阻力)作用的過程
在游戲世界中,子彈的發射、物體的投擲等行為,都為拋物。但是需要注意的是:
導彈、火箭炮的發射飛行并不能完全屬于拋物的行為,因為會有一個尾部噴射的持續助力的過程,情況會相對復雜一些。
拋物之后,就必然會涉及到“碰撞”,所謂碰撞:指的是物體A以一定的速度和質量,在一定角度與具有一定速度和質量的物體B發生碰撞,從而產生二者運動狀態的同時改變。
有很多小型游戲和球類游戲,就僅僅以這2個物理行為來進行設計,并獲得玩家的喜愛。其中最著名的應該算是《憤怒的小鳥》了吧,純粹就是屬于一個簡單的物理游戲,再搭配著具有鮮明特性的卡通形象,風靡全球。
雖然現在成熟的高級引擎注入Unity之流都具備了完善的物理編輯功能,只需要輸入幾個參數,就可以輸出優秀的物理體驗。但是身為一個游戲制作者,不能光知其然,不知其所以然。
之所以選擇《憤怒的小鳥》來舉例,是因為它完全由二維平面上構成的模擬與運算,所有復雜的問題全部被簡化了,這樣更好用來講解入門。如果是3D游戲那么在計算拋物碰撞的時候,還需要考慮到前后左右的方向,以及碰撞時候的角度和面積產生的效果都是不相同的。對應的計算過程,也就會復雜得多了。
二維構圖,其實僅僅需要將游戲界面分為X、Y軸即可。
整個《小鳥》游戲中,可以將之拆解為兩個步驟:
1、拋物
2、碰撞
即:玩家通過調整小鳥彈出的方向、力度形成一個拋物線,撞擊目標獲得更高的分數過關的游戲。
拋物過程,其實就是玩家“蓄力彈射”的過程,從中我們可以拆解出3個變量:
1.彈射角度:α
2.彈射力度:F1(初始速度)
3.小鳥質量:M1
只要合理設計這3個變量,控制好它們之間互相影響的關系,那么就完成了拋物過程的設計了。
其中彈射角度和彈射力度通過滑動彈弓實現固定范圍內的改變,不同關卡提供不同質量的小鳥來實現,有的大,有的小。
其中,“彈射角度”顯而易見,控制一個彈射出去的飛行初始方向,角度設計一個合理的區間即可。但是需要注意的一點是:彈射的角度的選擇區間,配合著不同初始速度,與目標的距離相關,所以在設計彈射的角度區間的時候,需要考慮設計放置目標的距離,來設計彈弓的彈射角度。
其中所謂“彈射力度”僅僅是展現給玩家的一個效果而已,游戲在此處的實際控制量應該是“初始速度”,也就是彈弓可拉伸的范圍,表示小鳥獲得初始速度值的范圍區間,在《憤怒的小鳥》實際的處理結果中,并沒有按照“范圍”來處理,而是直接簡化成一個值(也就是說,彈弓只有一個發射的彈力具體值)。游戲在處理的時候,要控制一點:質量越大的鳥,初始速度越小;質量越小的鳥,初始速度越大。這樣處理的結果就能然玩家有一個感受:笨重的鳥,要想飛得遠,那就需要將角度調節剛剛好,而瘦小的鳥只需要適度調節角度即可。達到了一個提高真實度的目的。
注:彈力為固定,初始速度的大小,與小鳥的質量有關
小鳥的質量,則可以通過不同大小的小鳥形象進行區分。在游戲中也可以看到,大塊頭的小鳥形象表示大質量的物體,瘦小的小鳥形象表示小質量的物體。并且他們的質量不同,大小也不同。
確定了上述的3個參數,則可以產生了拋物的過程。(接下來的計算過程中,會用到上面的三個參數)
完成彈射后,小鳥獲得了3個屬性:
初始角度α、初始速度V0、質量M1.
這三個屬性決定了小鳥的另外幾個屬性:
1.飛行軌跡
2.碰撞時攜帶的動量
這兩個屬性決定了后面的碰撞過程,其中飛行軌跡決定了碰撞發生的位置(或者是否會產生碰撞),攜帶的動能決定了碰撞發生的具體效果。
彈射之后,小鳥就進入了拋物線的過程中,如下圖所示:
全程只計算重力(如果增加新的玩法,比如惡劣天氣刮風下雨,則需考慮空氣阻力),則小鳥在水平方向做勻速運動,在垂直方向做勻變速運動。
由此可得:
水平方向位移 = V0*COSα*時間T
垂直方向位移 = V0*SINα*時間T-0.5*g*時間T^2
從而得出了小鳥的實際拋物線圖像,通過VBA輸入函數和數據計算,可繪制小鳥的拋物線圖像。
輸入三個主要參數:
我們可以通過Excel的 編程能力,使用VBA功能,根據上述三個主要參數,繪制一條拋物線,具體代碼如下
隨便輸入上圖的一組數據,產生的拋物線圖像如下圖:
拋物線的具體形狀不重要,主要是根據拋物線的軌跡,我們可以定位到幾個關鍵點:
1、飛行的最高點
2、降落的地點
根據這兩個關鍵點的具體位置參數,我們可以通過不斷調試數據,設計目標點的幾個參數:
1、目標點距離起點的中心距離
2、目標點的高度和形狀
可以通過對EXCEL圖表固定XY軸的坐標值,在相同的坐標系下面調整不同的基礎參數,可以得到同樣游戲地圖下面不同的拋物線軌跡,僅僅彈射角度不同時,隨意數據如下圖所示:
當然,也可以控制其他相同,質量不同來進行調試,也就是控制變量法。這樣就可以清晰的根據我們的設計需求,獲得所有參數的精準范圍了。
通過調試數據(初始角度α范圍、初始速度V0范圍),可以詳細地分析出應該選擇什么樣的角度范圍,多大的初始速度,小鳥會在什么地方撞擊到多大的目標的什么部位。這些數據都可以被量化并且直觀地看出來了。
這樣,一個基礎的拋物物理計算模型就完成了。
完了這個基礎的拋物過程,設計者還可以增加各種特殊的屬性,增加游戲的玩法和樂趣,比如增加不同小鳥的技能:
1.加速鳥:可以在空中的某個地點進行一次加速,獲得一次推力,可以飛的更遠。在上述模型的基礎下,這個加速的具體值也是很容易設計和計算出來的。
2.減速鳥:可以在空中的某個地點瞬間速度減少,減少飛行的距離。
3.爆炸鳥:在空中某個位置,小鳥的發生解體成N個小鳥,每個小鳥的質量都為M1/N。然后產生新的飛行效果。
碰撞過程:
當小鳥按照設計者的預期飛行范圍落在目標處,則發生了碰撞,并且通過碰撞不同的物體產生不同的分數獎勵,因此在這里的目標物體的放置設計,還與游戲積分和玩家成長關聯在了一起(例如高分數的目標,不能放在輕易可以撞到的位置,需要認真設計)
在真實物理學中的碰撞過程中,主要有兩個參數變化:
1、動能
2、動量
因為動能會有損耗,這個在現實世界中都是很復雜的變化,因此一般在這種體量的游戲中,不會去計算動能的轉化過程,我們會根據物體的動量轉化來分析和設計碰撞行為(動量守恒)。
基礎公式(矢量公式):M1*V1+M2*V2=M1’*V1’+M2’*V2’
由公式可以看出來,我們要想在碰撞過程中盡量產生一種“真實”的游戲體驗,那么不僅僅要設計小鳥的質量,我們對于每個目標物體,也是要設計對應的質量。在這種設計下,就會產生了這樣的游戲感受:
1、玩家用很輕的鳥,可能撞不動很重的目標,用很重的鳥可以撞動很重的目標。
2、小鳥撞擊物體后,根據不同目標質量,小鳥可能會反彈,也可能會繼續前進。
上邊這兩個問題,說白了就是手感問題,做完拋物與碰撞后,我們需要調整【手感】;手感的提升可以獲得更好的用戶體驗,讓用戶玩著不別扭,在游戲的世界中:“手感可能比真實更重要!”
以上就是本次關于游戲中物理知識應用的分享,其實還有很多經典的游戲運用到了物理知識。
比如【打磚塊】
下一期會再講述一下,關于游戲中【碰撞】的其他做法
往期回顧: