如何在 Unity WebGL 中保持游戏画面宽高比不变(防拉伸变形)

1次阅读

如何在 Unity WebGL 中保持游戏画面宽高比不变(防拉伸变形)

本文介绍通过 javascript 动态调整 unity webgl 容器尺寸的方式,强制维持指定宽高比(如 16:9),避免浏览器窗口缩放导致的游戏画面拉伸或裁剪失真。

本文介绍通过 javascript 动态调整 unity webgl 容器尺寸的方式,强制维持指定宽高比(如 16:9),避免浏览器窗口缩放导致的游戏画面拉伸或裁剪失真。

在 Unity 构建 WebGL 项目时,生成的默认 HTML 模板会将游戏画布()嵌入一个容器(通常为 div#unity-container)。由于浏览器原生不约束 的缩放行为,当用户调整窗口大小、切换全屏或使用不同分辨率设备访问时,若仅依赖 CSS(如 min-width: 100vw; min-height: 100vh),往往无法真正锁定画面比例——因为这些样式作用于父级布局流,而 Unity 运行时会主动重设 canvas 尺寸,覆盖 CSS 计算结果。

根本解法是绕过 CSS 布局限制,直接用 JavaScript 精确控制容器尺寸,确保其始终按目标宽高比(如 16:9、4:3 或 1:1)等比缩放,并居中显示。以下是推荐实现方案:

✅ 正确做法:在 index.html 中注入响应式缩放脚本

将以下代码插入 index.html 的

底部( 标签前),确保 dom 加载完成后再执行:

<script> function resizeGame() {   const container = document.getElementById("unity-container");   if (!container) return;    // 设置目标宽高比(例如 16:9 → 16/9 ≈ 1.777...)   const targetRatio = 16 / 9;   const windowWidth = window.innerWidth;   const windowHeight = window.innerHeight;   const windowRatio = windowWidth / windowHeight;    let newWidth, newHeight;    // 保持容器内切于视口(不溢出,不拉伸)   if (windowRatio > targetRatio) {     // 视口更宽 → 以高度为基准,计算等比宽度     newHeight = windowHeight;     newWidth = windowHeight * targetRatio;   } else {     // 视口更高 → 以宽度为基准,计算等比高度     newWidth = windowWidth;     newHeight = windowWidth / targetRatio;   }    // 应用尺寸并居中(需配合 CSS margin: auto)   container.style.width = newWidth + 'px';   container.style.height = newHeight + 'px';   container.style.margin = 'auto'; // 水平垂直居中 }  // 首次加载时执行,随后监听窗口变化 window.addEventListener('resize', resizeGame, false); resizeGame(); </script>

⚠️ 关键注意事项

  • CSS 配合不可少:确保 #unity-container 的 CSS 包含 display: block; margin: auto;,否则 margin: auto 居中无效;同时移除可能冲突的 width/height 固定值或 max-width 限制。
  • Unity Player 设置同步:在 Unity 编辑器中,进入 Player Settings → Resolution and Presentation,将 default Screen Width/Height 设为与脚本中 targetRatio 一致的参考分辨率(如 1920×1080),并勾选 Resize Game Window(此项影响初始 canvas 尺寸逻辑,但最终以 js 控制为准)。
  • 移动端适配补充ios safari 等浏览器存在地址栏动态隐藏问题,可能导致 resize 事件误触发。如需极致兼容,可添加防抖(debounce)逻辑,或监听 orientationchange 事件。
  • 性能提示:该脚本执行频率低(仅窗口 resize 时),无性能负担;无需引入第三方库,纯原生 JS 即可稳定运行。

✅ 效果验证

部署后,在不同尺寸浏览器窗口中测试:

  • 窗口横向拉宽 → 游戏高度撑满,左右留黑边;
  • 窗口纵向拉高 → 游戏宽度撑满,上下留黑边;
  • 切换横竖屏、缩放网页(Ctrl+/-)→ 容器实时重算,画面始终保持原始比例,无像素拉伸或压缩。

此方案不修改 Unity C# 代码,不依赖插件,轻量、可靠、跨浏览器兼容,是 Unity WebGL 项目响应式布局的事实标准实践。

text=ZqhQzanResources