腾讯开源插件Puerts,用Typescript编写Unity3D脚本

puerts是游戏引擎下的TypeScript编程解决方案

  • 提供了一个JavaScript运行时
  • 提供通过TypeScript访问宿主引擎的能力(JavaScript层面的绑定以及TypeScript声明生成)

Puerts

最近在学U3D,偶然发现腾讯开源了个插件,支持用TS写U3D脚本,666。 于是看了下github说明,想看看怎么用,结果发现好像没什么指引教程。

官方给了Demopuerts_unity_demo,可以直接用官方的Demo来初始化项目;如果是从unity hub 直接创建的化,官方文档好像没有这部分的指引;于是我结合了Unity TypeScript 脚本解决方案 Puerts 实例解析快速上手这UP主的视频,终于是跑成功了。 接下来就记录一下吧~

第一步:Puerts/releases

下载发行版的puerts unity版 PuerTS_V8

image.png 然后解压

image.png

第二步:创建一个Unity工程

image.png 将刚才解压的Puerts文件夹拉到工程的Assets目录下

image.png PS: 有报warning不用管,完成后面的操作,就不会报了。

第三步:生成TS声明文件

生成TS声明文件,需要配置Puerts,如果没有配置,生成出来的TS声明文件基本上没有类型提示的。 官方已经提供了一份比较全的Puerts配置文件

首先,将官方提供的PuertsConfig.cs文件下载下来;

然后,在工程的Assets目录下创建Editor文件夹,将下载的PuertsConfig.cs文件复制到Editor目录下。

再然后,点击Unity工具栏的PuerTS选项,选择Generate Code

image.png

等待生成完成,Console的warning就会消失,工程的Assets目录下会生成Gen文件夹,里面存放了UnityC#桥接到TS的各种类/方法/类型声明。

第四步:创建TS工程

在Assets目录下创建TsProject(名字可以任取);进入TsProject,在命令行中执行npm init -y先初始化初始化package.json(要安装node.js,前端开发应该不陌生);

然后再执行npm i typescript -D,安装TS依赖

TsProject目录下创建tsconfig.json文件

{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "sourceMap": true,
    "noImplicitAny": true,
    "typeRoots": [
      "../Puerts/Typing",
      "../Gen/Typing",
      "./node_modules/@types"
    ],
    "outDir": "output"
  }
}
复制代码

再然后:下载官方Demo的copyJsFile.jsTsProject目录下。

package.json文件夹中,编写执行脚本命令

{
    "scripts": {
        "build": "tsc -p tsconfig.json",
        "postbuild": "node copyJsFile.js output ../Resources"
    }
}
复制代码

第五步: 编写TS脚本和CS中加载TS文件

TsProject目录下创建一个TS文件

// Player.ts
import {UnityEngine, System} from "csharp";
UnityEngine.Debug.Log("hello world ts");
复制代码

然后在Assets目录下创建一个Resources文件夹,用于存放CS加载的TS文本文件。

然后在TsProject路径下执行 npm run build

image.png

编译完成之后,Resources目录下会出现对应的文本文件 image.png

再然后,在Assets目录下创建一个CS脚本文件,我这里是将CS放在了Scripts目录下:

image.png 在CS中引入Puerts库, 声明jsEnv变量,实例化一个JsEnv,并引入生成的Player.js.txt,Eval会执行该txt的代码。 image.png

然后在Unity将CS拖到对应的Object上, playgame,

image.png

这样就可以愉快地在Unity使用TS啦~

PS: 目前发现个小问题,在TS中,获取游戏物体的component,当我获取物体的刚体组件,返回的值类型是Component而非Rigidbody,这会导致返回的值无法调用Rigidbody的属性/方法。只需要对返回的值指定Rigidbody类型即可。(不知道是我不会用,还是确实是index.d.ts定义缺失)

image.png

菜鸟,请多指教,如有不对,请在评论区指出,谢谢~

猜你喜欢

转载自juejin.im/post/7131753546994679844
今日推荐