物理系統可幫助您模擬現實中的碰撞和受力等物理表現。
實體模組
物理學是一個預設載入的模組。
您可以在這裡修改全域的實體設定:
- 重力的方向和大小。
- 預設的物理材質。請參考下文碰撞-物理材質的部分。
- 全域能量閾值。計算物體的動能,公式為
m表示物體的質量,單位為kg。
v表示物理的速度,單位為m/s。
當物體具有的動能小於這個閾值時,便不再運動。如閾值設定為0.5,一個1kg的物體在速度小於1m/s後就不再運動。
- 角色控制器碰撞閾值。僅適用於玩家模組開啟【是否使用具有實體效果的玩家控制器】或完全自訂的角色控制器。
動量公式為:
m為質量,單位為kg。
v為速度,單位為m/s。
在發生碰撞時,將玩家與被撞剛體的動量相減,並取動量差在碰撞法線上的分量的模,與角色控制器碰撞閾值進行比較。如果小於這個閾值,則會穩定地推動該剛體,否則會發生劇烈碰撞。
粗略地說,影響是否劇烈碰撞的參數是:
-
玩家或角色品質越大,越容易發生劇烈碰撞。
-
玩家或角色與被撞剛體的相對速度越快,就越容易發生劇烈碰撞。
-
角色控制器碰撞閾值設定越大,越不容易劇烈碰撞。
例如角色控制器碰撞閾值設定為50時,一個50kg的玩家以1m/s的速度可以在正面碰撞時與任何靜止的、質量與玩家或角色相近的剛體發生劇烈碰撞。
- 物理層級。不同層級的碰撞是否發生取決於物理配置。
為玩家配置一個非預設物理層級:
在實體配置中取消Custom層級和預設層級的碰撞:
會發現玩家可以無感穿過任何預設物理層級的物體:
依賴碰撞觸發的物件也不會觸發:
碰撞形狀和碰撞
自訂物件應用於物理系統需要兩個基本組件:
碰撞形狀組件和碰撞組件。
對於絕大多數物件來說,您只能在其上發現一個碰撞組件。
因為它們一般不是自訂物件:
對於需要自訂碰撞形狀和物理材質的需求,我們建議您新建一個空節點,並對這個空節點進行操作:
碰撞形狀
碰撞形狀組件決定了物體發生碰撞的邊界。
碰撞類型:
碰撞類型決定了碰撞的基本形狀,我們提供了立方體、球形、膠囊體三種基本形狀,和網格碰撞體。
網格碰撞體是根據模型的邊界模擬的與模型視覺外觀近乎一致的碰撞形狀。
對於建立的空節點,需要新增自訂渲染元件來規定其網格形狀和大小。
對於基本形狀的碰撞形狀,可以修改他們的位置、大小或透過手動的方式調整其外形:
拖曳碰撞盒上的黃點可以調整碰撞形狀
網格碰撞外形具有是否為凸多邊形的選項
凸多邊形:是否與其他網格碰撞體碰撞。未啟用凸多邊形的網格碰撞體僅在沒有剛體組件的遊戲物件上支援。若要將網格碰撞體用於剛體組件,請勾選凸多邊形選項。
碰撞
物理材質
物理材質決定了此碰撞體的一些物理屬性。
對於自訂物件來說,碰撞的物理材質支援您自訂。而對於大多數官方提供的非自訂物體來說,物理材質是不支援修改的。
物理材質檔案可以建立。
您可以在實體材質檔案的inspector面板修改下列屬性,讓所有掛載該物理材質的物件獲得對應的物理屬性。
是否是觸發器
當勾選是否為觸發器複選框時,該碰撞體會無視物理碰撞,但可觸發事件。
這意味著該物體不會參與預設的物理碰撞邏輯:
但是可以觸發碰撞事件:
物理層級
決定物理所在層級,不同層級的碰撞是否發生取決於實體模組中的配置。
剛體
剛體組件會使物體受物理控制,使其受力的影響。
若要新增剛體組件,必須先擁有碰撞組件。
剛體分為靜態、動態、運動學的。
靜態剛體多用於沒有速度、不受力的物體,例如地面、牆壁等不會移動的物體。修改這些物體的位置、縮放會加大效能開銷。
動態剛體多用於有質量、速度等力學特性的物體,可受力的影響。
您可以在動態剛體選項下修改物理相關的參數、如重心、品質。您也可以選擇鎖定指定軸,令剛體不會發生特定的位移或旋轉。
運動學剛體可以手動控制移動和旋轉,但不受其他剛體的碰撞或力的作用,常用於動畫、特效的製作。
角色控制器
FF玩家控制器
預設情況下,玩家對玩家角色的操作繼承於FreeFire的玩家控制器。
有物理效果的玩家控制器
在玩家模組中,勾選【是否使用具有實體效果的玩家控制器】後,即可修改部分玩家控制器的實體參數。這種情況下玩家開始一定程度參與遊戲內的實體模擬,如實體模組中的【角色控制器碰撞閾值】配置會開始生效。
<strong>是否使用具有物理效果的玩家控制器:</strong>勾選則使用具有自訂物理效果的控制器,並展開相關配置。
<strong>總高度,包括上下半球:</strong>人物膠囊碰撞體的高度。
<strong>上下半球的半徑:</strong>膠囊體半徑,不能超過高度的1/2。
<strong>品質:</strong>玩家品質。
<strong>最大上坡角度:</strong>超過該角度的斜坡無法走上去,玩家會開始滑落。
<strong>步距垂直偏移:</strong>允許玩家偏離該配置的距離而不脫離地面或被阻擋,常用於在樓梯上移動時。
<strong>最小移動距離:</strong>如果角色控制器要移動的距離小於這個值,玩家則一動也不動。
<strong>皮膚厚度:</strong>允許其他物體嵌入角色碰撞體的深度,用於避免抖動或卡住。
<strong>自身所受到的重力加速度:</strong>在三維方向上所受的重力加速度。對於玩家角色來說,這個設定會覆蓋全域物理設定。
<strong>啟用自訂推力:</strong>開啟後,角色推動剛體時施加的力可以自訂。開啟後展開相關配置。
<strong>自訂推力力量:</strong>角色推動剛體時施加的力大小。
<strong>多段跳高度:</strong>進行多段跳時跳躍的高度。
<strong>多段跳的最大次數:</strong>每次多段跳最多支援的跳躍次數。
<strong>空中移動:</strong>開啟後,玩家可以在空中改變移動速度和朝向。
完全自訂的角色控制器
在完全自訂的角色控制器中,您可以拋開所有限製完全自訂角色控制器,但是這個控制器沒有任何預設的功能。
要使用完全自訂的角色控制器,需要使用角色控制器元件,並且作為被控制的角色的物體不能帶有碰撞、碰撞形體、剛體等組件。
具體使用方法請參考下方範例。
範例
我們將透過製作一個簡單的橫板模式的角色控制器來進行說明自訂角色控制器的使用方法。
搭建場景
簡單搭建一個場景。
製作玩家角色
這裡我們只製作一個簡單玩家角色。
建立一個空物體:
為這個物體加入角色控制器元件。
為角色控制器新增自訂屬性:狀態。我們後續將使用狀態來控制玩家角色的左右移動。
現在角色並沒有外觀,所以為這個空節點添加一個空的子節點用來顯示外觀。
為空的子節點新增自訂渲染元件。
選擇Mesh為圓柱體。
此時選取父節點,在場景編輯器觀察我們的角色。
膠囊體網格是父物體的角色控制器元件,圓柱體是子物體的自訂渲染元件。我們發現角色控制器似乎比外觀高出一些,而且範圍比模型要小。
調整子物體的相對高度與角色控制器外觀,達到二者大概匹配的程度。
請特別注意,對於角色控制器來說,它的高度必須要大於半徑的二倍。
將製作好的角色設為預製體,重新命名為New_player(或任何你喜歡的名字)。在場景中刪除製作使用的空物體。
初始化
建立一個全域腳本,用來屏蔽預設玩家、創建新玩家、設定移動方法。
1.清空預設UI
要使用自訂角色控制器,就先解決自備的玩家控制器。玩家角色是無法從遊戲中刪除的,不過我們可以使用一些方法來讓玩家角色無法被操控也無法被看見。
使用關閉預設UI接口,我們可以屏蔽掉所有可以直接操控預設玩家的UI。
2.使用自訂相機
預設的相機是跟隨預設玩家角色的,我們需要使用一個新的自訂相機只用來觀察我們創建的新玩家角色。
3.儲存玩家數據
建立一個全域變量,用於儲存每個玩家的自訂角色控制器。
4.設定移動方法
我們採取透過判斷角色控制器狀態的方法控制移動,設定0代表不動、1代表向左、2代表向右。
每次更新時都讓所有自訂控制器執行一次移動方法,移動方法內檢查玩家控制器的狀態,若處於移動狀態,使其向對應方向移動一個小的位移。
當固定幀更新時事件以每秒30次的頻率觸發,相當於角色控制器以30*0.1=3m/s的速度移動。
建立自訂操作UI
建立一個UI,用於控制自訂角色控制器移動。
三個按鈕分別用於使玩家向左移動、向右移動和跳躍。
為UI實體新增腳本,使用回呼處理邏輯:
- 跳躍
透過為自訂角色控制器施加力的方式實現跳躍。
施力介面可以直接選擇施加速度,避免了力和質量的運算。
- 移動
我們透過改變狀態來控制移動,分別處理玩家在按下和放開按鈕時的狀態即可。
在按鈕上新增回調,分別呼叫這些方法。
- 跳躍
- 移動
偵錯
邏輯正常運作。
補充:鏡頭調試
在使用自訂鏡頭時,有時很難確定一個合適的鏡頭參數。
我們可以透過增加一個控制鏡頭的UI來在開發階段調整鏡頭。使用相同的想法可以幫助您在偵錯階段不斷優化自己的角色控制器表現。
建立UI
我們使用按鈕來控制鏡頭上下左右前後移動,並透過一個按鈕列印當前的鏡頭偏移量。
編寫腳本
為UI實體新增腳本。
移動鏡頭,以向上移動為例:
列印鏡頭參數:
新增回調
為每個按鈕新增回調:
以向上移動為例:
列印鏡頭參數:
這樣就可以在遊戲調試時調整鏡頭以達到您想要的效果了: