注意,需要有源代码版本的 Unreal Engine,而不是从游戏 Launcher 中下载的 Unreal 版本。
本文使用是 Unreal Engine 5.1 版本。关于一些基础 API 介绍,可以参考之前的一篇。
可以将 Engine\Source\Programs\BlankProgram
作为模板拷贝一份,然后重新命名(可以使用文本编辑器进行全局替换之类的),这里命名成 CircleLiveLinkProvider
,作为 Program 的起点。
使用 GenerateProjectFiles
刷新项目,这样新的 Program 就会出现在 UE 的工程中。
// CircleLiveLinkProvider.cpp
#include "CircleLiveLinkProvider.h"
#include "RequiredProgramMainCPPInclude.h"
DEFINE_LOG_CATEGORY_STATIC(LogCircleLiveLinkProvider, Log, All);
IMPLEMENT_APPLICATION(CircleLiveLinkProvider, "CircleLiveLinkProvider");
INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
{
GEngineLoop.PreInit(ArgC, ArgV);
UE_LOG(LogCircleLiveLinkProvider, Display, TEXT("Hello World"));
FEngineLoop::AppExit();
return 0;
}
编译一下,在 Engine\Binaries\Win64
(应该是对应平台下,我用的是 Windows,所以是在 Win64)文件夹下,会有对应编译好的可执行文件。
如果想让程序独立引擎进行运行,需要使用和 Unreal 源码组织结构相同的目录层次结构。如果这时候你把生成的 .exe 拷贝出来运行,是会出现警告的,会提示没有游戏配置和引擎配置。
LogPaths: Warning: No paths for game localization data were specifed in the game configuration.
LogInit: Warning: No paths for engine localization data were specifed in the engine configuration.
LogCircleLiveLinkProvider: Display: Hello World
但是如果在 Engine\Binaries\Win64
文件夹下进行运行(也就是程序生成的目录),并不会出现这种问题。
这种裸 exe 其实是会有一些副作用的,比如我的电脑上,运行之后,会在
C:\Engine
中生成日志文件。
要想真正独立运行,我们需要把 .exe,放入到一个 伪装 的 Engine 下面。我们按照 Engine\Binaries\Win64
创建文件夹,并把引擎 Engine.和游戏配置拷贝出来。
CircleLiveLinkProvider
└─Engine
├─Binaries
│ └─Win64
│ CircleLiveLinkProvider.exe
│ CircleLiveLinkProvider.pdb
│
└─Config
Base.ini
BaseEngine.ini
BaseGame.ini
这样这个 Program 就可以独立运行了。运行程序之后,会发现自动在 Engine
文件夹中生成了 Programs
和 Saved
└─Engine
├─Binaries
│ └─Win64
│ CircleLiveLinkProvider.exe
│ CircleLiveLinkProvider.pdb
│
├─Config
│ Base.ini
│ BaseEngine.ini
│ BaseGame.ini
│
├─Programs
│ └─CircleLiveLinkProvider
│ └─Saved
│ ├─Config
│ │ ├─CrashReportClient
│ │ │ └─UECC-Windows-69032E0743138D60D19DF9BAA8B91E3E
│ │ │ CrashReportClient.ini
│ │ │
│ │ └─WindowsEditor
│ │ Engine.ini
│ │ Game.ini
│ │
│ └─Logs
│ CircleLiveLinkProvider.log
│
└─Saved
└─Config
└─WindowsEditor
Manifest.ini
可以看到,日志就会出现在我们创建的文件夹中,而不会出现在系统默认(缺省)的执行路径中。
引入 LiveLink 所需的依赖,LiveLink 默认依赖 Udp,所以需要引入 Messaging
和 UdpMessaging
。
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class CircleLiveLinkProvider : ModuleRules
{
public CircleLiveLinkProvider(ReadOnlyTargetRules Target) : base(Target)
{
PublicIncludePaths.Add("Runtime/Launch/Public");
PrivateIncludePaths.Add("Runtime/Launch/Private"); // For LaunchEngineLoop.cpp include
PrivateDependencyModuleNames.AddRange(new[]
{
"Core",
"CoreUObject",
"Projects",
"LiveLinkMessageBusFramework",
"LiveLinkInterface",
"Messaging",
"UdpMessaging",
});
}
}
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
[SupportedPlatforms(UnrealPlatformClass.All)]
public class CircleLiveLinkProviderTarget : TargetRules
{
public CircleLiveLinkProviderTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Program;
IncludeOrderVersion = EngineIncludeOrderVersion.Latest;
LinkType = TargetLinkType.Monolithic;
LaunchModuleName = "CircleLiveLinkProvider";
// Lean and mean
bBuildDeveloperTools = false;
// Neve