下载安装

直接下载带虚拟机的版本:

https://github.com/Tencent/puerts/releases

注意,找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代码。