ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TypeScript + Babylon.js 环境搭建:从零到第一帧的完整指南

TypeScript + Babylon.js 环境搭建:从零到第一帧的完整指南 先说明一下我去年为了做一个产品展示项目第一次正儿八经用TypeScript也就是标题里的TS去写Babylon.js当时最头疼的不是3D逻辑而是“本机环境搭建”这一步——资料太散官方文档虽然全但没人告诉你该怎么把TS编译、开发服务器、Babylon.js依赖串成一条能舒服开发的链路。这篇文章就是把我从零到跑通第一帧画面的过程完整记录下来适合刚接触Babylon.js、或者一直在用JavaScript但想转到TS的读者也适合那些卡在“装好依赖但浏览器一片黑”的倒霉蛋。我会把每个步骤背后的原因也讲清楚这样你后面遇到新坑也能自己判断问题出在哪一层。1. 环境准备与工具选型1.1 为什么这套组合值得选Babylon.js本身是一个相当成熟的Web 3D引擎官网把它的定位说得很清楚高性能、开源、功能覆盖渲染、物理、动画、GUI、VR/AR等。但真正让我长期使用它的原因是它对TypeScript的支持非常到位。Babylon.js的核心库本身就是用TS写的发布时自带完整的类型声明文件这意味着在VS Code里写代码时场景对象、相机、灯光、材质这些API的参数提示和类型校验是原生的不需要像某些第三方库那样靠社区维护的types包续命。用TS写3D开发最大的价值不在于“多写几个类型标注”而在于把3D引擎里那些极易混淆的概念变成编译期的约束。比如Vector3和Vector4如果传错了位置JavaScript版本会运行到你执行某行代码时才报错甚至不报错只是渲染结果不对TS版本在你按回车的那一瞬间就会划红线。对于碰撞检测、骨骼动画、粒子系统这类重逻辑模块这种保护能帮你省掉大量排查时间。所以说环境搭建这一步本质上不只是在“装软件”而是在搭建一条“类型检查→自动编译→浏览器预览→实时反馈”的开发流水线。后面的内容都是围绕这条流水线展开的。1.2 本机环境的最低要求与安装检查开始之前先确认本机满足这几个条件版本号我这里给的是经过实际验证的组合不一定必须完全一致但尽量靠近Node.js 18 LTS或更高版本我当前用的是Node.js 20npm 10。VS Code或其他现代编辑器VS Code对TS原生支持最好推荐直接用它。现代浏览器优先Chrome或EdgeBabylon.js需要WebGL支持绝大多数现代浏览器都内置了。git不强制但后面从官方模板拉项目时会用到。打开命令行工具分别执行下面两条命令确认Node和npm已经可用node -v npm -v如果提示“node不是内部或外部命令”那说明安装Node.js时没有勾选把可执行文件加入PATH需要重新安装一次。这里提醒一个细节Node官网提供的是LTS长期支持版和Current当前最新版不要贪新选Current3D项目涉及本地编译和依赖较多LTS的稳定性比新功能重要得多。浏览器方面在地址栏输入chrome://gpu能看到WebGL相关的加速信息说明浏览器3D能力正常。但如果这一步显示异常也不用急着装东西大部分情况是显卡驱动或浏览器硬件加速开关的问题后面问题排查部分我会展开。1.3 版本选择的经验与坑位提示很多教程会直接让读者安装最新版依赖我建议反过来——先想清楚自己需要什么。Babylon.js的npm包有几个选择babylonjs、babylonjs/core、babylonjs/loaders等。当初我图省事直接装了babylonjs这个全量包后来发现项目包体积大、模块拆分不明显。实际更推荐拆开装babylonjs/core核心库再按需安装babylonjs/loaders模型加载、babylonjs/gui界面这些扩展包这样依赖关系清晰编译时摇树优化也更彻底。另外要注意大版本之间的差异。Babylon.js在6.x和7.x之间有一些API调整网上很多旧教程里的写法在新版本下会飘红。比如Mesh.CreateBox这类旧式静态方法在新版本里统一推荐用MeshBuilder.CreateBox。你如果看到教程里的代码和当前版本类型对不上不一定是写错了很可能只是教程基于的引擎版本不同。解决方案很简单优先看当前npm包的d.ts类型声明文件或者直接去官方文档站的“Releases / Migration”页面查迁移说明。2. 初始化项目与TypeScript配置2.1 使用npm初始化项目骨架找一个干净的文件夹起个不叫miniprogram的名字然后执行初始化命令mkdir babylon-ts-demo cd babylon-ts-demo npm init -ynpm init -y会生成一个默认的package.json这个文件是整个项目的“管家人事档案”记录了你项目叫什么、版本多少、依赖了哪些库、有哪些可执行的脚本。一会儿我们要把启动项目的命令写进它的scripts字段里。然后创建最基本的目录结构。我不会在这一步做得太复杂保持简洁才符合“从零开始”的学习路径babylon-ts-demo/ ├── index.html ├── package.json ├── src/ │ └── main.ts └── tsconfig.json其中src目录放TypeScript源码根目录的index.html作为页面入口。这种结构是Vite、Webpack等构建工具都认可的标准形式以后项目变大在src里继续拆scenes、components、assets等子目录就行。2.2 安装Babylon.js与TypeScript核心依赖执行以下两行命令npm install babylonjs/core npm install --save-dev typescript第一行安装的是核心库会进入dependencies运行时依赖因为浏览器最终运行需要它第二行安装TypeScript编译器进入devDependencies开发依赖因为我们只在开发构建阶段使用编译能力浏览器端运行的已经是编译后的JavaScript不再需要TS编译器本身。可能有人会问为什么不全局安装TypeScript我的建议是永远装在当前项目里。全局安装会导致不同项目之间版本互相污染而且很多CI环境或别的同事电脑上不会自带全局TS写进项目的devDependencies才能保证任何人拉下代码后执行npm install就能得到一致的开发环境。安装完成后再看一眼package.json如果里面出现了babylonjs/core和typescript说明依赖落地正常。注意看版本号是不是带^7.x或^6.x这样的前缀这个符号意思是“允许安装同大版本下的最新小版本”对于新项目没问题但如果后面项目上了生产环境我会倾向于锁一个精确版本号避免某天小版本更新引入行为变化。2.3 tsconfig.json的核心配置项解读tsconfig.json决定TypeScript编译器怎么工作。下面这份配置是我在实际项目中反复调出来的适合Babylon.js这种纯前端3D项目{ compilerOptions: { target: ES2020, module: ESNext, moduleResolution: bundler, strict: true, esModuleInterop: true, skipLibCheck: true, forceConsistentCasingInFileNames: true, lib: [ES2020, DOM, DOM.Iterable] }, include: [src] }每个配置项都值得说两句target: ES2020编译输出的JavaScript语法版本。Babylon.js的代码会用到async/await、class、Map这些特性ES2020完全够用浏览器兼容性也好。module: ESNext模块系统用最新的ES Module标准。这样代码里的import语句保留原生语义方便Vite这类构建工具分析和打包。moduleResolution: bundler告诉TS“我这个项目使用打包器Vite/Webpack的方式解析模块”。这个配置在早期TS版本里没有但它能正确处理包导出条件解决很多Cannot find module报错。strict: true开启所有严格类型检查。对新手来说一开始可能有点痛苦因为null、undefined、隐式any都会报错但这是TS的精华所在建议忍过适应期。esModuleInterop: true帮助兼容export 语法的老模块避免写import * as时遇到麻烦。skipLibCheck: true跳过.d.ts声明文件的内部类型检查。这个配置其实是在给构建速度和兼容性让步第三方库的声明文件偶尔有内部不一致跳过它能省很多编译报错。lib: 指定环境可用的内置库类型。前端项目必须有DOM和DOM.Iterable不然document、canvas这些类型全会报错。写到这里提醒一句网上不少教程还在用moduleResolution: node这在以前没问题但现在装的新版本TS配合现代打包器时会产生连锁报错。如果你照着老教程配置后遇到类型死活找不到先看一眼这一项是否改成了bundler。2.4 先区分几个“TS项目”的常见场景在做Babylon.js环境之前会搜到很多“TS项目”“ts文件”相关的搜索词其中有几个其实是完全不同领域的东西。最常见的误解是微信开发者工具里创建的那个“TS项目”所有工程目录都叫miniprogram里面是wxml、wxss这类小程序专属文件。那个是微信小程序的多端开发体系和浏览器端跑Babylon.js是两条完全不同的技术栈。还有一种“TS分片”和“视频抓取ts文件”的说法这里的TS指的是MPEG-TS传输流是视频编码和流媒体传输里的概念跟TypeScript一点关系都没有。如果把这两个概念搅到一起搜索出来的结果自然对不上号。归根结底咱们这篇里所有“TS”都只有一个含义——微软的TypeScript语言。遇到模糊信息时先看看上下文里有没有编译、类型、VS Code、tsconfig这些关键词有才说明说的是一条道上的事。3. 引入Vite搭建本地开发服务器3.1 为什么环境搭建这里推荐Vite以前纯用tsc加静态服务器也能跑起Babylon.js但那种方式每改一次代码就要手动重新编译刷新浏览器开发体验非常糟糕。后来Webpack解决了自动编译问题但配置麻烦。Vite的出现算是把这层体验拉满了开箱即用的TS编译、本地HTTP服务、模块热更新HMR而且启动速度极快。原理上说Vite在开发模式下并不会提前把所有代码打包压缩而是利用浏览器原生ES Module能力按需编译单个文件。代码里的import语句会被转换成一个发往本地服务器的HTTP请求服务器实时处理后返回给浏览器。所以项目规模不管小还是大启动速度都能保持秒级这种感觉用过一次就回不去了。当然Vite不是环境中唯一的选择你也可以用tsc配合live-server或者用Webpack但在2025年的时间点对新手最友好、出问题后社区资料最齐全的方案我首推Vite。3.2 配置Vite与package.json脚本安装Vite开发依赖npm install --save-dev vite在项目根目录创建vite.config.ts也可以不建Vite大多场景零配置可用但这里建一个方便后面加自定义配置import { defineConfig } from vite; export default defineConfig({ server: { port: 5173, open: true, }, build: { outDir: dist, }, });然后修改package.json里的scripts字段这是开发流程的“快捷键”{ scripts: { dev: vite, build: tsc vite build, preview: vite preview } }三个脚本的含义分别是npm run dev启动本地开发服务器浏览器自动打开页面适合日常开发。npm run build先做TypeScript类型检查tsc通过后再用Vite做生产构建生成dist目录。npm run preview本地预览构建后的dist目录模拟生产环境效果。为什么build要加一个tsc因为Vite在做生产构建时默认不执行TypeScript类型检查它只负责把代码编译成JS。如果代码里有类型错误Vite照样会打包成功这等于把类型检查这个核心防线给绕过去了。命令里加上tsc就是强行要求类型检查通过才能构建。3.3 创建HTML入口与页面基础样式在根目录创建index.html内容如下!DOCTYPE html html langzh-CN head meta charsetUTF-8 / meta nameviewport contentwidthdevice-width, initial-scale1.0 / titleBabylon.js TypeScript 环境搭建/title style html, body { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; } #renderCanvas { width: 100%; height: 100%; display: block; } /style /head body canvas idrenderCanvas/canvas script typemodule src/src/main.ts/script /body /html这里有几个关键点。script typemodule src/src/main.ts是Vite识别项目入口的约定。浏览器原生不认识.ts文件但Vite的dev server会拦截这个请求把TS实时编译成JS再返回所以即使在开发模式你也可以直接在HTML里写TS入口地址。#renderCanvas的样式必须显式设置width: 100%; height: 100%。这是Babylon.js最容易踩的坑之一如果canvas没有明确高度它的高度会是0像素引擎创建出来后画布尺寸为0等于白忙一场。后面的黑屏排查章节我会再回到这点。overflow: hidden也是故意的避免页面出现滚动条3D应用一般不需要滚动交互。3.4 启动项目验证工具链先写一个最小的src/main.ts哪怕就只有一行只要能验证链路通了就好console.log(TypeScript Vite running!);然后在命令行执行npm run dev看到Vite输出本地地址后打开浏览器控制台如果打印出了TypeScript Vite running!说明本机环境已经完成80%了。这时候建议顺手修改main.ts里的字符串看看浏览器是否自动刷新、控制台是否输出新内容。HMR生效说明开发服务器和TS编译链路完全正常下一步就可以放心写3D场景了。4. 用TypeScript编写第一个3D场景4.1 创建引擎与场景对象现在开始正式写3D代码这也是整个环境搭建唯一能看到实实在在成果的一步。把src/main.ts改成以下内容import { Engine, Scene, ArcRotateCamera, Vector3, HemisphericLight, MeshBuilder, } from babylonjs/core; const canvas document.getElementById(renderCanvas) as HTMLCanvasElement; const engine new Engine(canvas, true); const scene new Scene(engine); const camera new ArcRotateCamera( camera, -Math.PI / 2, Math.PI / 2.5, 8, new Vector3(0, 1, 0), scene ); camera.attachControl(canvas, true); const light new HemisphericLight(light, new Vector3(0, 1, 0), scene); light.intensity 0.8; const box MeshBuilder.CreateBox(box, { size: 1 }, scene); box.position.y 1; const ground MeshBuilder.CreateGround( ground, { width: 10, height: 10 }, scene ); engine.runRenderLoop(() { box.rotation.y 0.01; }); window.addEventListener(resize, () { engine.resize(); });先解释前几行。document.getElementById返回的是HTMLElement | null严格模式下直接用as HTMLCanvasElement告诉TS我知道这个元素是canvas后面调用canvas相关API就不会报类型错误。如果你不确定元素是否存在更稳妥的写法是加一个判空const canvas document.getElementById(renderCanvas) as HTMLCanvasElement; if (!canvas) { throw new Error(找不到canvas元素); }严格模式在这里不是找麻烦而是在教你养成防御性编程的习惯。Engine是Babylon.js的顶楼管家它负责与WebGL上下文交互、管理渲染循环。第二个参数true表示开启的抗锯齿。Scene是3D世界的容器所有物体、灯光、相机都必须挂载在场景下面。把scene传给每个对象的构造函数就是向引擎声明“这个物体属于哪个世界”。4.2 相机、灯光与网格对象的配合ArcRotateCamera是Babylon.js最常用的轨道相机它围绕一个目标点旋转适合展示和观察3D物体。构造函数里这行代码包含的信息很多new ArcRotateCamera(camera, -Math.PI / 2, Math.PI / 2.5, 8, new Vector3(0, 1, 0), scene)四个主要参数依次是绕Y轴的方位角alpha、绕X轴的俯仰角beta、与目标的距离radius、目标点位置target。-Math.PI / 2和Math.PI / 2.5这两个值是我随手选的实际开发时你可以用鼠标拖拽视角不用每次手改代码。关键在于最后一行camera.attachControl(canvas, true)它让鼠标事件跟相机绑定没有这行页面里的3D场景就是一张不会动的截图鼠标拖拽毫无反应。第二个参数true表示忽略阻止默认事件这个值保持默认就行。灯光方面HemisphericLight模拟的是天空从上往下的漫反射光参数是一个方向向量。对于基础展示它比DirectionalLight平行光或PointLight点光源更柔和不会让物体背光面黑成一片。设置light.intensity 0.8是为了稍微压低亮度避免过曝。3D场景没有灯光时物体是黑色的新手很容易忽略这一点常见表现是“我创建了box为什么什么都看不到”——很可能就是缺了一个灯。网格创建这块MeshBuilder.CreateBox(box, { size: 1 }, scene)的意思很直白创建名为box、边长1的立方体归入scene。CreateGround创建地面。box.position.y 1则让盒子浮在地面上方1个单位。注意这里没有设置相机视角方向上的特意调整轨道相机默认从斜上方看能同时看到盒子和地面视觉上最直观。4.3 渲染循环与场景动态效果engine.runRenderLoop(() { ... })是Babylon.js实时渲染的核心。引擎会以每秒60次左右取决于显示设备刷新率的频率去执行传入的回调函数。每一次执行都代表一帧渲染。把box.rotation.y 0.01放到回调里每帧累加0.01弧度最终效果就是立方体在持续转动。理解渲染循环对后面优化很重要比如需要每帧更新角色位置、动画状态、物理模拟结果都应该放在这个回调里。但如果某段逻辑不需要每帧执行比如获取一次用户输入就要注意别写进循环否则会白白消耗性能。最后那段window.addEventListener(resize, () { engine.resize(); })也必不可少。浏览器的窗口大小变化后canvas元素尺寸会变但WebGL后缓冲区尺寸不会自动跟随导致画面拉伸或裁剪。调用engine.resize()能让引擎重新读取canvas的实际尺寸并适配。4.4 常见黑屏问题的快速定位跑完上述代码如果页面全黑不要慌按下面顺序逐个排查控制台有没有报错如果Cannot read properties of undefined这类错误优先检查import路径和canvas获取是否为空。canvas尺寸是否为0在devtools Elements面板选中#renderCanvas看Computed样式里的宽高是不是有实际数值。凡是body/html没设置100%高度直接设置canvas高度100%的或者忘了给canvas设置宽高样式的都会黑屏。attachControl是否写漏相机没绑定鼠标控制画面虽然可能是静态的但如果相机视角刚好对准空的地方同样看起来像黑屏。把box.position.y 1那行临时注释掉看看是不是物体额外地被移出了视野。虽然y1不太可能出视野但涉及具体场景时可以调大radius来排查。如果以上都正常还可以在渲染循环里加一句console.log(box.rotation.y)看数值是否在变化以此确定渲染循环到底有没有跑起来。这一套排查方式在后面加入模型、材质、动画时同样适用核心思路就是确认“引擎活着、场景有内容、相机对准了”这三件事。5. 安装与编译报错排查实录5.1 依赖安装时的ERESOLVE冲突新项目虽然很少出现依赖冲突但如果你先安装了其他包再安装Babylon.js相关依赖时可能遇到npm error! ERESOLVE could not resolve这表示npm在依赖树里发现了peer dependency冲突。常见对策有两个一是调整安装的包版本让版本号互相兼容二是临时用npm install --legacy-peer-deps跳过peer依赖自动解析。后者是很多人推荐的“万能解药”但我建议优先排查版本不要一遇到冲突就跳过校验。legacy模式本质上是在“无视规则”可能隐藏后续运行时的兼容性问题。还有一个经验如果之前装过babylonjs全量包后来又同时装babylonjs/core两者版本不一致可能导致类型冲突或重复定义。要么全量包用到老要么全部拆成模块化包别混着来。5.2 Cannot find module与moduleResolution问题Cannot find module babylonjs/core这种报错几乎每个TS使用者都见过原因分成三类依赖没装成功。检查node_modules/babylonjs/core目录是否存在如果不存在就重新npm install。moduleResolution配置不对。如果tsconfig里还是老旧的node解析策略部分现代ES包的结构它解析不了改成bundler或node16通常能解决。编辑器没重启。VS Code的TS语言服务偶尔不会立刻感知node_modules变化执行TypeScript: Restart TS Server命令刷新一下语言服务往往立刻就不红叉了。如果依然报错可以看看node_modules/babylonjs/core/package.json里的exports字段结构判断具体的导出路径。Babylon.js 6.x之后基本都采用标准ESM导出路径写babylonjs/core和babylonjs/core/Physics这样的子路径都行具体以官方文档为准。5.3 类型报错时的排查思路TS类型报错是环境搭建过程中最“话多”的环节但绝大多数错误是代码写法不匹配类型定义。比如直接写const box MeshBuilder.CreateBox(...)然后尝试把字符串赋给box.rotationTS就会零容忍地报错。处理类型错误我的思路是右键点出错的标识符选择“转到类型定义”直接看这个API的d.ts源码。比如想看CreateBox支持哪些参数跳到声明文件里就能看到重载列表比查任何文档都准确。Babylon.js的类型提示做得相当好很多内部类型都是联合类型或泛型约束比如AbstractMesh是所有网格对象的基类写函数参数时可以声明为AbstractMesh来接收各种网格。另外import type这种只导入类型不导入运行时代码的语法在处理大型3D项目时能帮你减少模块打包体积。比如你只需要某个类型而不需要实际使用它就用import type { Mesh } from babylonjs/core。5.4 浏览器控制台常见错误速查表做一个常见的浏览器端报错速查表实际开发时可以直接对照排查报错信息可能原因解决方案WebGL is not supported浏览器硬件加速关闭或显卡驱动不支持浏览器设置里开启硬件加速更新显卡驱动尝试在另一台设备确认canvas is nullgetElementById没找到canvas或脚本在DOM渲染前执行确认id拼写一致把script标签放到body底部或使用DOMContentLoadedCannot read properties of undefined (reading rotation)网格对象未被正确创建先打印对象确认是否为空检查MeshBuilder调用是否传入有效参数Module not found: Error: Cant resolve ...import路径写错或包未安装检查路径大小写与包名执行npm install刷新页面后画面消失开发服务器HMR状态异常手动刷新或重启npm run dev这里还要提示一个容易忽略的规范性细节Windows文件系统不区分大小写但Linux和服务器环境区分。如果你在Windows上开发正常部署到Linux环境后出现找不到模块先怀疑import路径大小写是否一致。5.5 搜索资料时的关键词避雷在做Babylon.js和TS的过程中搜索相关报错时容易踩到词义陷阱。“TS项目”在小程序领域指微信开发者工具里的TypeScript工程项目名称通常就是miniprogram“ts文件”在流媒体领域指MPEG-TS视频分片“sop/stp/smp”等缩写又分别属于工艺规范、数据交换协议等领域。搜资料时如果带上了这些歧义词出来的内容很容易让你误入歧途。正确姿势是带上更具体的上下文词“Babylon.js TS”“Babylon.js Vite”“TypeScript WebGL throw error”之类的组合。如果你用中文搜索尽量把报错信息的英文原句作为检索词命中率会高很多。6. 开发工作流与下一步扩展6.1 日常开发节奏与调试技巧环境搭好之后日常开发节奏其实很固定改TS代码保存浏览器自动刷新查看效果。Vite的HMR在3D场景里表现不错改材质参数、换贴图、调整相机参数页面都会即时响应不需要手动刷新。但有些底层改动比如改tsconfig配置、新增依赖包还是建议重启一下dev server否则可能拿到缓存旧配置。调试方面有一个必须推荐的功能Babylon.js内置的调试层Inspector。在代码里加入scene.debugLayer.show();浏览器就会弹出类似3D引擎编辑器的调试面板可以实时查看场景树、修改网格属性、预览材质、调整灯光强度、查看性能统计帧率、绘制调用、渲染耗时。环境搭建完成后第一步建议先打开它你会对“场景树里能看到哪些对象”有一个直观的全局认知比纯粹对着代码理解3D场景高效得多。不过要注意Inspector调试面板是一个独立的扩展功能正式构建上传前记得把这一行注释掉。6.2 从简单Box迈向完整场景的扩展路径第一帧画面跑通后项目雏形就有了接下来扩展空间很大。按我看下来最实用的一条路径是先掌握导入外部模型再接触物理引擎最后熟悉场景管理。3D模型导入需要安装babylonjs/loaders然后通过SceneLoader.ImportMeshAsync加载.gltf、.glb、.obj这些格式的模型文件。这一步能让你把网络上下载的产品模型、建筑模型快速丢进自己的场景里。物理引擎则推荐babylonjs/physics配合babylonjs/havok给物体加碰撞、重力、弹跳效果。再往后就是场景管理、相机控制、动画状态机这些更复杂的系统了。建议每扩展一个能力就在一个小项目里验证不要一上来就堆叠所有功能。我在刚开始的时候试图一次性搞定模型物理UI动画结果遇到问题时根本分不清是模型格式问题还是物理引擎配置问题反而拖慢进度。6.3 一些关于TS工具链的个人习惯最后分享几个我在实际使用中沉淀下来的小习惯。第一个是写完代码后顺手跑一遍npm run build。build里集成了tsc类型检查它能帮你发现dev server下不会暴露的隐性类型问题。比如strict模式下可能存在的空值问题、某个变量被隐式推断成any等这些在开发时通常不会崩页面但迟早会在某个角落给你埋雷。第二个是善用VS Code的“保存时自动格式化”。在.vscode/settings.json里配置editor.formatOnSave: true并安装Prettier插件。代码风格统一后diff对比会清爽很多排查问题时也更舒服。TypeScript的缩进、引号、分号这些细节如果不靠工具统一纯手工维护会很痛苦。第三个是养成写小段的习惯。甚至可以单独建一个sandbox.ts文件专门做实验在HTML入口临时改成加载它验证完思路后再把代码合并到正式文件里。Babylon.js的场景对象创建代码经常需要反复调参数直接在正式入口里涂改会导致无关代码被碰一改我不止一次因为这种操作把原本正常的场景搞坏最后还要花时间还原。说到底环境搭建只是这条路的开端本机跑通第一帧后后面的路再难也有底了。至少你知道了“编译链是通的渲染环是活的类型检查在帮你看门”剩下的问题就都是能被拆解的问题了。
返回列表