# Web部署完整指南 **版本**: 1.0.0 **更新时间**: 2025-12-25 **适用于**: Godot 4.5+ 项目 ## 📋 目录 1. [导出准备](#导出准备) 2. [Godot编辑器配置](#godot编辑器配置) 3. [自动化导出脚本](#自动化导出脚本) 4. [本地测试](#本地测试) 5. [生产环境部署](#生产环境部署) 6. [服务器配置](#服务器配置) 7. [性能优化](#性能优化) 8. [常见问题解决](#常见问题解决) --- ## 🚀 导出准备 ### 系统要求 - Godot 4.5+ - Python 3.x(用于本地测试服务器) - Web服务器(Apache/Nginx/IIS等) ### 项目结构检查 确保项目结构完整: ``` whaleTown/ ├── assets/ # 游戏资源 ├── core/ # 核心系统 ├── scenes/ # 场景文件 ├── scripts/ # 脚本文件 ├── docs/ # 文档 ├── build/ # 导出目录(自动创建) └── project.godot # 项目配置 ``` --- ## ⚙️ Godot编辑器配置 ### 1. 下载导出模板 1. 打开Godot编辑器 2. 点击 `Project` → `Export...` 3. 点击 `Manage Export Templates...` 4. 点击 `Download and Install` 下载Godot 4.5导出模板 5. 等待下载完成 ### 2. 创建Web导出预设 1. 在Export窗口中点击 `Add...` 2. 选择 `Web` 平台 3. 配置以下设置: #### 基本设置 ``` Name: Web Export Path: build/web/index.html Runnable: ✓ 启用 Dedicated Server: ✗ 禁用 ``` #### Web选项 ``` Variant: release Vram Texture Compression: ✓ 启用 Export Type: Regular Custom HTML Shell: res://assets/web/custom_shell.html Head Include: (留空,已在自定义模板中配置) ``` #### 高级选项 ``` Custom HTML Shell: res://assets/web/custom_shell.html Progressive Web App: ✓ 启用(可选) Icon 144x144: res://icon.svg Icon 180x180: res://icon.svg Icon 512x512: res://icon.svg ``` ### 3. 项目设置优化 在 `Project Settings` 中配置: #### 渲染设置 ``` Rendering > Renderer: - Rendering Method: gl_compatibility - Rendering Method Mobile: gl_compatibility Rendering > Textures: - VRAM Compression > Import ETC2 ASTC: ✓ ``` #### 网络设置 ``` Network > SSL: - Certificates Bundle: (如果需要HTTPS API调用) ``` --- ## 🔧 自动化导出脚本 ### Windows批处理脚本 创建 `scripts/build_web.bat`: ```batch @echo off setlocal enabledelayedexpansion echo ======================================== echo 鲸鱼镇 Web版本导出工具 echo ======================================== echo. REM 配置变量 set "PROJECT_NAME=whaleTown" set "BUILD_DIR=build\web" set "GODOT_PATH=C:\Program Files\Godot\Godot.exe" set "EXPORT_PRESET=Web" REM 检查Godot是否存在 if not exist "%GODOT_PATH%" ( echo [错误] 未找到Godot可执行文件: %GODOT_PATH% echo 请修改脚本中的GODOT_PATH变量 pause exit /b 1 ) REM 创建构建目录 echo [信息] 创建构建目录... if not exist "build" mkdir "build" if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%" REM 清理旧文件 echo [信息] 清理旧的导出文件... if exist "%BUILD_DIR%\*" del /q "%BUILD_DIR%\*" REM 导出项目 echo [信息] 开始导出Web版本... echo 导出路径: %BUILD_DIR%\index.html echo. "%GODOT_PATH%" --headless --export-release "%EXPORT_PRESET%" "%BUILD_DIR%\index.html" if %ERRORLEVEL% neq 0 ( echo [错误] 导出失败!错误代码: %ERRORLEVEL% pause exit /b %ERRORLEVEL% ) REM 复制额外文件 echo [信息] 复制配置文件... copy "web\*.json" "%BUILD_DIR%\" >nul 2>&1 copy "web\*.ico" "%BUILD_DIR%\" >nul 2>&1 REM 生成部署信息 echo [信息] 生成部署信息... echo {> "%BUILD_DIR%\deploy_info.json" echo "project": "%PROJECT_NAME%",>> "%BUILD_DIR%\deploy_info.json" echo "version": "1.0.0",>> "%BUILD_DIR%\deploy_info.json" echo "build_time": "%date% %time%",>> "%BUILD_DIR%\deploy_info.json" echo "platform": "web">> "%BUILD_DIR%\deploy_info.json" echo }>> "%BUILD_DIR%\deploy_info.json" echo. echo ======================================== echo 导出完成! echo ======================================== echo 导出位置: %BUILD_DIR%\ echo 文件大小: for %%f in ("%BUILD_DIR%\*") do echo %%~nxf: %%~zf bytes echo. echo 下一步: echo 1. 运行 scripts\serve_web.bat 进行本地测试 echo 2. 将 %BUILD_DIR%\ 目录上传到Web服务器 echo. pause ``` ### 本地测试服务器脚本 创建 `scripts/serve_web.bat`: ```batch @echo off setlocal enabledelayedexpansion echo ======================================== echo 鲸鱼镇 本地Web服务器 echo ======================================== echo. set "BUILD_DIR=build\web" set "PORT=8000" REM 检查导出文件 if not exist "%BUILD_DIR%\index.html" ( echo [错误] 未找到Web导出文件! echo 请先运行 scripts\build_web.bat 导出项目 echo. pause exit /b 1 ) REM 检查Python python --version >nul 2>&1 if %ERRORLEVEL% neq 0 ( echo [错误] 未找到Python! echo 请安装Python 3.x: https://python.org echo. pause exit /b 1 ) REM 显示文件信息 echo [信息] Web文件信息: for %%f in ("%BUILD_DIR%\*") do ( set "size=%%~zf" set /a "size_mb=!size!/1024/1024" echo %%~nxf: !size_mb! MB ) echo. echo [信息] 启动本地服务器... echo 端口: %PORT% echo 目录: %BUILD_DIR% echo. echo ======================================== echo 在浏览器中访问: http://localhost:%PORT% echo 按 Ctrl+C 停止服务器 echo ======================================== echo. REM 切换到构建目录并启动服务器 cd "%BUILD_DIR%" python -m http.server %PORT% echo. echo 服务器已停止 pause ``` ### Linux/macOS脚本 创建 `scripts/build_web.sh`: ```bash #!/bin/bash echo "========================================" echo " 鲸鱼镇 Web版本导出工具" echo "========================================" echo # 配置变量 PROJECT_NAME="whaleTown" BUILD_DIR="build/web" GODOT_PATH="/usr/local/bin/godot" # 根据实际安装路径修改 EXPORT_PRESET="Web" # 检查Godot if [ ! -f "$GODOT_PATH" ]; then echo "[错误] 未找到Godot: $GODOT_PATH" echo "请修改脚本中的GODOT_PATH变量" exit 1 fi # 创建构建目录 echo "[信息] 创建构建目录..." mkdir -p "$BUILD_DIR" # 清理旧文件 echo "[信息] 清理旧文件..." rm -f "$BUILD_DIR"/* # 导出项目 echo "[信息] 开始导出Web版本..." "$GODOT_PATH" --headless --export-release "$EXPORT_PRESET" "$BUILD_DIR/index.html" if [ $? -ne 0 ]; then echo "[错误] 导出失败!" exit 1 fi # 生成部署信息 echo "[信息] 生成部署信息..." cat > "$BUILD_DIR/deploy_info.json" << EOF { "project": "$PROJECT_NAME", "version": "1.0.0", "build_time": "$(date)", "platform": "web" } EOF echo echo "========================================" echo " 导出完成!" echo "========================================" echo "导出位置: $BUILD_DIR/" echo echo "下一步:" echo "1. 运行 scripts/serve_web.sh 进行本地测试" echo "2. 将 $BUILD_DIR/ 目录上传到Web服务器" echo ``` --- ## 🌐 生产环境部署 ### 1. 文件上传清单 确保上传以下文件到Web服务器: ``` build/web/ ├── index.html # 主HTML文件 ├── index.js # JavaScript引导文件 ├── index.wasm # WebAssembly主文件 ├── index.pck # Godot资源包 ├── index.worker.js # Web Worker文件 ├── favicon.ico # 网站图标 └── deploy_info.json # 部署信息(可选) ``` ### 2. 目录权限设置 ```bash # Linux服务器权限设置 chmod 644 build/web/* chmod 755 build/web/ ``` ### 3. 域名配置 - 确保域名正确解析到服务器 - 配置SSL证书(推荐使用Let's Encrypt) - 设置CDN加速(可选) --- ## 🔧 服务器配置 ### Apache配置 (.htaccess) ```apache # MIME类型配置 AddType application/wasm .wasm AddType application/octet-stream .pck AddType application/javascript .js # 启用压缩 AddOutputFilterByType DEFLATE text/html text/css application/javascript application/wasm AddOutputFilterByType DEFLATE application/json application/xml # 缓存控制 ExpiresActive On ExpiresByType application/wasm "access plus 1 month" ExpiresByType application/octet-stream "access plus 1 month" ExpiresByType application/javascript "access plus 1 week" ExpiresByType text/html "access plus 1 hour" # CORS配置(如果需要) Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type, Authorization" # SharedArrayBuffer支持 Header set Cross-Origin-Embedder-Policy "require-corp" Header set Cross-Origin-Opener-Policy "same-origin" # 安全配置 Header always set X-Content-Type-Options nosniff Header always set X-Frame-Options DENY Header always set X-XSS-Protection "1; mode=block" ``` ### Nginx配置 ```nginx server { listen 80; listen 443 ssl http2; server_name yourdomain.com; # SSL配置 ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; root /var/www/whaletown/build/web; index index.html; # MIME类型 location ~* \.wasm$ { add_header Content-Type application/wasm; expires 1M; add_header Cache-Control "public, immutable"; } location ~* \.pck$ { add_header Content-Type application/octet-stream; expires 1M; add_header Cache-Control "public, immutable"; } location ~* \.js$ { add_header Content-Type application/javascript; expires 1w; } # 压缩配置 gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/html text/css application/javascript application/wasm application/json; # CORS配置 add_header Access-Control-Allow-Origin "*" always; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always; add_header Access-Control-Allow-Headers "Content-Type, Authorization" always; # SharedArrayBuffer支持 add_header Cross-Origin-Embedder-Policy "require-corp" always; add_header Cross-Origin-Opener-Policy "same-origin" always; # 安全头 add_header X-Content-Type-Options nosniff always; add_header X-Frame-Options DENY always; add_header X-XSS-Protection "1; mode=block" always; # 主页面 location / { try_files $uri $uri/ /index.html; } # API代理(如果需要) location /api/ { proxy_pass https://whaletownend.xinghangee.icu/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` --- ## ⚡ 性能优化 ### 1. 资源优化 - **纹理压缩**: 启用VRAM纹理压缩 - **音频压缩**: 使用OGG格式,调整比特率 - **模型优化**: 减少多边形数量,优化LOD ### 2. 代码优化 ```gdscript # 在Web平台禁用不必要的功能 func _ready(): if OS.has_feature("web"): # 禁用文件系统操作 # 优化渲染设置 get_viewport().render_target_update_mode = Viewport.UPDATE_WHEN_VISIBLE ``` ### 3. 加载优化 - 使用资源预加载 - 实现渐进式加载 - 显示加载进度 --- ## 🐛 常见问题解决 ### 1. SharedArrayBuffer错误 **问题**: 控制台显示SharedArrayBuffer相关错误 **解决**: 配置正确的HTTP头: ``` Cross-Origin-Embedder-Policy: require-corp Cross-Origin-Opener-Policy: same-origin ``` ### 2. 文件加载失败 **问题**: WASM或PCK文件加载失败 **解决**: - 检查MIME类型配置 - 确保文件路径正确 - 检查服务器权限 ### 3. API请求失败 **问题**: 网络请求被CORS阻止 **解决**: - 配置服务器CORS头 - 使用API代理 - 检查API服务器配置 ### 4. 性能问题 **问题**: Web版本运行缓慢 **解决**: - 启用WebGL2 - 优化资源大小 - 使用性能分析工具 ### 5. 音频问题 **问题**: 音频无法播放 **解决**: - 用户交互后才能播放音频 - 使用Web兼容的音频格式 - 检查浏览器音频策略 --- ## 📊 部署检查清单 ### 导出前检查 - [ ] Godot导出模板已安装 - [ ] Web导出预设已配置 - [ ] 项目设置已优化 - [ ] 资源文件已压缩 ### 部署前检查 - [ ] 所有文件已上传 - [ ] 服务器MIME类型已配置 - [ ] CORS设置已配置 - [ ] SSL证书已安装 ### 部署后测试 - [ ] 页面正常加载 - [ ] 游戏功能正常 - [ ] 网络请求正常 - [ ] 音频播放正常 - [ ] 移动端兼容性 --- ## 📞 技术支持 如果遇到问题,请检查: 1. 浏览器开发者工具的控制台错误 2. 网络请求是否成功 3. 服务器配置是否正确 4. Godot版本是否兼容 **更新日志**: 查看 `docs/web_deployment_changelog.md`