解决UE4 Slate ModalWindow无法交互问题

总体来说本文会解决两种问题

TSharedPtr Window;
SAssignNew(Window, SWindow)
[
    SNew(MyWidget)
];

FSlateApplication::Get().AddModalWindow(Window.ToSharedRef(), GEngine->GameViewport->GetWindow());

这里的MyWidget是继承自SCompoundWidget窗口类

第一种是在ModalWindow无法进行网络服务请求

解决这种问题在MyWidget的Construct函数中添加一下函数

void MyWidget::Construct(const FArguments& InArgs)
{
    TickEvent();
}
void MyWidget::TickEvent()
{
	FSlateApplication::Get().GetOnModalLoopTickEvent().AddLambda([](float DeltaTime)
	{
		FTickableGameObject::TickObjects(nullptr, LEVELTICK_All, false, DeltaTime);
		FHttpModule::Get().GetHttpManager().Tick(DeltaTime);
	});
}

第二种是数据无法更新(只有在鼠标移动状态下才能更新)问题

Slate为了节省没必要要开销的性能(大多数UI的是在有交互的情况下重绘的)

因此需要手动注册界面的更新/激活状态

void MyWidget::Construct(const FArguments& InArgs)
{
    RegisterActiveTimer(0.3f, FWidgetActiveTimerDelegate::CreateSP(this,&SLoadShapeWidget::ActiveTick));
}

EActiveTimerReturnType MyWidget::ActiveTick(double InCurrentTime, float InDeltaTime)
{
	return EActiveTimerReturnType::Continue;
}

 

你可能感兴趣的:(游戏开发,UE4)