黑魂复刻游戏的碰撞摩擦问题——Unity随手记(2021.4.27)
文章目錄
- 前言
- 今天實現的內容:
- 角色跳起來時的卡墻問題描述
- 修改物理材質方案
- 修改m_planarVec方案
- BUG以及缺陷:
- 值得注意的:
前言
本篇博客旨在解決黑魂like游戲開發時遇到的一個問題,當我們的角色跳起來撞墻時,會卡在半空中。
而且由于在空中時我們是沒用辦法操作的,所以基本上就卡死了。
今天實現的內容:
角色跳起來時的卡墻問題描述
這個問題的描述如前言所述,問題產生的原因主要是因為在我們的角色控制器代碼會在跳起來時鎖死m_planarVec,而這時m_planarVec是有大小的,所以在FixedUpdate中會一直給剛體的速度賦值(m_rb.velocity = new Vector3(m_planarVec.x, m_rb.velocity.y, m_planarVec.z) + m_thrustVec;),這本來是為了維持跳躍時的慣性效果,卻導致角色撞在墻上時依舊會一直具有一個向前的速度,按照Unity的物理引擎算法,這會產生一個與墻面的摩擦力,所以導致角色掉不下來卡死在墻上。所以這是一個摩擦力的問題。要解決,我們可以更換墻面的物理材質,或者在檢測到撞墻時改變m_planarVec從而改變速度。
修改物理材質方案
先創建一個新的物理材質。
關于Unity物理材質的幾個參數,分別是動摩擦系數,(最大)靜摩擦系數,彈性,描述該物理材質與物體產生摩擦時按照什么算法計算實際摩擦系數(兩個物體的最大值、最小值、平均值、相乘的值)、以及描述該物理材質與物體產生彈性時按照什么算法計算實際彈性系數(最大值、最小值、平均值、相乘)。在這里,我們將動靜摩擦都設為最小,將Combine設置為按照最小值計算。
接下來,打開Project Settings中的Physics,我們可以將我們自己的物理材質設置到Default Material項,這樣項目中所有未指明物理材質的游戲對象會被默認設置為Default Material項上的材質。在這里我們將一個正常摩擦力的材質放在Default Material項,因為我們還是需要摩擦力來爬坡,否則站到坡上時角色會自己滑下來。
最后,為了解決BUG,我們將在腳本中動態修改游戲對象的物理材質,方案還將是老一套,在動畫狀態Ground上添加FSMOnExit,添加消息OnGroundExit,之后在OnGroundEnter中將材質設置為正常摩擦力的,在OnGroundExit中將材質設置為零摩擦力的。腳本如下:
[Header("===== 物理材質 =====")]// 最大摩擦力材質public PhysicMaterial friction_normal;// 零摩擦力材質public PhysicMaterial friction_zero;// 角色膠囊體碰撞器private CapsuleCollider m_capCol;// ------------------- 生命周期方法 ---------------------- // Awake適合用來做GetComponentvoid Awake(){// ...m_capCol = GetComponent<CapsuleCollider>();}// ------------------- 消息處理 ----------------------public void OnGroundEnter() // OnGround應該理解為:行走/跑時 不一定是指在地面時{// ...// 在行走時設置角色的物理材質為最大摩擦力材質m_capCol.material = friction_normal;}// 離開Base層的動畫節點ground時執行的方法// 通過PlayerController動畫機中的ground節點上掛載的FSMOnExit調用public void OnGroundExit(){// 沒有行走時設置角色的物理材質為最大摩擦力材質m_capCol.material = friction_zero;}該方案能很好的解決問題
修改m_planarVec方案
這屬于我自己想的方案,具體是,當角色在空中發生碰撞時,修改m_planarVec的大小。不過這個還是留著以后再實驗吧。
BUG以及缺陷:
這一篇博客都在描述BUG。
值得注意的:
在我們的項目中,沒有任何物體會具備彈性。
總結
以上是生活随笔為你收集整理的黑魂复刻游戏的碰撞摩擦问题——Unity随手记(2021.4.27)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【20保研】北京航空航天大学网络空间安全
- 下一篇: Adams调用cffsub求解动力学仿真