
開場去年做跨平臺項目時遇到一個真實翻車現場:同一套角色跳躍代碼,iOS 上手感完美,安卓上卻像踩在棉花上。排查三天,最后的根因出人意料地平淡——不是"兩個平臺用了不同物理引擎",而是兩臺設備的渲染幀率不同:低端機掉幀時 Unity 的 FixedUpdate 追趕機制(Maximum Allowed Timestep)介入,物理步進次數被悄悄壓縮,AddForce 的實際沖量累積變了,手感自然不一樣。物理引擎明明是同一個 PhysX,表現卻分叉了。這就是游戲引擎存在的第一理由,也是它的第一個謊言:引擎把跨平臺差異封裝成統一接口,但"寫法統一"不等于"行為統一",更不等于"能力封頂"。這篇文章以物理層為切片,講清楚三件事:統一接口到底封裝了什么、封裝在哪些地方必然漏水、工程上怎么在漏水點自救。一、統一接口的核心:抽象與適配引擎的抽象層本質是設計模式里的Adapter Pattern:把平臺差異藏在實現細節里,對上層暴露一致的 API。1.1 渲染與輸入的封裝以 Unity 為例,Input.GetAxis("Horizontal")這行代碼,在 PC 上讀鍵盤 A/D,在主機上讀手柄左搖桿,在手機上讀觸屏虛擬搖桿。開發者不用關心底層是 Win32 的 Raw Input、XInput 還是 UIKit 的觸摸事件。public class PlayerController : MonoBehaviour { public float moveSpeed = 5f;