GithubHelp home page GithubHelp logo

mothcocoon / flowgraph Goto Github PK

View Code? Open in Web Editor NEW
1.0K 39.0 198.0 2.14 MB

Design-agnostic node system for scripting game’s flow in Unreal Engine

Home Page: https://discord.gg/Xmtr6GhbmW

License: MIT License

C# 0.25% C++ 99.59% C 0.15%
unreal-engine game-development narrative-design storytelling unreal

flowgraph's People

Contributors

bargestt avatar bohdon avatar bormor avatar cchnn avatar deams51 avatar dnault1 avatar doubledeez avatar drakynfly avatar gamedevgrzesiek avatar growlitheharpo avatar iceriverr avatar illusives avatar infiniteautomaton avatar jhartikainen avatar jnucc avatar kathelon avatar lindyhoppergt avatar mahoukyou avatar maksymkapelianovych avatar mephiztopheles avatar michalmocarskiintermarum avatar moadib avatar mothdoctor avatar ryanjon2040 avatar sergeypdev avatar soraphis avatar sturcotte06 avatar theenbywitch avatar twevs avatar vintagedeveloper avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flowgraph's Issues

Add option to the node context menu: open node definition

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

"Handled ensure" Error On Create a new Flow Node Blueprint child from a "Flow Node" parent

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 []

Variable support in the graph, passing variables to nodes

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

  • blueprint-based variables
  • blackboard-style
  • blueprint-style, but using a method similar to @ryanjon2040 pull request: #86
  • also might take inspiration from StateTree implementation in UE5

Flow Graph solution would need to include support for UObject references.

Set up automated tests

The goal is to test stability every single night.

  • Compilation of every single branch - from UE 4.22 to UE 4.26.
  • Add -disableunity to the BuildCookRun command line and run cooking nightly.
  • Clang compilation on Windows? At least using set strict conformance mode in the automation project?

Is Input Connected function

Would be awsome to have this same function for input.
Then we can update the node description with what is actually happening with the node.
Would be rlly valuable to the readability of the flow graph.

Connected

"Add Pin" breaks if CanUserAddInput is enabled.

Steps to reproduce:

  1. Create child of FlowNode (I only tested a blueprint child)
  2. Override both "CanUserAddInput" and "CanUserAddOutput"
  3. Have both return true.

Now when you press "Add Pin" for a output pin, it'll instead create a input pin
Animation
.

Navigation breadcrumb available in editor aka "single editor mode"

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.
image

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.

Solve conflict on file names with Dungeon Architect

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."

Filter actors in World Outliner by Gameplay Tag set in the Flow Component?

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

  • Add a method to filter actors in World Outliner by Gameplay Tag.

This might not needed, if I'd choose implement task #34

Editor Crash on Flow Node BP copy & paste to another folder in the Content Browser

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

Add hard actor references

I'm using multiple flow in the streamed level with multiple instances of this level.
Because of that grouping actors by tag isn't viable for me
So I've modified the asset to accept actor bindings aka LevelSequence

Any plans on implementing this?

Here is how it looks in my project
Screenshot 2022-01-21 182639
Screenshot (5)

(Sequencer) Flow Event Track sending events to Flow Nodes - without modifying the engine

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!

image

The problem with the current implementation

  • Requires tiny engine change in order to make it work.
  • I've changed AdditionalEventReceivers in ASequenceActor to accept UObjects instead of AActors - which feels a bit dirty, now every kind of object (i.e. texture) might be assigned on Level Sequence Actor in level to this AdditionalEventReceivers array...

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

  • FlowEditorModule: registering and unregistering Flow Track Editor
  • FlowNode_PlayLevelSequence::CreatePlayer - assigning node as event receiver

Tightly integrate Asset Search with Flow Graphs

  1. Requires engine change, allowing filtering Asset Search by file types - i.e. ignoring search in materials when only need Flow Graph results.
  2. Add shortcuts and UI allowing to utilize Asset Search from the Flow Graph editor.

Add FlowNode identifier and FlowAsset update delegate

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.

Support save/load out of the box

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.

  • Mechanism for saving/loading active graphs and nodes
  • Implementing SaveGame in all nodes
  • Add method to Clean all the Flows before loading SaveGame during a game

UFlowNode::LogError should be const

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

Flow assets become dirty randomly

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

Add blackboard data in each Flowgraph asset

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

Split Flow repository into FlowGraph and FlowSamples

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.

  1. Flow plugin with the entire history of changes. Moved there issues, roadmap, wiki.
    https://github.com/MothCocoon/FlowGraph
  2. Collection of simple modules showcasing Flow-based system. In future, it would contain examples of quest systems, dialogue systems, whatever else.
    https://github.com/MothCocoon/FlowSamples

Generic multiplayer support in Flow Component?

Flow Graph design makes it easy to develop multiplayer games.

  • Made a change to allow creating Flow Subsystem on clients by default. It can be disabled by unchecking bCreateFlowSubsystemOnClients flag in Flow Settings.
  • Working on replicating tags within Flow Component: Notify Tags. Also, Identity Tags changed during gameplay.

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.

Match type option

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.

Reboot original Flow repository, make it useful Getting Started project

Originally, the Flow repository contained everything: a plugin, sample code, sample content... Code is already extracted to separate repositories

  • FlowGraph: a custom Flow Graph editor with Flow Subsystem, the actual tool
  • FlowSamples: just sample code showing how you might use this plugin in your projects
    I gonna remove the history of code from the old Flow repo. And include these to plugins as git submodules.
    This probably gonna break ability to sync already cloned/forked Flow repositories. Although there might be workarounds for users familiar with Git. Generally... a new clone/fork would be recommended.

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 ;)

Crash when creating a new node from pin

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!

Duplicate FlowAsset Problem

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.

Separate editor tab: Flow World Outliner?

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.