Tencent / puerts

PUER(普洱) Typescript. Let's write your game in UE or Unity with TypeScript.
Other
5.04k stars 702 forks source link

[UE] Puerts in CI #879

Closed AvatarGanymede closed 1 year ago

AvatarGanymede commented 2 years ago

detail | 详细描述

如何将Puerts生成代码的过程放在自动构建流水线中? 可以在UE非运行时执行插件功能吗? 如果一定要在UE运行时执行插件功能,如何判断什么时候插件功能执行完毕?

chexiongsheng commented 2 years ago

生成代码指的是ue.d.ts?

AvatarGanymede commented 2 years ago

生成代码指的是ue.d.ts?

是的

chexiongsheng commented 1 year ago

我知道的一个项目是用Commandlet来实现的。

zhaojunmeng commented 1 year ago

分享一个项目中用命令行生成.d.ts的方式

UE4Editor-Cmd.exe "%CurrentPath%\xx.uproject" -UTF8Output -nullrhi -nopause -nosplash -unattended -stdout -ExecCmds="Puerts.Gen"

这里没有使用Commandlet而是使用的ExecCmds,ExecCmds和Commandlet是有区别的,区别是Commandlet时,一些插件是不会加载的(这会导致有些需要导出的插件类型的声明在Commandlet模式下,就丢失了),而ExecCmds就和正常启动编辑器一样,加载的插件数量什么的都是一致的

llxisdsh commented 1 year ago

分享另一个方法:

如果ExecCmds生成蓝图不全, 用下面:

UnrealEditor-Cmd.exe xx.uproject -TestExit="Fixed up redirectors for" -TestExitExecCmds="Puerts.Gen" -nullrhi -log -nosplash -nosound -nopauseonsuccess -nocontentbrowser

思路就是-TestExit检测到某个log(编辑器收集完bp), 然后退出, -TestExitExecCmds指令同时捕获到退出信号, 去执行某个命令"Puerts.Gen"

-TestExitExecCmds 指令实现需要加点代码到: Puerts\Source\DeclarationGenerator\Private\DeclarationGenerator.cpp:


public:
void StartupModule() override
{
    // TODO: fix begin, 在执行TestExit时, 可以触发Puerts.Gen生成d.ts
    FCoreDelegates::ApplicationWillTerminateDelegate.AddLambda([&]()
    {
        FString Cmds;
        if (FParse::Value(FCommandLine::Get(), TEXT("TestExitExecCmds="), Cmds))
        {
            ParseExecCommands::QueueDeferredCommands(
                ParseExecCommands::ParseExecCmdsFromCommandLine(TEXT("TestExitExecCmds"))
            );
            GEngine->TickDeferredCommands();
        }
    });
    // TODO: fix end
AvatarGanymede commented 1 year ago

分享另一个方法:

如果ExecCmds生成蓝图不全, 用下面:

UnrealEditor-Cmd.exe xx.uproject -TestExit="Fixed up redirectors for" -TestExitExecCmds="Puerts.Gen" -nullrhi -log -nosplash -nosound -nopauseonsuccess -nocontentbrowser

思路就是-TestExit检测到某个log(编辑器收集完bp), 然后退出, -TestExitExecCmds指令同时捕获到退出信号, 去执行某个命令"Puerts.Gen"

-TestExitExecCmds 指令实现需要加点代码到: Puerts\Source\DeclarationGenerator\Private\DeclarationGenerator.cpp:

public:
void StartupModule() override
{
    // TODO: fix begin, 在执行TestExit时, 可以触发Puerts.Gen生成d.ts
    FCoreDelegates::ApplicationWillTerminateDelegate.AddLambda([&]()
    {
        FString Cmds;
        if (FParse::Value(FCommandLine::Get(), TEXT("TestExitExecCmds="), Cmds))
        {
            ParseExecCommands::QueueDeferredCommands(
                ParseExecCommands::ParseExecCmdsFromCommandLine(TEXT("TestExitExecCmds"))
            );
            GEngine->TickDeferredCommands();
        }
    });
    // TODO: fix end

感谢回复!我就是这么做的