Slate独立程序(笔记五)

Slate独立小程序

  1. 准备工作
    官方Windows步骤:(红框框为重点)Slate独立程序(笔记五)_第1张图片
    下载ue4源码网盘。提取码:gskq
    eg:在运行Setup.bat和GenerateProjectFiles.bat过程中,我遇到几个问题以及解决方法。
  • 文件所在路径过长。
    所以,使用源码的盆友们,下载路径不要放得太深了。
  • .NET Framework版本低于4.6.2。
    在这里插入图片描述
  • 未找到“GetReferenceNearestTargetFrameworkTask”任务。
    在这里插入图片描述
  • 我会偶尔出现打开UE4.sln,VS闪退的情况。这个情况有的时候发生,有的时候又能打开了。所以一直没有找到解决方法,希望知道原因的大神能够为我答疑解惑。
  1. UE4提供了一个空白的程序供我们发挥。
    Slate独立程序(笔记五)_第2张图片
    先来分析一下BlankProgram.Target.cs文件。
    可以看到一些环境设置。
    Slate独立程序(笔记五)_第3张图片
    然后是BlankProgram.Build.cs文件。
    Slate独立程序(笔记五)_第4张图片
  2. 依托ue4的shader系统,绘制Slate。
  • 修改.Target.cs文件。
bCompileAgainstCoreUObject = true;
bCompileAgainstApplicationCore = true;
bIsBuildingConsoleApplication = false;

  • 在.Build.cs文件中添加。
     PrivateDependencyModuleNames.AddRange(
			new string[] 
			{
				"Slate",
				"SlateCore",
				"StandaloneRenderer"
            }
        );
  • BlackProgram.cpp
#include "BlankProgram.h"

#include "RequiredProgramMainCPPInclude.h"
#include "Slate/Public/Framework/Application/SlateApplication.h"
#include "Developer/StandaloneRenderer/Public/StandaloneRenderer.h"
#include "SlateCore/Public/Widgets/SWindow.h"
#include "SlateCore/Public/Widgets/Images/SImage.h"
#include "SlateCore/Public/Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Docking/SDockTab.h"
#include "HelloSlate.h"


#define LOCTEXT_NAMESPACE "BlankProgram"

DEFINE_LOG_CATEGORY_STATIC(LogBlankProgram, Log, All);

IMPLEMENT_APPLICATION(BlankProgram, "BlankProgram");

//INT32_MAIN_INT32_ARGC_TCHAR_ARGV()
//{
//	GEngineLoop.PreInit(ArgC, ArgV);
//	UE_LOG(LogBlankProgram, Display, TEXT("Hello World"));
//	return 0;
//}
/*Method1*/
TSharedRef<SDockTab> SpawnDockTab(const FSpawnTabArgs& Args) 
{
	return SNew(SDockTab)
		.TabRole(ETabRole::NomadTab)
		[
			SNew(SHelloSlate)
		];
}

void SpawnWindow()
{
	/*Method2*/
	//相当于定义函数SpawnDockTab(const FSpawnTabArgs& Args)
	auto SpawnTab = [](const FSpawnTabArgs&)->TSharedRef<SDockTab> 
	{
		return SNew(SDockTab)
			.TabRole(ETabRole::NomadTab)
			[
				SNew(SImage)
			];
	};
	//注册
	FGlobalTabmanager::Get()->RegisterTabSpawner("HelloSlate", FOnSpawnTab::CreateStatic(&SpawnDockTab));
	FGlobalTabmanager::Get()->RegisterNomadTabSpawner("MySlate", FOnSpawnTab::CreateLambda(SpawnTab));
	//添加窗口
	TSharedRef<FTabManager::FLayout> Layout = FTabManager::NewLayout("HelloSlate")
		->AddArea
		(
			FTabManager::NewArea(1920, 1080)
			//分割区域,添加Tab
			->Split
			(
				FTabManager::NewStack()
				->AddTab("HelloSlate", ETabState::OpenedTab)
				->AddTab("MySlate", ETabState::OpenedTab)
			)
		);

	FGlobalTabmanager::Get()->RestoreFrom(Layout,TSharedPtr<SWindow>());
}

int WINAPI WinMain( _In_ HINSTANCE hInInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
	//初始化引擎基本配置;GetCommandLineW函数检索当前进程的命令行字符串。
	GEngineLoop.PreInit(GetCommandLineW());
	//确保所有Uobject类都已经注册,且默认属性已初始化。
	ProcessNewlyLoadedUObjects();
	//初始化Slate独立渲染环境,GetStandardStandaloneRenderer()初始化渲染器。
	FSlateApplication::InitializeAsStandaloneApplication(GetStandardStandaloneRenderer());
	//TSharedPtr MainWindow = 
	//SNew(SWindow)
	//	.ClientSize(FVector2D(1280,720))
	//	[
	//		SNew(SImage)
	//	];
	//FSlateApplication::Get().AddWindow(MainWindow.ToSharedRef());
	SpawnWindow();
	
	while (!IsEngineExitRequested())
	{
		FSlateApplication::Get().Tick();
		FSlateApplication::Get().PumpMessages();
	}
	FSlateApplication::Shutdown();
	return 0;

}
#undef LOCTEXT_NAMESPACE
  • 将之前的HelloSlate.cpp、HelloSlate.h、CustomBox.cpp和CustomBox.h文件迁移进来。

Slate独立程序(笔记五)_第5张图片
Slate独立程序(笔记五)_第6张图片

  • 最后实现效果:
    Slate独立程序(笔记五)_第7张图片

你可能感兴趣的:(Slate独立程序(笔记五))