下载安装
直接下载带虚拟机的版本:
注意,找Unreal开头的。

下载后把这个文件夹拷贝到项目根目录下的Plugins目录

初始化配置
进入本目录,打开命令行窗口,执行node .\enable_puerts_module.js初始化环境。会执行基础的目录操作。
主要的就是在项目根目录下出现如下两个文件。

然后在项目C++的xx.Build.cs导入"JsEnv","Puerts"这两个模块
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class HotupdateTest : ModuleRules
{
public HotupdateTest(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[]
{
"Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput",
"JsEnv","Puerts"
});
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
关闭引擎,刷新工程。
使用
使用之前,通过游戏单例,创建一个PureTS虚拟机。
GENERATED_BODY()
public:
virtual void OnStart() override;
virtual void Shutdown() override;
private:
/*
*JS虚拟机
*/
TSharedPtr<puerts::FJsEnv> GameJsEnv;
/*
*入口
*/
UPROPERTY(EditDefaultsOnly, Category = "PureTs",BlueprintReadOnly,meta=(AllowPrivateAccess="true"))
FString EnterModuleName;
/*
*调试
*/
UPROPERTY(EditDefaultsOnly, Category = "PureTs/Debug",BlueprintReadOnly,meta=(AllowPrivateAccess="true"))
bool bWithDebug=false;
UPROPERTY(EditDefaultsOnly, Category = "PureTs/Debug",BlueprintReadOnly,meta=(AllowPrivateAccess="true"))
int DebugPort=8080;
// Fill out your copyright notice in the Description page of Project Settings.
#include "Test_GameInstance.h"
void UTest_GameInstance::OnStart()
{
Super::OnStart();
if (GameJsEnv)
{
//释放旧的(基本不可能发生)
GameJsEnv.Reset();
}
if (bWithDebug)
{
//等待调试
GameJsEnv = MakeShared<puerts::FJsEnv>(
std::make_unique<puerts::DefaultJSModuleLoader>(TEXT("JavaScript")),
std::make_shared<puerts::FDefaultLogger>(),
DebugPort);
//堵塞式等待调试
GameJsEnv->WaitDebugger();
}
else
{
//直接创建虚拟机实例
GameJsEnv=MakeShared<puerts::FJsEnv>();
}
TArray<TPair<FString, UObject*>> Arguments;
Arguments.Add(TPair<FString, UObject*>(TEXT("GameInstance"), this)); // 可选步骤
GameJsEnv->Start(EnterModuleName, Arguments);
}
void UTest_GameInstance::Shutdown()
{
if (GameJsEnv!=nullptr)
{
GameJsEnv.Reset();
}
Super::Shutdown();
}
在项目根目录下的TypeScript目录,创建一个入口TS脚本
console.log("hello word")
此时,代码会被实时编译转换为js到Content\JavaScript目录下
然后把入口脚本传递给之前写的游戏单例并配置好,运行后即可看到日志输出。
调试
使用VSCode调试
在调试页新建一个launch.json文件。

添加一个Node.js:附加配置


修改端口号为你在ue里配置的调试端口。

然后短时间内启动UE(如果自己写的代码调用了JsEnv->WaitDebugger()UE侧将等待VSCode调试连接。在VSCode运行调试,即可调试TS代码。
评论