UE5 DBBrowser浏览器插件使用以及正常销毁记录
  3cAxQ5E22S4z 2023年11月02日 65 0

背景

UE5 DBBrowser浏览器插件使用以及正常销毁记录_UE5 DBBrowser 浏览器 插件

库迁移

在工程目录下创建Plugins(P大小写无所谓)文件夹,拷贝DBBrowser文件夹到plugins目录下

基本结构如下:

UE5 DBBrowser浏览器插件使用以及正常销毁记录_UE5 DBBrowser 浏览器 插件_02


版本提示出错

UE5 DBBrowser浏览器插件使用以及正常销毁记录_UE5 DBBrowser 浏览器 插件_03

解决方案

打开Plugins\DBBrowser\DBBrowser.uplugin

修改"EngineVersion": "5.0.0"为"EngineVersion": "5.1"

保存退出


游戏源码编译出错

错误(活动)	E0322	不允许使用抽象类类型 "FCEFInterfaceBrowserClosureTask" 的对象:	ZhongHuaHuaFei	E:\dsh\testvs\Plugins\DBBrowser\Source\WebBrowserUI\Private\CEF\CEFWebInterfaceBrowserWindow.cpp	1596	
错误(活动)	E0065	应输入“;”	ZhongHuaHuaFei	E:\dsh\testvs\Plugins\DBBrowser\Source\WebBrowserUI\Private\CEF\CEFWebInterfaceBrowserWindow.cpp	256	
错误(活动)	E0322	不允许使用抽象类类型 "<unnamed>::FWebInterfaceBrowserClosureVisitor" 的对象:	ZhongHuaHuaFei	E:\dsh\testvs\Plugins\DBBrowser\Source\WebBrowserUI\Private\CEF\CEFWebInterfaceBrowserWindow.cpp	660	
错误(活动)	E0322	不允许使用抽象类类型 "FCEFInterfaceBrowserClosureTask" 的对象:	ZhongHuaHuaFei	E:\dsh\testvs\Plugins\DBBrowser\Source\WebBrowserUI\Private\CEF\CEFWebInterfaceBrowserWindow.cpp	2324

无法识别宏定义IMPLEMENT_REFCOUNTING

不影响编译运行DebugGame

调用

UE5 DBBrowser浏览器插件使用以及正常销毁记录_UE5 DBBrowser 浏览器 插件_04

如果需要跳转页面,要响应OnBeforePopup事件,拿到URL直接加载即可跳转

UE5 DBBrowser浏览器插件使用以及正常销毁记录_UE5 DBBrowser 浏览器 插件_05

最终效果

UE5 DBBrowser浏览器插件使用以及正常销毁记录_UE5 DBBrowser 浏览器 插件_06

创建

void UDBBrowserUI::LoadURL(const FString& URL)
{
#if !UE_SERVER
	if (WebInterfaceWidget.IsValid())
		WebInterfaceWidget->LoadURL(URL);
#endif
}


void SWebInterfaceBrowserView::LoadURL(FString NewURL)
{
	AddressBarUrl = FText::FromString(NewURL);
	if (BrowserWindow.IsValid())
	{
		BrowserWindow->LoadURL(NewURL);
	}
}


void FCEFWebInterfaceBrowserWindow::LoadURL(FString NewURL)
{
	RequestNavigationInternal(NewURL, FString());
}


销毁

