Puerts 是腾讯开源的一套游戏引擎(Unity、Unreal)下能使用 TypeScript(将简称为 Ts) 编程解决方案。该框架出自xlua作者之手,并且作者是比较推崇使用ts来进行热更操作
puerts与xlua对比- lua没有静态类型,IDE理论上不可能做到精准的代码提示和跳转,而且由于lua比较小众,IDE大厂都没有直接支持,对开发效率有一定的影响
- lua没有静态类性检查,大项目很难做重构,随着技术债的积累会越来越难维护
- lua一些拼写错误、类型错误,得在运行时才能发现,然后靠肉眼排查
- ts支持静态类型检查
- ts有着良好的生态:包括工具链,库,文档
- https://github.com/chexiongsheng/puerts_unity_demo点击链接下载puerts项目
- 由于我们编写的都是typescript代码,并将其转为JavaScript再运行,所以需要安装相关的环境,请看下一步
- 所有的ts代码都保存在TsProj中,demo是在Assets的同级目录,我们可以自行将文件夹移动到Assets中,就像这样:
目录结构大致如下:
├── Assets
│ ├── Examples #示例
│ ├── Gen #Generate后生成的warp文件
│ ├── Plugins # V8 扩展目录
│ ├── Puerts # Puerts 目录
│ └── Src #一些用于生成转换的C#代码
│ └── TsProj
│ └── Core #Ts的业务逻辑
│ └── output #Ts转为js后的输出目录,会拷贝到Resources中,最终运行的Resources中的js
│ └── Typing #Ts的桥接文件
│ └── Resources #存放转换之后生成的js代码
├── Library
├── Packages
├── ProjectSettings
搭建环境?当我们在终端输入npm run build时,会发现报如下错误,这是因为我们的电脑里还有没搭建node.js的环境。那么接下来,我们就先来下载npm吧
node.js参考安装博客
基本上按照博客提供的地址下载安装一路点击就可以了,在cmd的黑窗口看到这样的画面时,说明就是安装成功了。
TypeScript环境配置
在安装了npm之后,我们就可以通过npm来下载TypeScript的环境,如果不执行这一步,你会看到这样的报错:
所以我们打开cmd窗口,输入如下指令:
1.npm config set registry https://registry.npmmirror.com
2.npm install -g typescript
到此我们的准备工作就做完了。
如何使用? 使用npm生成js代码首先我们进入TsProj文件夹,在此处打开cmd窗口输入npm run build,会得到如下内容:
这时候我们打开Unity,依次点击菜单栏Puerts/Clear Generated Code、Puerts/Generate Code、Puerts/Generate index.d.ts生成我们需要的文件
然后再次在cmd中输入npm run build,会得到如下内容:
此时会发现Assets/Examples/05_Typescript/Resources目录下的文件已经被替换了
完整的开发流程应当如下:
- 在ExamplesCfg.cs中仿造写法添加你需要使用的C#的类,在Generated Code就可以在Ts中愉快的调用C#代码
- 依次点击菜单栏Puerts/Clear Generated Code、Puerts/Generate Code、Puerts/Generate index.d.ts生成我们需要的文件
- 在TsProj的目录下打开终端或者cmd执行npm run build,就会生成js代码到指定目录
注:建议多看例子05_Typescript中的内容,此案例中有较多ts使用方式,可以快速学习框架的一些技巧
修改ts代码和自定义TypeScript加载路径在上面的步骤中,我们发现,05_Typescript目录下还有个Resources文件夹,保存了我们需要的js代码,实际就是通过npm处理之后的ts代码。那么问题来了,如果我想修改ts的代码,该如何让它生效呢?
一、设置typescript的输出路径并且生成js代码在Tsproj目录下有两个文件:package.json和tsconfig.json,分别修改里面的内容对应成你自己项目的路径。最终运行的是package.json对应输出目录中的js代码。
package.json:
tsconfig.json:
在你的IDE终端输入npm run build(或者cmd的黑窗口)运行,会将ts代码转成js并复制到package.json中的postbuild对应的目录,你的目录就会变成这样:
二、设置自定义加载路径
当我们尝试将05_Typescript中Resources文件夹删除,并且将Assets下的Resources目录也清空,再运行时,会报这样的错误:
很明显,编辑器找不到对应了资源了,即require报错了
此时我们就可以执行上一步的操作,在终端执行npm run build,就会发现新生成的代码会保存在Assets/Resources目录下,同时运行unity,场景也正常运行。
通过代码定位,我们可以发现,require其实就是执行了Loader.cs中的逻辑,首先会判断路径是否存在,之后再读取文件开始执行代码。如图:
官方案例为使用方便,都是使用Resources进行加载的,实际上我们也可以通过AssetBundle、Addressable等方式加载代码来实现热更新。关于Addressable+puerts的使用等在后续篇章再分享,目前就先介绍puerts的使用了。
后续关于puerts的使用,大概就是这样,后续的话,会分享一下如何在JetBrains Rider中调试ts,并且自动执行npm run build指令,基本就和平常写C#一样了,可以跳转、自动保存编译等。



