利用Unity自帶物理引擎實現小球碰撞無損反彈
來自專欄 策劃的遊戲之路
之前玩過一款物理彈球的遊戲,覺得很有意思,也萌發了做一款類似的遊戲,這裡講講如何做到碰撞後無損反彈。
作為一個業餘遊戲開發者,而且知道Unity自帶的物理引擎功能很完善,所以一開始就沒打算自己寫相關代碼。首先我自己這個項目是2D,所以裡面用到都是2D組件或者材質。
一、小球
先創建一個3d小球,刪掉3d碰撞盒,加上2d碰撞盒。
我們在小球上加一個物理組件,3D項目可以用Rigidbody這個組件,參數略有差別。
(Rigidbody2D參數:https://blog.csdn.net/SerenaHaven/article/details/78851089)。
因為在運行的時候發現小球碰撞的時候Rotation有Z軸旋轉,所以在Constraints里勾上了Freeze Rotation Z,不讓其旋轉。
二、牆壁
牆壁就比較簡單,創建四個cube,圍成個圍牆,同理刪掉3d碰撞盒,加入2d碰撞盒(牆是方形,球是圓形,組件不一樣),其他都不需要設置,我們只需要這個碰撞盒,都不需要加組件Rigidbody,因為牆是不動,這樣也比較省資源。
三、無損反彈
這時候小球碰到牆壁會直接粘在牆上,這時需要在物理組件Rigidbody上的Material上加上物理材質。點擊菜單欄的Assets--Create--Physical Material 2D。
給這個物理材質命名後,點擊這個材質我們看到有兩個屬性。
第一個是摩擦力係數,第二個是反彈係數,想要無損碰撞反彈,反彈係數則填1。
將這個物理材質拖到RigidBody的Material里
這樣,一個無損的封閉的碰撞系統就完成。
小球的發射比較簡單,這裡就不細說了。
四、速度過慢導致碰撞後速度消失
在運行中,發現如果小球的水平分速度太小,碰撞後就變成0,這個問題困擾我很久,找不到原因,甚至讓我想自己寫這個碰撞機制。查閱資料後才發現,這個物理材質還有一些參數設置。具體看下圖
紅框就是罪魁禍首,默認值是1,表示低於這個數值的速度將認為不是碰撞,速度也就消失
(參考:https://blog.csdn.net/zqzhang1988/article/details/71915582)
關於小球碰撞反彈就先寫到這裡,後面繼續研究,歡迎討論!!!
推薦閱讀:
※Dirty Game Engine
※自製遊戲引擎 - 0 - Hello world
※[Siggraph15] GPU-Driven Rendering Pipelines
※從零開始手敲次世代遊戲引擎(四十二)
※從紋理中生成法線貼圖