three@v0.113.0:65 Uncaught (in promise) Error: Can not resolve #include <utils>; Unity-Webgl
可能你不会那么极端在Unity嵌套Three.js再嵌套一个游戏引擎但是只要你用Threejs 特别像我一样的新手你可能会遇到下面这个问题表面上是renderer.render()方法的问题实际是shader的问题Javascript - Threejs - 3d框架threev0.113.0:65 Uncaught (in promise) Error: Can not resolve #include utils首先可以try catch , 稍微定位是不是shader的问题和打印堆栈this.loaded Promise.all(shadersPromises) .then(([vs,fs]){ // new material... }) .catch(err{ console.error(Water材质编译失败, err); throw err; //继续抛出方便调试 })Uncaught (in promise) Error: Can not resolve #include utils报错来自Three.js RawShaderMaterial / ShaderMaterial 的#include预处理不是 renderer.render 这一行本身报错。 只是你的this.loadedPromise 内部编译 Shader 失败抛出错误Promise 的异常没有被 catch之后执行到 render 时错误冒泡控制台显示栈指向 render 调用处真正根源GLSL 着色器的#include utils找不到文件片段。根本原因#include utils是 Three.jsShaderChunk 片段包含语法。RawShaderMaterial❗不会自动内置 ShaderChunk。ShaderMaterial才会自动解析#include xxx自动加载内置 chunk。你用的是THREE.RawShaderMaterialRawShaderMaterial 完全原始 GLSL没有预处理、没有内置 #include 片段写#include utils直接报无法解析。this.material new THREE.RawShaderMaterial({ vertexShader: vs, fragmentShader: fs, // RawShaderMaterial 不处理 #include utils })方案 1改用ShaderMaterial最简单推荐ShaderMaterial支持#include utils会自动解析 Three 内置的 shader chunk。⚠️虽然如此ShaderMaterial 会自动加 attribute、uniform 前缀你的 shader 语法要适配不能完全照搬 Raw 的原始 GLSL。this.material new THREE.ShaderMaterial({ vertexShader: vertexShaderSource, fragmentShader: fragmentShaderSource, uniforms: { light:{value:this.light}, tiles:{value:this.tiles}, sky:{value:this.textureCube}, water:{value:null}, causticTex:{value:null}, underwater:{value:false} } })方案 2继续使用 RawShaderMaterialRaw 模式不支持#include两个选择删掉 shader 里面全部#include utils把需要的代码手动复制粘贴进顶点 / 片元着色器源码手动自己实现 #include 预处理器加载utilschunk 文本做字符串替换麻烦不推荐。90% 该报错都是误用 RawShaderMaterial 却写了#include xxx。为什么报错栈指向renderer.render(this.mesh, cam)完整链路loadFile加载 glsl 文本完成 → Promise.all resolvenew RawShaderMaterial(vs,fs) →内部 WebGL 编译 shader遇到#include utils抛出异常这个错误发生在this.loaded.then()内部变成 Promise reject代码没有写.catch()成为unhandled promise rejectionJS 事件循环不会立刻抛出等到下一帧你执行renderer.render(...)的时候这个未处理 Promise 错误才打印到控制台。❗假象看起来是 render 这一行报错实际 shader 在更早异步阶段就编译失败。mesh、material 对象虽然创建出来但是 GPU 着色器编译失败。最后勉强算是搞出来了js 包了3~4层调用算了不搞了UnityWebGL:::错误1wasm63 or 32Building Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js failed with output:wasm-ld: error: Assets/Ocean/Plugins/WebGL/ocean.bc: machine type must be wasm32 or wasm64emcc2: error: F:/Program Files (x86)/2021.3.45f2c1/Editor/Data/PlaybackEngines/WebGLSupport/BuildTools/Emscripten/llvm\wasm-ld.exe C:\Users\Admin\AppData\Local\Temp\emscripten_1jrpmur_.rsp.utf-8 failed (1)UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool)首先要拆解原因核心原因.bc 文件的编译目标架构不是 wasm32/wasm64而是其他比如 x86、arm 等Unity 在处理 WASM 相关编译时识别不到合法的机器类型。常见场景WebGL 构建、使用第三方 WASM 插件、自定义 LLVM 编译的 bc 文件导入 Unity。步骤 1安装 LLVM 工具链必备LLVM 是处理 Bitcode/WASM 的核心工具需安装兼容 WASM 的版本建议 LLVM 10Windows从 LLVM 官网 下载安装包勾选「Add to PATH」macOS/Linux通过包管理器安装# macOSHomebrew brew install llvm # LinuxUbuntu/Debian sudo apt install llvm lld验证安装终端执行llc --version能看到输出且包含WebAssembly说明支持 WASM。错误2Can not load framework.js.zip错误3Fallback (Game Settings)参考图
