|
简介:
调试的基本道理,再上一个文档里说明了下,然后这个主要记录本身实际去操作,创建并调试。还是上次我们创建的项目。
1.调试自动绑定模式下
自动绑定模式,要求写代码必需按照固定格式,比如上次我们创建的TS_Player类
import * as UE from 'ue'
class TS_Player extends UE.Character {
ReceiveBeginPlay(): void {
console.log(”----------------------------hello,world”);
}
}
export default TS_Player 类的名字必需是文件的名字,且格式必需如此。
下面我们基于这个代码调试:
a.首先去设置下UE4的PuertsSetting的调试模式:
在项目设置->插件->puerts Settings ,勾上几个设置,端口要和VsCode的设置成一样。Wart Debugger 是指 UE4等待VsCode的开始命令,可以调试启动的一些代码。我们代码直接是初始化构建的,所以把WartDebugger也勾上。
b.去VsCode里去设置:
然后点击在弹出的里边随便选择一个,选完之后,就有下拉框了,然后选择增加配置:
在可选中,选择Node.js:Attach:
端口配成8080,之前设置的:并把之前随机选择的删除掉:
好了,让我们来调试吧,加一个断电,然后UE4点击开始按钮,会卡主等待VsCode的网络连接,然后点击VsCode的三角按钮,
好了,我的成功断点到,并能打印了!
2. 在启动虚拟机的模式下调试
这种模式,首先需要我们在C++的工程中,增加C++调用脚本的代码。
首先,让我们来添加两个文件到工程内,用于启动脚本的文件:
然后写代码到文件中:这里请注意下,两个文件必然要在根目录的Source/XXX的目录下,XXX是本身项目名。
//.h文件
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include ”JsEnv.h”
#include ”CoreMinimal.h”
#include ”Engine/GameInstance.h”
#include ”TsGameInstance.generated.h”
/**
*
*/
UCLASS()
class INSTALLPUERTS_API UTsGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
virtual void Init() override;
virtual void OnStart() override;
virtual void Shutdown() override;
private:
TSharedPtr<puerts::FJsEnv> GameScript;
};
// .cpp文件
// Fill out your copyright notice in the Description page of Project Settings.
#include ”TsGameInstance.h”
void UTsGameInstance::Init()
{
}
void UTsGameInstance::OnStart()
{
GameScript = MakeShared<puerts::FJsEnv>();
//GameScript = MakeShared<puerts::FJsEnv>(std::make_unique<puerts::DefaultJSModuleLoader>(TEXT(”JavaScript”)), std::make_shared<puerts::FDefaultLogger>(), 8080);
//GameScript->WaitDebugger();
TArray<TPair<FString, UObject*>> Arguments;
Arguments.Add(TPair<FString, UObject*>(TEXT(”GameInstance”), this));
GameScript->Start(”QuickStart”, Arguments);
}
void UTsGameInstance::Shutdown()
{
GameScript.Reset();
} 增加代码的时候,必然要注意声明类的时候:INSTALLPUERTS_API,前边的拼写必然是项目工程的拼写转成大写,否则拼写错误会造成编译不外。
除此之外,需要在文件InstallPuerts.Build.cs的文件中插手:
PublicDependencyModuleNames.AddRange(new string[] { ”Core”, ”CoreUObject”, ”Engine”, ”InputCore”, ”JsEnv”, ”Puerts” });
bEnableUndefinedIdentifierWarnings = false;
然后进行编译,在ue4中点击ue.d.ts,生成脚本,然后点击ue4的编译,在项目设置中搜索GameInstance设置,下拉选择我们创建的新类,TsGameInstance。
在VsCode中创建脚本文件:QuickStart.ts,然后输入打印:console.log():
在UE4中运行,发现可以打印出日志,就暗示自启动引擎模式,两者是互通的了。
然后我们去调试:这个调试要改削C++代码:
把默认的: GameScript = MakeShared<puerts::FJsEnv>(); 注释掉
放开:
GameScript = MakeShared<puerts::FJsEnv>(std::make_unique<puerts::DefaultJSModuleLoader>(TEXT(”JavaScript”)), std::make_shared<puerts::FDefaultLogger>(), 8080);
GameScript->WaitDebugger();
暗示等待Vscode初始启动模式,然后编译尝尝:
还是用我们第一个模式配置好的Attach,然后点击UE4运行,然后点击VsCode调试,发现断到了。
两种模式同时存在
在日常的开发中,其实两种模式是可以同时存在的,常常会用到两种模式同时调试的情况,其实也是可以措置的。
首先,说下道理,两种模式是相当于开了两个虚拟机,需要设置两个单独的端口用于分袂链接。所以自动绑定模式下(方式1)写的类,我们需要去UE4中设置端口为8081(什么端口本身看着设置都行),启动虚拟机模式(方式2)我们不改削,还是默认的8080端口,从头编译:
同时,我们还要去VSCode里边新增一个8081的链接调试设置,还是点击
下拉框中,选择Add Configuration,选择Node.js:Attach
然后我们去改削下名字,并把端口改成8081:文件是这样子的:
好了,我们开始测验考试调试下吧:
我们先去Ue4中点击运行:点击VsCode的Attach8081的开始调试按钮,再下拉选择Attach8080的开始调试按钮,同时开启两个调试,这里强调下:要先启动自动绑定端口的调试按钮,再启动自启动虚拟机的调试按钮,才能顺利链接。
然后,两个断点都进入了!
额外补充:其实使用WaitDebug这个模式,很容易Ue4卡主的,卡主就要结束进程从头打开项目,可能端口冲突,配置错误等等情况,不到万不得已尽量不要用勾选这个,我们平时开发功能一般都是按照事件响应的,只要在中间环节断点就行了,所以也不用勾选这个。
有些实在是启动的时候需要措置的,可以打印日志方式,万不得以在采用WaitDebug。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|