SCORE · 特技得分
0
连击 ×1
最高 0空翻 0
SPEED · 时速
0km/h
60 FPS 空中 0.0s
CONTROLS · 操作
W↑油门 S↓刹车/倒车 AD转向 Space手刹漂移 R复位 C视角 P暂停
空中特技
WS前/后空翻 AD侧翻

MADALIN STUNT CARS 2

WEBGL · WASM EDITION

初始化物理引擎…
UNITY WEBGL · 浏览器即点即玩

厌倦了固定赛道?
来点狂野的

完全开放的沙盒地图,没有赛道限制。超真实刚体物理引擎驱动 —— 翻车、飞跃、360° 空翻全部真实模拟。 跑车、越野、肌肉车随你切换,纯 WebGL + WebAssembly 渲染,无需下载客户端。

🌍自由开放世界

无赛道限制,全地图任你狂飙,想怎么开就怎么开。

⚙️超真实物理引擎

翻车、飞跃、360° 空翻全模拟,刚体碰撞逐帧解算。

🏎️多款豪车可选

跑车、越野车、肌肉车自由切换,性能手感各不相同。

⚡网页即点即玩

无需下载,WebAssembly 提速,低配电脑也能流畅运行。

🧩代码结构清晰

学习 WebGL / 3D 游戏引擎与物理引擎的优秀案例。

📁 文件结构说明
文件类型作用
index.htmlHTML游戏入口文件,加载 Unity WebGL 容器
game.jsonJSONUnity 导出的资源配置清单
*.unitywebBinaryUnity 编译的 WebAssembly 模块和资源包
style.cssCSS页面样式表
js/*.jsJavaScriptUnity 加载器和自定义脚本

1 · Unity WebGL 加载机制

通过 UnityLoader 实例化容器,并监听加载进度回调。

<script src="js/UnityLoader.js"></script>
<script>
  UnityLoader.instantiate("gameContainer", "game.json", {
    onProgress: (progress) => {
      console.log(`加载进度: ${Math.round(progress*100)}%`);
    }
  });
</script>

2 · 物理引擎通信 (JS ↔ WASM)

JS 通过 SendMessage 调用 C# 方法,C# 通过 DllImport 回传数据。

// JavaScript 调用 C# 方法
gameInstance.SendMessage('CarController', 'ApplyBrake', 'true');

// C# 调用 JavaScript(需用 [DllImport] 声明)
window.receiveFromUnity = (data) => {
  console.log("Unity消息:", data);
};

3 · 性能优化技巧

手动释放 WASM 堆内存,分段加载 code / data / framework 资源包。

// 手动释放 Unity 内存
gameInstance.Module._free(bufferPtr);

// 分段加载资源
UnityLoader.instantiate("gameContainer", {
  dataUrl: "data.unityweb",
  streamingAssetsUrl: "StreamingAssets",
  codeUrl: "asmCode.unityweb",
  frameworkUrl: "asmFramework.unityweb",
});

4 · 车辆控制 & 特技得分

键盘事件映射到游戏引擎;特技判定由引擎回传加分。

// C# 端特技判定
public class StuntManager : MonoBehaviour {
  [DllImport("__Internal")]
  private static extern void AddScore(int points);
  void Complete360() { AddScore(500); }
}

// JS 端接收加分
window.AddScore = (points) => {
  const el = document.getElementById('score');
  el.textContent = parseInt(el.textContent) + points;
};

5 · 扩展开发:MOD 与联机

利用虚拟文件系统写入自定义模型,或通过 WebSocket 同步玩家位置。

// 动态加载 MOD 车辆模型
function loadModCar(modelUrl) {
  fetch(modelUrl)
    .then(res => res.arrayBuffer())
    .then(data => {
      gameInstance.Module.FS_writeFile(
        '/mods/car.fbx', new Uint8Array(data));
      gameInstance.SendMessage('ModLoader', 'LoadCar', '/mods/car.fbx');
    });
}

6 · 性能监控 & 调试

读取帧间隔计算 FPS,接管引擎的标准输出流做日志转发。

// 帧率监控
setInterval(() => {
  const fps = 1 / gameInstance.Module.unityPerformance.nowFrameDelta;
  console.log(`当前FPS: ${fps.toFixed(1)}`);
}, 1000);

// 激活引擎控制台输出
gameInstance.Module.print    = (t) => console.debug('[Unity]', t);
gameInstance.Module.printErr = (t) => console.error('[Unity]', t);

已暂停