最近在研究重新布局GameViewport和DockWidget/TagManager的問題
這里記錄一些可能有幫助的鏈接,有空再繼續研究.
參考鏈接1:https://answers.unrealengine.com/questions/368060/view.html
參考鏈接2: https://zhuanlan.zhihu.com/p/44206016
參考鏈接3(Qt +UE4方案):https://www.cnblogs.com/blueroses/p/9151094.html
參考鏈接4 打扮家居於TabManager的技術分享:https://www.bilibili.com/video/av60881798?from=search&seid=11876571760089496499
Q.重新布局GameViewport問題:
// 目前還沒弄明白UGameEngine::CreateViewport 和UGameEngine::CreateViewportWidget
目前妥協實現方案:GameViewport分屏 + Tick或GameViewportClient 的Draw里實現修改屏幕大小或綁定FViewport::ViewportResizedEvent的委托都可以
這樣就可以配合 Slate的SSplitter組件配合運算實現偽Layout布局了
void UCommonBPLibrary_Core::AdjustViewportSize(UObject * WorldObjectContext, FMargin margin)
{
UE_LOG(LogTemp, Log, TEXT(" AdjustViewportSize ")); if (WorldObjectContext->GetWorld() && /*GetWorld()->WorldType == EWorldType::Game &&*/ GEngine && GEngine->GameViewport) { FVector2D ViewportSize; GEngine->GameViewport->GetViewportSize(ViewportSize); // The GameViewport takes some time to initialize if (ViewportSize.X > 0 && ViewportSize.Y > 0) { FMargin relativeMat = FMargin { margin.Left / ViewportSize.X , margin.Top / ViewportSize.Y , 1 - margin.Right / ViewportSize.X , 1 - margin.Bottom / ViewportSize.Y }; GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].OriginX = relativeMat.Left; GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].OriginY = relativeMat.Top; GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].SizeX = relativeMat.Right; GEngine->GameViewport->SplitscreenInfo[0].PlayerData[0].SizeY = relativeMat.Bottom; } } }
可實現效果: