如何在Unity中运行包含npm包的TypeScript代码?
如何在Unity中运行包含npm包的TypeScript文件?
当然有可行的实现方式,下面分两种主流场景给出具体方案,并针对你的tsconfig给出适配调整建议:
一、桌面/移动端Unity项目(非WebGL)
这类场景下Unity本身没有原生Node.js环境,需要把TypeScript和npm包打包成Unity可识别的独立JS文件,再通过.NET的JS解释器执行:
打包TS与npm依赖
- 使用Webpack或Rollup等打包工具,将你的TS代码和依赖的npm包合并为单个UMD或IIFE格式的JS文件(避免ES模块语法,确保JS解释器能直接执行)。
- 配置打包工具时,排除Node.js内置模块(如
fs、path)——如果npm包依赖这些,需要替换为兼容Unity环境的实现,或者选择无Node依赖的包。
在Unity中集成JS解释器
- 使用
Jint(轻量级.NET JS解释器)或V8.NET(基于Chrome V8引擎)这类第三方库,将打包后的JS文件导入Unity项目。 - 通过C#代码加载并执行JS文件,实现Unity与JS的双向调用(比如调用TS导出的函数,或者让TS调用Unity的C#方法)。
- 使用
二、Unity WebGL项目
WebGL环境本身基于浏览器JS引擎,适配起来更简单:
- 编译TS为浏览器兼容的JS
- 直接用tsc编译你的TS代码,配合npm包(可以用npm安装后直接导入)。
- 在WebGL的HTML模板中引入编译后的JS文件,通过Unity提供的
SendMessage、UnityInstance等API实现TS与Unity的交互。
三、针对你的tsconfig.json的适配调整
你当前的配置更偏向前端Web环境,需要根据Unity场景调整:
1. 桌面/移动端场景调整
{ "compilerOptions": { "target": "es2015", // 降级目标版本,确保JS解释器兼容 "module": "umd", // 输出UMD格式,适配非模块环境 "lib": ["esnext"], // 移除dom库,避免浏览器环境依赖 "outDir": "./build", "rootDir": ".", "strict": true, "strictPropertyInitialization": false, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "esModuleInterop": true, "moduleResolution": "node", "experimentalDecorators": true, "emitDecoratorMetadata": true, "allowJs": true, "declaration": true, "sourceMap": true, "noFallthroughCasesInSwitch": true, "allowSyntheticDefaultImports": true }, "include": ["./src"] }
2. WebGL场景调整
可以保留大部分原配置,但建议把module改为es2020或esnext,确保浏览器支持,同时确认lib中的dom符合WebGL的浏览器环境需求。
关键注意事项
- 避免使用依赖Node.js核心模块或操作系统API的npm包,这类包无法在Unity环境中运行。
- 如果需要Unity与TS/JS交互,要严格遵循Unity的JS交互规范(比如C#方法需标记为
[MonoPInvokeCallback]或在WebGL中使用SendMessage)。 - 测试时先打包最小化的TS代码+单个npm包,验证可行后再扩展复杂依赖。
内容的提问来源于stack exchange,提问作者kadircan
相关产品推荐
相关产品推荐

