mothcocoon / flowgraph Goto Github PK
View Code? Open in Web Editor NEWDesign-agnostic node system for scripting game’s flow in Unreal Engine
Home Page: https://discord.gg/Xmtr6GhbmW
License: MIT License
Design-agnostic node system for scripting game’s flow in Unreal Engine
Home Page: https://discord.gg/Xmtr6GhbmW
License: MIT License
Double-clicking the node is reserved for opening the primary asset assigned to the node.
For example, double-clicking the Play Level Sequence node opens up the Sequencer editor for the assigned asset. It's frequently used by content designers in daily work
A fix would be to set the LoadingPhase of the Flow module to "PreDefault"
"Modules" : [ { "Name" : "Flow", "Type" : "Runtime", "LoadingPhase" : "PreDefault" }, { "Name" : "FlowEditor", "Type" : "Editor", "LoadingPhase" : "Default" } ]
Idea by Discord user Fipa
"i.e. In the FlowGraph asset editor details panel, have a button next to any flow tag, to search for objects with them in the level.
This would improve iteration speed when having to manage a large amount of objects with the same flow tag in the scene."
If you create a new Flow Node Blueprint child from another Flow Node parent class, the editor shows a "Handled ensure" red error right after doing it & always on project start from that moment when a Flow Asset is opened, here it is:
LogOutputDevice: Error: === Handled ensure: === LogOutputDevice: Error: Ensure condition failed: QueuedRequests.Num() == 0 [File:D:/Build/++UE4/Sync/Engine/Source/Editor/Kismet/Private/BlueprintCompilationManager.cpp] [Line: 251] LogOutputDevice: Error: Stack: LogOutputDevice: Error: [Callstack] 0x00007ff9ae3e4289 UE4Editor-Kismet.dll!<lambda_49c80b9764981542cc725e1994a18875>::operator()() [D:\Build\++UE4\Sync\Engine\Source\Editor\Kismet\Private\BlueprintCompilationManager.cpp:251] LogOutputDevice: Error: [Callstack] 0x00007ff9add4bec5 UE4Editor-Kismet.dll!FBlueprintCompilationManagerImpl::CompileSynchronouslyImpl() [D:\Build\++UE4\Sync\Engine\Source\Editor\Kismet\Private\BlueprintCompilationManager.cpp:251] LogOutputDevice: Error: [Callstack] 0x00007ff9add4bd71 UE4Editor-Kismet.dll!FBlueprintCompilationManager::CompileSynchronously() [D:\Build\++UE4\Sync\Engine\Source\Editor\Kismet\Private\BlueprintCompilationManager.cpp:3095] LogOutputDevice: Error: [Callstack] 0x00007ff9afe32e1a UE4Editor-UnrealEd.dll!FKismetEditorUtilities::CreateBlueprint() [D:\Build\++UE4\Sync\Engine\Source\Editor\UnrealEd\Private\Kismet2\Kismet2.cpp:527] LogOutputDevice: Error: [Callstack] 0x00007ff99456bfba UE4Editor-FlowEditor.dll!UFlowNodeBlueprintFactory::FactoryCreateNew() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Nodes\FlowNodeBlueprintFactory.cpp:259] LogOutputDevice: Error: [Callstack] 0x00007ff9a7571685 UE4Editor-AssetTools.dll!UAssetToolsImpl::CreateAsset() [D:\Build\++UE4\Sync\Engine\Source\Developer\AssetTools\Private\AssetTools.cpp:485] LogOutputDevice: Error: [Callstack] 0x00007ff9935a46ad UE4Editor-ContentBrowserAssetDataSource.dll!UContentBrowserAssetDataSource::OnFinalizeCreateAsset() [D:\Build\++UE4\Sync\Engine\Plugins\Editor\ContentBrowser\ContentBrowserAssetDataSource\Source\ContentBrowserAssetDataSource\Private\ContentBrowserAssetDataSource.cpp:1904] LogOutputDevice: Error: [Callstack] 0x00007ff99357c0b3 UE4Editor-ContentBrowserAssetDataSource.dll!TBaseUObjectMethodDelegateInstance<0,UContentBrowserAssetDataSource,FContentBrowserItemData __cdecl(FContentBrowserItemData const &,FString const &,FText *),FDefaultDelegateUserPolicy>::Execute() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\ DelegateInstancesImpl.h:593] LogOutputDevice: Error: [Callstack] 0x00007ff9a8155a83 UE4Editor-ContentBrowserData.dll!FContentBrowserItemTemporaryContext::FinalizeItem() [D:\Build\++UE4\Sync\Engine\Source\Editor\ContentBrowserData\Private\ContentBrowserItem.cpp:603] LogOutputDevice: Error: [Callstack] 0x00007ff9a7d48146 UE4Editor-ContentBrowser.dll!SAssetView::EndCreateDeferredItem() [D:\Build\++UE4\Sync\Engine\Source\Editor\ContentBrowser\Private\SAssetView.cpp:641] LogOutputDevice: Error: [Callstack] 0x00007ff9a7d147eb UE4Editor-ContentBrowser.dll!SAssetView::AssetRenameCommit() [D:\Build\++UE4\Sync\Engine\Source\Editor\ContentBrowser\Private\SAssetView.cpp:3627] LogOutputDevice: Error: [Callstack] 0x00007ff9a7d5a8ff UE4Editor-ContentBrowser.dll!TBaseSPMethodDelegateInstance<0,SAssetView,0,void __cdecl(TSharedPtr<FAssetViewItem,0> const &,FString const &,FSlateRect const &,enum ETextCommit::Type),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInst ancesImpl.h:307] LogOutputDevice: Error: [Callstack] 0x00007ff9a7d7ad7b UE4Editor-ContentBrowser.dll!SAssetViewItem::HandleNameCommitted() [D:\Build\++UE4\Sync\Engine\Source\Editor\ContentBrowser\Private\AssetViewWidgets.cpp:528] LogOutputDevice: Error: [Callstack] 0x00007ff9a7d59b27 UE4Editor-ContentBrowser.dll!TBaseSPMethodDelegateInstance<0,SAssetTileItem,0,void __cdecl(FText const &,enum ETextCommit::Type),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:307] LogOutputDevice: Error: [Callstack] 0x00007ff9c32f4164 UE4Editor-Slate.dll!SInlineEditableTextBlock::OnTextBoxCommitted() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Widgets\Text\SInlineEditableTextBlock.cpp:323] LogOutputDevice: Error: [Callstack] 0x00007ff9c32d91e7 UE4Editor-Slate.dll!TBaseSPMethodDelegateInstance<0,SInlineEditableTextBlock,0,void __cdecl(FText const &,enum ETextCommit::Type),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:307] LogOutputDevice: Error: [Callstack] 0x00007ff9c32804c8 UE4Editor-Slate.dll!SEditableTextBox::OnEditableTextCommitted() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Widgets\Input\SEditableTextBox.cpp:482] LogOutputDevice: Error: [Callstack] 0x00007ff9c325f5a7 UE4Editor-Slate.dll!TBaseSPMethodDelegateInstance<0,SEditableTextBox,0,void __cdecl(FText const &,enum ETextCommit::Type),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:307] LogOutputDevice: Error: [Callstack] 0x00007ff9c32e1c76 UE4Editor-Slate.dll!FSlateEditableTextLayout::HandleCarriageReturn() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Widgets\Text\SlateEditableTextLayout.cpp:1519] LogOutputDevice: Error: [Callstack] 0x00007ff9c32e3088 UE4Editor-Slate.dll!FSlateEditableTextLayout::HandleKeyDown() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Widgets\Text\SlateEditableTextLayout.cpp:967] LogOutputDevice: Error: [Callstack] 0x00007ff9c31e1114 UE4Editor-Slate.dll!SEditableText::OnKeyDown() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Widgets\Input\SEditableText.cpp:212] LogOutputDevice: Error: [Callstack] 0x00007ff9c3032112 UE4Editor-Slate.dll!FEventRouter::Route<FReply,FEventRouter::FBubblePolicy,FKeyEvent,<lambda_f630e7f24dbef73857a69219e32f2d96> >() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:383] LogOutputDevice: Error: [Callstack] 0x00007ff9c3095087 UE4Editor-Slate.dll!FSlateApplication::ProcessKeyDownEvent() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:4341] LogOutputDevice: Error: [Callstack] 0x00007ff9c3088756 UE4Editor-Slate.dll!FSlateApplication::OnKeyDown() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:4238] LogOutputDevice: Error: [Callstack] 0x00007ff9f738bcc8 UE4Editor-ApplicationCore.dll!FWindowsApplication::ProcessDeferredMessage() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:2040] LogOutputDevice: Error: [Callstack] 0x00007ff9f73792b7 UE4Editor-ApplicationCore.dll!FWindowsApplication::DeferMessage() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:2698] LogOutputDevice: Error: [Callstack] 0x00007ff9f738e465 UE4Editor-ApplicationCore.dll!FWindowsApplication::ProcessMessage() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:1881] LogOutputDevice: Error: [Callstack] 0x00007ff9f7374410 UE4Editor-ApplicationCore.dll!FWindowsApplication::AppWndProc() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:905] LogOutputDevice: Error: [Callstack] 0x00007ffa13d5e7e8 USER32.dll!UnknownFunction [] LogOutputDevice: Error: [Callstack] 0x00007ffa13d5e229 USER32.dll!UnknownFunction [] LogOutputDevice: Error: [Callstack] 0x00007ff9f738fcd4 UE4Editor-ApplicationCore.dll!FWindowsPlatformApplicationMisc::PumpMessages() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsPlatformApplicationMisc.cpp:125] LogOutputDevice: Error: [Callstack] 0x00007ff788917621 UE4Editor.exe!FEngineLoop::Tick() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:4851] LogOutputDevice: Error: [Callstack] 0x00007ff788930fbc UE4Editor.exe!GuardedMain() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:178] LogOutputDevice: Error: [Callstack] 0x00007ff7889310aa UE4Editor.exe!GuardedMainWrapper() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:137] LogOutputDevice: Error: [Callstack] 0x00007ff7889340cd UE4Editor.exe!LaunchWindowsStartup() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:273] LogOutputDevice: Error: [Callstack] 0x00007ff788945984 UE4Editor.exe!WinMain() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:320] LogOutputDevice: Error: [Callstack] 0x00007ff78894853a UE4Editor.exe!__scrt_common_main_seh() [d:\agent\_work\5\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288] LogOutputDevice: Error: [Callstack] 0x00007ffa12cc7034 KERNEL32.DLL!UnknownFunction [] LogOutputDevice: Error: [Callstack] 0x00007ffa14ba2651 ntdll.dll!UnknownFunction []
I saw that you add a way to add pins in flow graph, but it'll also be very useful to manage pins at editor time.
For example for a flow node to detect specific events from the objects it's tracking and listing them as outputs.
Personally, I have no plans to implement it. The community is free to tackle this challenge.
It's not obvious which way to choose as a proper solution for all (at least most of) the projects. It could be
Flow Graph solution would need to include support for UObject references.
A way to checking if the output pin is connected to anything would be nice, to catch situations when the flow ends abruptly with the potential to stall the entire system.
It would allow for adding things like a tooltip per pin.
It might make it easier to customize the blueprint UI of the Flow Node blueprint.
https://github.com/MothCocoon/Flow/issues/10
The goal is to test stability every single night.
It would be useful to navigate between related Flow Assets while editing assets by using "asset breadcrumb". The same way we can switch between master and subsequences in the Level Sequence editor. Take a look at the top right corner of the screenshot, "Shot_01" and "Shot_01_e01" are two different assets. We can easily switch between them without opening the new editor windows.
I already implemented such breadcrumb, but it only works in runtime. It allows jumping between "sub-graph instance" and "parent instance" (Flow Asset that created sub-graph instance via Sub Graph node). And it works by opening another editor window by another asset.
I'd like to create an optional mode where we could switch between Flow Assets in a single window, so it could the same way as it works in the Sequencer. It's not possible to do it in "separate window per asset" mode since a single asset can be used in a few other assets - there's no linear hierarchy that allow to creat a linear breadrumb.
The original report by fpwong on Discord:
"Plugin won't build if you have the DungeonArchitect plugin installed since they also have a file called FlowAsset.cpp/.h
The class name is fine though, theirs is called UFlowAssetBase.
Also UFlowEditorSettings, this one has a duplicate class as well."
This way adding a reaction on the trigger would be as quick as with Level Blueprints.
Reroute node in Flow Graph is already available, but it has to be dragged from the Palette.
Currently, we can filter actors in World Outliner by FString tag. This is ancient functionality working on FString tag in AActor (perhaps components too?) which isn't very useful. Using FString tags is simply unsafe, error-prone. There's no point in using FString tags since we have Gameplay Tags (introduced in one of the UE4 releases).
Goal
This might not needed, if I'd choose implement task #34
1.) Copy a Flow Node Blueprint to another folder in the Content Browser & after copied, just renamed it while a Flow Graph is opened:
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000038
UE4Editor_FlowEditor!UFlowGraphSchema::GetFlowNodeActions() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Graph\FlowGraphSchema.cpp:215] UE4Editor_FlowEditor!SFlowPalette::CollectAllActions() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Graph\Widgets\SFlowPalette.cpp:184] UE4Editor_FlowEditor!TBaseSPMethodDelegateInstance<0,SFlowPalette,0,void __cdecl(FGraphActionListBuilderBase &),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [G:\Epic Games\UE_4.27\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:307] UE4Editor_GraphEditor!SGraphActionMenu::RefreshAllActions() [D:\Build\++UE4\Sync\Engine\Source\Editor\GraphEditor\Private\SGraphActionMenu.cpp:362] UE4Editor_FlowEditor!SFlowPalette::Refresh() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Graph\Widgets\SFlowPalette.cpp:154] UE4Editor_FlowEditor!TBaseSPMethodDelegateInstance<0,SFlowPalette,0,void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [G:\Epic Games\UE_4.27\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:307] UE4Editor_FlowEditor!UFlowGraphSchema::RefreshNodeList() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Graph\FlowGraphSchema.cpp:379] UE4Editor_FlowEditor!UFlowGraphSchema::AddAsset() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Graph\FlowGraphSchema.cpp:347] UE4Editor_FlowEditor!TBaseStaticDelegateInstance<void __cdecl(FAssetData const &),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [G:\Epic Games\UE_4.27\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:731] UE4Editor_AssetRegistry!TMulticastDelegate<void __cdecl(FAssetData const &),FDefaultDelegateUserPolicy>::Broadcast() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateSignatureImpl.inl:955] UE4Editor_AssetRegistry!UAssetRegistryImpl::AddAssetData() [D:\Build\++UE4\Sync\Engine\Source\Runtime\AssetRegistry\Private\AssetRegistry.cpp:2658] UE4Editor_AssetRegistry!UAssetRegistryImpl::AssetSearchDataGathered() [D:\Build\++UE4\Sync\Engine\Source\Runtime\AssetRegistry\Private\AssetRegistry.cpp:2355] UE4Editor_AssetRegistry!UAssetRegistryImpl::ScanPathsAndFilesSynchronous() [D:\Build\++UE4\Sync\Engine\Source\Runtime\AssetRegistry\Private\AssetRegistry.cpp:2244] UE4Editor_AssetRegistry!UAssetRegistryImpl::ScanModifiedAssetFiles() [D:\Build\++UE4\Sync\Engine\Source\Runtime\AssetRegistry\Private\AssetRegistry.cpp:3037] UE4Editor_DataValidation!UEditorValidatorSubsystem::ValidateAllSavedPackages() [D:\Build\++UE4\Sync\Engine\Plugins\Editor\DataValidation\Source\DataValidation\Private\EditorValidatorSubsystem.cpp:402] UE4Editor_Engine!FTimerUnifiedDelegate::Execute() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Engine\Public\TimerManager.h:51] UE4Editor_Engine!FTimerManager::Tick() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Engine\Private\TimerManager.cpp:881] UE4Editor_UnrealEd!UEditorEngine::Tick() [D:\Build\++UE4\Sync\Engine\Source\Editor\UnrealEd\Private\EditorEngine.cpp:1368] UE4Editor_UnrealEd!UUnrealEdEngine::Tick() [D:\Build\++UE4\Sync\Engine\Source\Editor\UnrealEd\Private\UnrealEdEngine.cpp:426] UE4Editor!FEngineLoop::Tick() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:4922] UE4Editor!GuardedMain() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:178] UE4Editor!GuardedMainWrapper() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:137] UE4Editor!LaunchWindowsStartup() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:273] UE4Editor!WinMain() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:320] UE4Editor!__scrt_common_main_seh() [d:\agent\_work\5\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288] kernel32 ntdll
2.) If you close all of the Flow Graphs and you copy a Flow Node to another folder then you'll try to open any Flow Graph, this will happen:
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000038
UE4Editor_FlowEditor!UFlowGraphSchema::GetFlowNodeActions() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Graph\FlowGraphSchema.cpp:215] UE4Editor_FlowEditor!SFlowPalette::CollectAllActions() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Graph\Widgets\SFlowPalette.cpp:184] UE4Editor_FlowEditor!TBaseSPMethodDelegateInstance<0,SFlowPalette,0,void __cdecl(FGraphActionListBuilderBase &),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [G:\Epic Games\UE_4.27\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:307] UE4Editor_GraphEditor!SGraphActionMenu::RefreshAllActions() [D:\Build\++UE4\Sync\Engine\Source\Editor\GraphEditor\Private\SGraphActionMenu.cpp:362] UE4Editor_GraphEditor!SGraphActionMenu::Construct() [D:\Build\++UE4\Sync\Engine\Source\Editor\GraphEditor\Private\SGraphActionMenu.cpp:352] UE4Editor_FlowEditor!SFlowPalette::Construct() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Graph\Widgets\SFlowPalette.cpp:106] UE4Editor_FlowEditor!FFlowAssetEditor::CreateWidgets() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Asset\FlowAssetEditor.cpp:309] UE4Editor_FlowEditor!FFlowAssetEditor::InitFlowAssetEditor() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Asset\FlowAssetEditor.cpp:189] UE4Editor_FlowEditor!FFlowEditorModule::CreateFlowAssetEditor() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\FlowEditorModule.cpp:165] UE4Editor_FlowEditor!FAssetTypeActions_FlowAsset::OpenAssetEditor() [E:\Project Test Field\FlowGraph_427_BP\Plugins\FlowGraph_427_Precompiled\Source\FlowEditor\Private\Asset\AssetTypeActions_FlowAsset.cpp:35] UE4Editor_UnrealEd!UAssetEditorSubsystem::OpenEditorForAsset() [D:\Build\++UE4\Sync\Engine\Source\Editor\UnrealEd\Private\Subsystems\AssetEditorSubsystem.cpp:363] UE4Editor_UnrealEd!UAssetEditorSubsystem::OpenEditorForAssets_Advanced() [D:\Build\++UE4\Sync\Engine\Source\Editor\UnrealEd\Private\Subsystems\AssetEditorSubsystem.cpp:437] UE4Editor_UnrealEd!UAssetEditorSubsystem::OpenEditorForAssets() [D:\Build\++UE4\Sync\Engine\Source\Editor\UnrealEd\Private\Subsystems\AssetEditorSubsystem.cpp:553] UE4Editor_ContentBrowserAssetDataSource!ContentBrowserAssetData::EditOrPreviewAssetFileItems() [D:\Build\++UE4\Sync\Engine\Plugins\Editor\ContentBrowser\ContentBrowserAssetDataSource\Source\ContentBrowserAssetDataSource\Private\ContentBrowserAssetDataCore.cpp:298] UE4Editor_ContentBrowserAssetDataSource!ContentBrowserAssetData::EditOrPreviewItems() [D:\Build\++UE4\Sync\Engine\Plugins\Editor\ContentBrowser\ContentBrowserAssetDataSource\Source\ContentBrowserAssetDataSource\Private\ContentBrowserAssetDataCore.cpp:318] UE4Editor_ContentBrowserAssetDataSource!UContentBrowserAssetDataSource::BulkEditItems() [D:\Build\++UE4\Sync\Engine\Plugins\Editor\ContentBrowser\ContentBrowserAssetDataSource\Source\ContentBrowserAssetDataSource\Private\ContentBrowserAssetDataSource.cpp:1030] UE4Editor_ContentBrowser!SContentBrowser::OnItemsActivated() [D:\Build\++UE4\Sync\Engine\Source\Editor\ContentBrowser\Private\SContentBrowser.cpp:2281] UE4Editor_ContentBrowser!TBaseSPMethodDelegateInstance<0,SContentBrowser,0,void __cdecl(TArrayView<FContentBrowserItem const ,int>,enum EAssetTypeActivationMethod::Type),FDefaultDelegateUserPolicy>::Execute() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:290] UE4Editor_ContentBrowser!SAssetView::OnListMouseButtonDoubleClick() [D:\Build\++UE4\Sync\Engine\Source\Editor\ContentBrowser\Private\SAssetView.cpp:3548] UE4Editor_ContentBrowser!TBaseSPMethodDelegateInstance<0,SAssetView,0,void __cdecl(TSharedPtr<FAssetViewItem,0>),FDefaultDelegateUserPolicy>::ExecuteIfSafe() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:307] UE4Editor_ContentBrowser!TDelegate<void __cdecl(TSharedPtr<FAssetViewItem,0>),FDefaultDelegateUserPolicy>::ExecuteIfBound<void,0>() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateSignatureImpl.inl:599] UE4Editor_ContentBrowser!SListView<TSharedPtr<FAssetViewItem,0> >::Private_OnItemDoubleClicked() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Public\Widgets\Views\SListView.h:1074] UE4Editor_ContentBrowser!STableRow<TSharedPtr<FAssetViewItem,0> >::OnMouseButtonDoubleClick() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Public\Widgets\Views\STableRow.h:461] UE4Editor_Slate!FEventRouter::Route<FReply,FEventRouter::FBubblePolicy,FPointerEvent,<lambda_2b5148752c2a272000c47b69ff14a42e> >() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:378] UE4Editor_Slate!FSlateApplication::RoutePointerDoubleClickEvent() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5297] UE4Editor_Slate!FSlateApplication::ProcessMouseButtonDoubleClickEvent() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5284] UE4Editor_Slate!FSlateApplication::OnMouseDoubleClick() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp:5247] UE4Editor_ApplicationCore!FWindowsApplication::ProcessDeferredMessage() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:2209] UE4Editor_ApplicationCore!FWindowsApplication::DeferMessage() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:2698] UE4Editor_ApplicationCore!FWindowsApplication::ProcessMessage() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:1881] UE4Editor_ApplicationCore!FWindowsApplication::AppWndProc() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp:905] user32 user32 UE4Editor_ApplicationCore!FWindowsPlatformApplicationMisc::PumpMessages() [D:\Build\++UE4\Sync\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsPlatformApplicationMisc.cpp:125] UE4Editor!FEngineLoop::Tick() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:4851] UE4Editor!GuardedMain() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:178] UE4Editor!GuardedMainWrapper() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:137] UE4Editor!LaunchWindowsStartup() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:273] UE4Editor!WinMain() [D:\Build\++UE4\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:320] UE4Editor!__scrt_common_main_seh() [d:\agent\_work\5\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288] kernel32 ntdll
Methods: CanUserAddInput()
, CanUserAddOutput()
.
The original report by Marcis on Discord:
"Inputs and outputs of the Flow Node blueprint don't update in the flow asset graph. The only fix I found is to delete the old node and replace it with a new one."
Waiting with this at least until UE 5.1.
Such engine changes should help a lot.
https://github.com/EpicGames/UnrealEngine/commit/64f957e8cb20e99f38cbe51b57ff522717d59850
I created my own version of Sequencer's event track which is originally used for sending events to blueprints.
My version is meant to send events to Flow Nodes like Play Level Sequence. The result is awesome, it allows us to generate output pins on Flow Node from key names on Flow Event Track. We can easily call Flow events from the timeline events of Sequencer!
The problem with the current implementation
I'm ought to find a solution to make this feature available for people using launcher builds of the engine.
Commented out places in code
Flow Node Blueprint names do not appear under world in Palette after creation, they're just empty spaces.
I think it would be useful to be able to check the state of the FlowNode by id, for example. I can call GetRecordedNodes, GetActiveNodes and check if it contains a node with a specific id.
I can add custom nodes to set something somewhere, but standard nodes like AND / OR also can be traited as task status.
In short, if I use FlowAsset as Quest, then besides ACTIVE / COMPLETED I want to check intermediate state too.
This puzzles me how that's possible, but I totally forgot about saving and loading the state of graphs and nodes.
It shouldn't be much work, should be addressed ASAP.
Goal
It might used Asset Search plugin introduced with UE 4.26.
We can't call LogError from a const function, because LogError is not marked as const, but it doesn't change something.
Might be a good idea to check other functions too
Hello,
I've noticed a rather annoying problem: when compiling or loading any blueprint, it's quite common that one or more flow assets become dirty and need to be saved. It becomes problematic when using perforce for collaboration as it needs to checkout this flow assets.
It seems to be related to the fact that the flow editor does this :
GEditor->OnBlueprintCompiled().AddUObject(this, &UFlowGraphNode::OnExternalChange); GEditor->OnClassPackageLoadedOrUnloaded().AddUObject(this, &UFlowGraphNode::OnExternalChange);
and then
`
void UFlowGraphNode::OnExternalChange()
{
bNeedsFullReconstruction = true;
ReconstructNode();
GetGraph()->NotifyGraphChanged();
}
`
`void UFlowGraph::NotifyGraphChanged()
{
GetFlowAsset()->HarvestNodeConnections();
GetFlowAsset()->MarkPackageDirty();
Super::NotifyGraphChanged();
}`
So if I understdand this well, it means that everytime you load/unload or compile a blueprint, the flow assets is rebuilt and sometimes it makes false positive and make the object dirty
just like some tasks subgraph structure is same, but the nodes in this graph has different data (tags, float, etc..)
we want to reuse the graph, do u have some suggestions or plans to support that?
It would be nice if the node styles were customizable from the blueprints - color of the header, and other parameters if they exist.
i have a suggest that add blackboard data in each Flowgraph asset, so that to make the graph instance like a behavior tree,
we could define viaribles in blackboard,and use it in each node.
then we can use every graph by different data source
Having a single repository was convenient for me while developing the first version of the plugin, but not convenient for people who wanted to clone, sync, and fork the plugin itself.
Now we have 2 repositories.
Flow Graph design makes it easy to develop multiplayer games.
It's up to the system engineer to support replication in specific Flow Nodes - these ones related to systems like UI, audio, dialogue. It's easy to establish custom replication of Flow Component (in the inherited class), so blueprint actors could communicate with systems on the client-side.
The "OnNotifyFromActor" nodes matches tags with HasAnyExact, which is not always the best match type for certain situations.
A dropdown to choose the type of match (HasAnyExaxt, HasAllExact, HasAny, HasAll, etc...) in this node parameters would be very useful.
Even better would be an option in the plugin's general settings to choose the default match type.
Originally, the Flow repository contained everything: a plugin, sample code, sample content... Code is already extracted to separate repositories
Probably also gonna nuke the existing assets and plan a new Getting Started content.
Actually... current content mostly served to quickly check if the plugin works (now I have a separated private repo serving that purpose) and... to provide simple content for screenshots and my first video introducing the concept of the Flow Graph ;)
This was discussed on Discord. Can be a handy feature for some.
Hi Doctor!
It's been some times I was having a crash when dragging from a flow pin, then making a new node from it.
I finally took time to investigate this and found where the error came.
In your AutowireNewNode func (FlowGraphNode.cpp), at some point, the OwningNode of the FromPin gets obliterated.
It happens in the "TryCreateConnection(FromPin, Pin)" of the if statement.
After investigating, it turns out that the TryCreateConnection notifies the graph of a change, without any change having really applied yet.
I haven't looked at who is subscribed to this event, but for some reason, notifying in the middle of the Autowire process breaks a reference.
My fix for the moment was to simply remove the notify.
bool UFlowGraphSchema::TryCreateConnection(UEdGraphPin* PinA, UEdGraphPin* PinB) const
{
const bool bModified = UEdGraphSchema::TryCreateConnection(PinA, PinB);
if (bModified)
{
//PinA->GetOwningNode()->GetGraph()->NotifyGraphChanged();
}
return bModified;
}
But I guess the right way would be to still notify the graph, but after the autowire process.
I hope this can help!
It would be great to change the display names of pins without renaming PinName
, which requires a manual fixup of graphs.
Hi,
When duplicate a FlowAsset in Content Browser, the NodeGuid of FlowGraphNode in duplicated FlowAsset will updated, but the NodeGuid of FlowNode remains the same, and UFlowAsset::TriggerInput function will failed because can't find the FlowNode.
The basic goal might be similar to #17, but this task wouldn't require modifying the engine.
A dedicated window would allow for implementation of Flow-specific features, but I'm not sure what it might be.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.