找回密码
 立即注册
查看: 334|回复: 6

UE4学习之路2:Puerts两种模式下调试实操

[复制链接]
发表于 2024-1-19 13:32 | 显示全部楼层 |阅读模式
简介:
调试的基本道理,再上一个文档里说明了下,然后这个主要记录本身实际去操作,创建并调试。还是上次我们创建的项目。

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。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2024-1-19 13:33 | 显示全部楼层
答主你好 我按的样子方法试了 确实能挂上调试,但断点断不住 灰色的 提示是unbound breakpoint 请问你遇见过么
发表于 2024-1-19 13:33 | 显示全部楼层
灰色无非就是你断的地方都没走,自然断不到
发表于 2024-1-19 13:34 | 显示全部楼层
不是的,是会走的,因为我是在tick里断的,代码都执行打印出信息了
发表于 2024-1-19 13:35 | 显示全部楼层
我也遇到这个问题你解决了吗
发表于 2024-1-19 13:35 | 显示全部楼层
您好,请问解决这个问题了吗?
发表于 2024-1-19 13:36 | 显示全部楼层
解决了
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-29 13:19 , Processed in 0.113873 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表