SDBBrowserUI::~SDBBrowserUI()
{
#if UE_BUILD_DEVELOPMENT || UE_BUILD_DEBUG
	for (TPair<TWeakPtr<IWebInterfaceBrowserWindow>, TWeakPtr<SWindow>> Temp : BrowserWindowWidgets)
	{
		if (Temp.Key.IsValid())
		{
			TSharedPtr<IWebInterfaceBrowserWindow> WebBrowserWindow = Temp.Key.Pin();
			if (WebBrowserWindow.IsValid())
				WebBrowserWindow->CloseBrowser(false);
		}

		if (Temp.Value.IsValid())
		{
			TSharedPtr<SWindow> Window = Temp.Value.Pin();
			if (Window.IsValid())
				Window->RequestDestroyWindow();
		}
	}
#endif
}
SWebInterfaceBrowserView::~SWebInterfaceBrowserView()
{
	if (BrowserWindow.IsValid())
	{
		BrowserWindow->OnDocumentStateChanged().RemoveAll(this);
		BrowserWindow->OnNeedsRedraw().RemoveAll(this);
		BrowserWindow->OnTitleChanged().RemoveAll(this);
		BrowserWindow->OnUrlChanged().RemoveAll(this);
		BrowserWindow->OnToolTip().RemoveAll(this);
		BrowserWindow->OnShowPopup().RemoveAll(this);
		BrowserWindow->OnDismissPopup().RemoveAll(this);

		BrowserWindow->OnShowDialog().Unbind();
		BrowserWindow->OnDismissAllDialogs().Unbind();
		BrowserWindow->OnCreateWindow().Unbind();
		BrowserWindow->OnCloseWindow().Unbind();

		if (BrowserWindow->OnBeforeBrowse().IsBoundToObject(this))
		{
			BrowserWindow->OnBeforeBrowse().Unbind();
		}

		if (BrowserWindow->OnLoadUrl().IsBoundToObject(this))
		{
			BrowserWindow->OnLoadUrl().Unbind();
		}

		if (BrowserWindow->OnBeforePopup().IsBoundToObject(this))
		{
			BrowserWindow->OnBeforePopup().Unbind();
		}
	}

	TSharedPtr<SWindow> SlateParentWindow = SlateParentWindowPtr.Pin();
	if (SlateParentWindow.IsValid())
	{
		SlateParentWindow->GetOnWindowDeactivatedEvent().RemoveAll(this);
	}

	if (SlateParentWindow.IsValid())
	{
		SlateParentWindow->GetOnWindowActivatedEvent().RemoveAll(this);
	}
}
FCEFWebInterfaceBrowserWindow::~FCEFWebInterfaceBrowserWindow()
{
	WebBrowserHandler->OnCreateWindow().Unbind();
	WebBrowserHandler->OnBeforePopup().Unbind();
	WebBrowserHandler->OnBeforeResourceLoad().Unbind();
	WebBrowserHandler->OnResourceLoadComplete().Unbind();
	WebBrowserHandler->OnConsoleMessage().Unbind();
	CloseBrowser(true);

	ReleaseTextures();

	BufferedVideo.Reset();
}


IWebInterfaceBrowserSingleton* Singleton = IWebInterfaceBrowserModule::Get().GetSingleton();
	if (Singleton)
	{
#if WITH_CEF3
		if (!bPAK)
			bPAK = Singleton->RegisterSchemeHandlerFactory("pak", FString(), new FWebInterfaceSchemeHandlerFactory());
#endif

		Singleton->SetDevToolsShortcutEnabled(Settings.bShowErrorMessage);
		BrowserWindow = Singleton->CreateBrowserWindow(Settings);
	}


// Create the CEF browser window.
		CefRefPtr<CefBrowser> Browser = CefBrowserHost::CreateBrowserSync(WindowInfo, NewHandler.get(), TCHAR_TO_WCHAR(*WindowSettings.InitialURL), BrowserSettings,nullptr, RequestContext);
		if (Browser.get())
		{
			// Create new window
			TSharedPtr<FCEFWebInterfaceBrowserWindow> NewBrowserWindow = MakeShareable(new FCEFWebInterfaceBrowserWindow(
				Browser,
				NewHandler,
				WindowSettings.InitialURL,
				WindowSettings.ZoomLevel,
				WindowSettings.ContentsToLoad,
				WindowSettings.bShowErrorMessage,
				WindowSettings.bThumbMouseButtonNavigation,
				WindowSettings.bUseTransparency,
				WindowSettings.bUseNativeCursors,
				bJSBindingsToLoweringEnabled));
			NewHandler->SetBrowserWindow(NewBrowserWindow);
			{
				FScopeLock Lock(&WindowInterfacesCS);
				WindowInterfaces.Add(NewBrowserWindow);
			}
			return NewBrowserWindow;
		}


相关文献

UE4 C++ WebBrowser的使用与拓展 - 知乎 (zhihu.com)

Unreal Engine WebUI的核心逻辑剖析 - 知乎 (zhihu.com)

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论