{"id":274559,"date":"2016-02-18T21:34:02","date_gmt":"2016-02-18T18:34:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=274559"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=274559","title":{"rendered":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 bluprint"},"content":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/0d5\/f4a\/c99\/0d5f4ac99ea848be93896fdae0531fce.png\" alt=\"image\"\/><\/p>\n<p>  \u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439. \u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0438\u0433\u0440 \u043d\u0430 Unreal Engine \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u043e\u0431\u0431\u0438. \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043f\u0440\u043e\u0434\u0446\u0435\u0434\u0443\u0440\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u041c\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u043a\u043e\u0440\u043d\u0438 \u00abroots\u00bb), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043a \u044d\u0442\u0438\u043c \u0442\u043e\u0447\u043a\u0430\u043c \u044f \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044e \u043c\u0435\u0448\u0438. \u041d\u043e \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043c\u0435\u0448 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043b\u0438\u0448 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u043e\u043d\u0430 \u0432\u0441\u0442\u0430\u043b\u0430. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0431\u0435\u0433\u0430\u0442\u044c \u0438\u0437 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0432 \u043e\u043a\u043d\u043e VS \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e. \u0418 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e-\u0431\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 bluprint, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430 \u043f\u043b\u0430\u0433\u0438\u043d Dungeon architect, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 bluprint. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0438\u0441\u0443\u043d\u043a\u0435. <br \/>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u0418\u0442\u0430\u043a \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u0430 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u044d\u0442\u0443 <a href=\"https:\/\/habrahabr.ru\/post\/274159\/\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a>). \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 AssetAction \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e OpenAssetEditor.  <\/p>\n<pre><code class=\"cpp\">void FMyObjectAssetAction::OpenAssetEditor(const TArray&lt;UObject*&gt;& InObjects, TSharedPtr&lt;class IToolkitHost&gt; EditWithinLevelEditor) { \tconst EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone; \tfor (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt) \t{ \t\tUMyObject* PropData = Cast&lt;UMyObject&gt;(*ObjIt); \t\tif (PropData) \t\t{ \t\t\tTSharedRef&lt;FCustAssetEditor&gt; NewCustEditor(new FCustAssetEditor()); \t\t\t \t\t\tNewCustEditor-&gt;InitCustAssetEditor(Mode, EditWithinLevelEditor, PropData); \t\t} \t} } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u0430 \u0442\u043e \u043e\u043a\u043d\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 FCustAssetEditor.  <\/p>\n<pre><code class=\"cpp\">class FCustAssetEditor : public FAssetEditorToolkit, public FNotifyHook { public: \t \t~FCustAssetEditor(); \t \t\/\/ IToolkit interface \tvirtual void RegisterTabSpawners(const TSharedRef&lt;class FTabManager&gt;& TabManager) override; \tvirtual void UnregisterTabSpawners(const TSharedRef&lt;class FTabManager&gt;& TabManager) override; \t\/\/ FAssetEditorToolkit \tvirtual FName GetToolkitFName() const override; \tvirtual FText GetBaseToolkitName() const override; \tvirtual FLinearColor GetWorldCentricTabColorScale() const override; \tvirtual FString GetWorldCentricTabPrefix() const override; \tvoid InitCustAssetEditor(const EToolkitMode::Type Mode, const TSharedPtr&lt; class IToolkitHost &gt;& InitToolkitHost, UMyObject* PropData); \tint N; protected:  \t \tvoid OnGraphChanged(const FEdGraphEditAction& Action); \tvoid SelectAllNodes(); \tbool CanSelectAllNodes() const; \tvoid DeleteSelectedNodes(); \tbool CanDeleteNode(class UEdGraphNode* Node); \tbool CanDeleteNodes() const; \tvoid DeleteNodes(const TArray&lt;class UEdGraphNode*&gt;& NodesToDelete); \tvoid CopySelectedNodes(); \tbool CanCopyNodes() const; \tvoid PasteNodes(); \tvoid PasteNodesHere(const FVector2D& Location); \tbool CanPasteNodes() const; \tvoid CutSelectedNodes(); \tbool CanCutNodes() const; \tvoid DuplicateNodes(); \tbool CanDuplicateNodes() const; \tvoid DeleteSelectedDuplicatableNodes(); \t \t\/** Called when the selection changes in the GraphEditor *\/ \tvoid OnSelectedNodesChanged(const TSet&lt;class UObject*&gt;& NewSelection);  \t\/** Called when a node is double clicked *\/ \tvoid OnNodeDoubleClicked(class UEdGraphNode* Node);  \tvoid ShowMessage();   \tTSharedRef&lt;class SGraphEditor&gt; CreateGraphEditorWidget(UEdGraph* InGraph); \tTSharedPtr&lt;SGraphEditor&gt; GraphEditor; \tTSharedPtr&lt;FUICommandList&gt; GraphEditorCommands; \tTSharedPtr&lt;IDetailsView&gt; PropertyEditor; \tUMyObject* PropBeingEdited; \tTSharedRef&lt;SDockTab&gt; SpawnTab_Viewport(const FSpawnTabArgs& Args); \tTSharedRef&lt;SDockTab&gt; SpawnTab_Details(const FSpawnTabArgs& Args);  \tFDelegateHandle OnGraphChangedDelegateHandle; \t \tTSharedPtr&lt;FExtender&gt; ToolbarExtender; \tTSharedPtr&lt;FUICommandList&gt; MyToolBarCommands; \tbool bGraphStateChanged; \tvoid AddToolbarExtension(FToolBarBuilder &builder); }; <\/code><\/pre>\n<p>  \u0421\u0430\u043c\u044b\u043c \u0432\u0430\u0436\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u044f\u0432\u043b\u0435\u0442\u0441\u044f InitCustAssetEditor. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043e \u0447\u0435\u043c \u043d\u0438\u0436\u0435, \u043f\u043e\u0442\u043e\u043c \u043e\u043d, \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u0432\u0435 \u043d\u043e\u0432\u044b\u0435 \u043f\u0443\u0441\u0442\u044b\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438:  <\/p>\n<pre><code class=\"cpp\">const TSharedRef&lt;FTabManager::FLayout&gt; StandaloneDefaultLayout = FTabManager::NewLayout(&quot;CustomEditor_Layout&quot;) \t\t-&gt;AddArea \t\t( \t\t\tFTabManager::NewPrimaryArea() \t\t\t-&gt;SetOrientation(Orient_Vertical) \t\t\t-&gt;Split \t\t\t( \t\t\t\tFTabManager::NewStack() \t\t\t\t-&gt;SetSizeCoefficient(0.1f) \t\t\t\t-&gt;SetHideTabWell(true) \t\t\t\t-&gt;AddTab(GetToolbarTabId(), ETabState::OpenedTab) \t\t\t) \t\t\t-&gt;Split \t\t\t( \t\t\t\tFTabManager::NewSplitter() \t\t\t\t-&gt;SetOrientation(Orient_Horizontal) \t\t\t\t-&gt;SetSizeCoefficient(0.2f) \t\t\t\t-&gt;Split \t\t\t\t(  \t\t\t\t\tFTabManager::NewStack() \t\t\t\t\t-&gt;SetSizeCoefficient(0.8f) \t\t\t\t\t-&gt;SetHideTabWell(true) \t\t\t\t\t-&gt;AddTab(FCustomEditorTabs::ViewportID, ETabState::OpenedTab)  \t\t\t\t) \t\t\t\t-&gt;Split \t\t\t\t( \t\t\t\t\tFTabManager::NewStack() \t\t\t\t\t-&gt;SetSizeCoefficient(0.2f) \t\t\t\t\t-&gt;SetHideTabWell(true) \t\t\t\t\t-&gt;AddTab(FCustomEditorTabs::DetailsID, ETabState::OpenedTab) \t\t\t\t)   \t\t\t)  \t\t); <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043b\u044e\u043f\u0440\u0438\u043d\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043d\u043e\u0434\u043e\u0432. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0447\u0435\u043c-\u0442\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u043c\u0435\u0442\u043e\u0434 RegisterTabSpawners  <\/p>\n<pre><code class=\"cpp\">void FCustAssetEditor::RegisterTabSpawners(const TSharedRef&lt;class FTabManager&gt;& TabManager) { \tWorkspaceMenuCategory = TabManager-&gt;AddLocalWorkspaceMenuCategory(FText::FromString(&quot;Custom Editor&quot;)); \tauto WorkspaceMenuCategoryRef = WorkspaceMenuCategory.ToSharedRef();  \tFAssetEditorToolkit::RegisterTabSpawners(TabManager);  \tTabManager-&gt;RegisterTabSpawner(FCustomEditorTabs::ViewportID, FOnSpawnTab::CreateSP(this, &FCustAssetEditor::SpawnTab_Viewport)) \t\t.SetDisplayName(FText::FromString(&quot;Viewport&quot;)) \t\t.SetGroup(WorkspaceMenuCategoryRef) \t\t.SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), &quot;LevelEditor.Tabs.Viewports&quot;));  \tTabManager-&gt;RegisterTabSpawner(FCustomEditorTabs::DetailsID, FOnSpawnTab::CreateSP(this, &FCustAssetEditor::SpawnTab_Details)) \t\t.SetDisplayName(FText::FromString(&quot;Details&quot;)) \t\t.SetGroup(WorkspaceMenuCategoryRef) \t\t.SetIcon(FSlateIcon(FEditorStyle::GetStyleSetName(), &quot;LevelEditor.Tabs.Details&quot;)); }  TSharedRef&lt;SDockTab&gt; FCustAssetEditor::SpawnTab_Viewport(const FSpawnTabArgs& Args) {  \treturn SNew(SDockTab) \t\t.Label(FText::FromString(&quot;Mesh Graph&quot;)) \t\t.TabColorScale(GetTabColorScale()) \t\t[ \t\t\tGraphEditor.ToSharedRef() \t\t];  }  TSharedRef&lt;SDockTab&gt; FCustAssetEditor::SpawnTab_Details(const FSpawnTabArgs& Args) { \tFPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked&lt;FPropertyEditorModule&gt;(&quot;PropertyEditor&quot;); \tconst FDetailsViewArgs DetailsViewArgs(false, false, true, FDetailsViewArgs::HideNameArea, true, this); \tTSharedRef&lt;IDetailsView&gt; PropertyEditorRef = PropertyEditorModule.CreateDetailView(DetailsViewArgs); \tPropertyEditor = PropertyEditorRef;  \t\/\/ Spawn the tab \treturn SNew(SDockTab) \t\t.Label(FText::FromString(&quot;Details&quot;)) \t\t[ \t\t\tPropertyEditorRef \t\t]; } <\/code><\/pre>\n<p>  \u041f\u0430\u043d\u0435\u043b\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043d\u0430\u043c \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f, \u0430 \u0432\u043e\u0442 bluprin \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u0439. \u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 CreateGraphEditorWidget.  <\/p>\n<pre><code class=\"cpp\">TSharedRef&lt;SGraphEditor&gt; FCustAssetEditor::CreateGraphEditorWidget(UEdGraph* InGraph) { \t\/\/ Create the appearance info \tFGraphAppearanceInfo AppearanceInfo; \tAppearanceInfo.CornerText = FText::FromString(&quot;Mesh tree Editor&quot;);  \tGraphEditorCommands = MakeShareable(new FUICommandList); \t{ \t\tGraphEditorCommands-&gt;MapAction(FGenericCommands::Get().SelectAll, \t\t\tFExecuteAction::CreateSP(this, &FCustAssetEditor::SelectAllNodes), \t\t\tFCanExecuteAction::CreateSP(this, &FCustAssetEditor::CanSelectAllNodes) \t\t\t);  \t\tGraphEditorCommands-&gt;MapAction(FGenericCommands::Get().Delete, \t\t\tFExecuteAction::CreateSP(this, &FCustAssetEditor::DeleteSelectedNodes), \t\t\tFCanExecuteAction::CreateSP(this, &FCustAssetEditor::CanDeleteNodes) \t\t\t);  \t\tGraphEditorCommands-&gt;MapAction(FGenericCommands::Get().Copy, \t\t\tFExecuteAction::CreateSP(this, &FCustAssetEditor::CopySelectedNodes), \t\t\tFCanExecuteAction::CreateSP(this, &FCustAssetEditor::CanCopyNodes) \t\t\t);  \t\tGraphEditorCommands-&gt;MapAction(FGenericCommands::Get().Paste, \t\t\tFExecuteAction::CreateSP(this, &FCustAssetEditor::PasteNodes), \t\t\tFCanExecuteAction::CreateSP(this, &FCustAssetEditor::CanPasteNodes) \t\t\t);  \t\tGraphEditorCommands-&gt;MapAction(FGenericCommands::Get().Cut, \t\t\tFExecuteAction::CreateSP(this, &FCustAssetEditor::CutSelectedNodes), \t\t\tFCanExecuteAction::CreateSP(this, &FCustAssetEditor::CanCutNodes) \t\t\t);  \t\tGraphEditorCommands-&gt;MapAction(FGenericCommands::Get().Duplicate, \t\t\tFExecuteAction::CreateSP(this, &FCustAssetEditor::DuplicateNodes), \t\t\tFCanExecuteAction::CreateSP(this, &FCustAssetEditor::CanDuplicateNodes) \t\t\t); \t\t  \t}  \tSGraphEditor::FGraphEditorEvents InEvents; \tInEvents.OnSelectionChanged = SGraphEditor::FOnSelectionChanged::CreateSP(this, &FCustAssetEditor::OnSelectedNodesChanged); \tInEvents.OnNodeDoubleClicked = FSingleNodeEvent::CreateSP(this, &FCustAssetEditor::OnNodeDoubleClicked);  \tTSharedRef&lt;SGraphEditor&gt; _GraphEditor = SNew(SGraphEditor) \t\t.AdditionalCommands(GraphEditorCommands) \t\t.Appearance(AppearanceInfo) \t\t.GraphToEdit(InGraph) \t\t.GraphEvents(InEvents) \t\t; \treturn _GraphEditor; } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0436\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f .GraphToEdit(InGraph) \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043b\u0430\u0441\u0441 UEdGraphSchema_CustomEditor  <\/p>\n<pre><code class=\"cpp\">UCLASS() class UEdGraphSchema_CustomEditor : public UEdGraphSchema { \tGENERATED_UCLASS_BODY() \t\/\/ Begin EdGraphSchema interface \tvirtual void GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const override; \tvirtual void GetContextMenuActions(const UEdGraph* CurrentGraph, const UEdGraphNode* InGraphNode, const UEdGraphPin* InGraphPin, FMenuBuilder* MenuBuilder, bool bIsDebugging) const override; \tvirtual const FPinConnectionResponse CanCreateConnection(const UEdGraphPin* A, const UEdGraphPin* B) const override; \tvirtual class FConnectionDrawingPolicy* CreateConnectionDrawingPolicy(int32 InBackLayerID, int32 InFrontLayerID, float InZoomFactor, const FSlateRect& InClippingRect, class FSlateWindowElementList& InDrawElements, class UEdGraph* InGraphObj) const override; \tvirtual FLinearColor GetPinTypeColor(const FEdGraphPinType& PinType) const override; \tvirtual bool ShouldHidePinDefaultValue(UEdGraphPin* Pin) const override; \t\/\/ End EdGraphSchema interface }; <\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 \u043a\u0430\u043a \u043f\u0443\u043d\u043a\u0442\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043d\u043e\u0434\u044b \u0438 \u0442.\u0434. \u0414\u043b\u044f \u043d\u0430\u0441 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043d\u043e\u0434. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 GetGraphContextActions.  <\/p>\n<pre><code class=\"cpp\">void UEdGraphSchema_CustomEditor::GetGraphContextActions(FGraphContextMenuBuilder& ContextMenuBuilder) const { \tFFormatNamedArguments Args; \tconst FName AttrName(&quot;Attributes&quot;); \tArgs.Add(TEXT(&quot;Attribute&quot;), FText::FromName(AttrName)); \tconst UEdGraphPin* FromPin = ContextMenuBuilder.FromPin; \tconst UEdGraph* Graph = ContextMenuBuilder.CurrentGraph; \tTArray&lt;TSharedPtr&lt;FEdGraphSchemaAction&gt; &gt; Actions;  \tCustomSchemaUtils::AddAction&lt;URootNode&gt;(TEXT(&quot;Add Root Node&quot;), TEXT(&quot;Add root node to the prop graph&quot;), Actions, ContextMenuBuilder.OwnerOfTemporaries); \tCustomSchemaUtils::AddAction&lt;UBranchNode&gt;(TEXT(&quot;Add Brunch Node&quot;), TEXT(&quot;Add brunch node to the prop graph&quot;), Actions, ContextMenuBuilder.OwnerOfTemporaries); \tCustomSchemaUtils::AddAction&lt;URuleNode&gt;(TEXT(&quot;Add Rule Node&quot;), TEXT(&quot;Add ruleh node to the prop graph&quot;), Actions, ContextMenuBuilder.OwnerOfTemporaries); \tCustomSchemaUtils::AddAction&lt;USwitcherNode&gt;(TEXT(&quot;Add Switch Node&quot;), TEXT(&quot;Add switch node to the prop graph&quot;), Actions, ContextMenuBuilder.OwnerOfTemporaries);  \tfor (TSharedPtr&lt;FEdGraphSchemaAction&gt; Action : Actions) \t{ \t\tContextMenuBuilder.AddAction(Action); \t} } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0435\u0442\u0435 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u043e\u0434\u044b \u0438\u0442\u0430\u043a \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443:<br \/>  1)\u041d\u043e\u0434\u0430 URootNode \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u0440\u0435\u043d\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0435. URootNode \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u0438\u043f\u0430 \u043a\u043e\u0440\u0435\u043d\u044c \u0438\u043c\u0435\u044e\u0442 \u0442\u0438\u043f.<br \/>  2)\u041d\u043e\u0434\u0430 UBranchNode \u044d\u0442\u0430 \u043d\u043e\u0434\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0442\u0430\u0442\u0438\u043a \u043c\u0435\u0448 (\u043f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0448\u0438, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0434\u044b \u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439)<br \/>  3)\u041d\u043e\u0434\u0430 URuleNode \u044d\u0442\u0430 \u043d\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u043b\u0438\u0431\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f. \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432 bluprint.<br \/>  4)\u041d\u043e\u0434\u0430 USwitcherNode \u044d\u0442\u0430 \u043d\u043e\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u0438\u043d \u0432\u0445\u043e\u0434 \u0438 \u0434\u0432\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u0432\u044b\u0445\u043e\u0434 \u043b\u0438\u0431\u043e \u043b\u0435\u0432\u044b\u0439.<\/p>\n<p>  \u041f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u043e\u0434\u044b \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u043e\u043d\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b. (\u0414\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043c\u0435\u0441\u0442\u0430 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0434\u043b\u044f \u043d\u0438\u0445 \u043a\u043b\u0430\u0441\u0441, \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438)  <\/p>\n<pre><code class=\"cpp\">UCLASS()  class UICUSTOM_API UCustomNodeBase : public UEdGraphNode { \tGENERATED_BODY() public: \t \tvirtual TArray&lt;UCustomNodeBase*&gt; GetChildNodes(FRandomStream& RandomStream); \tvirtual void CreateNodesMesh(UWorld* World, FName ActorTag, FRandomStream& RandomStream, FVector AbsLocation, FRotator AbsRotation); \tvirtual void PostEditChangeProperty(struct FPropertyChangedEvent& e) override;  \tTSharedPtr&lt;FNodePropertyObserver&gt; PropertyObserver; \tFVector Location; \tFRotator Rotation; \t }; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 GetChildNodes \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043a \u0435\u0451 \u0432\u044b\u0445\u043e\u0434\u0430\u043c. \u0418 \u043c\u0435\u0442\u043e\u0434 CreateNodesMesh \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043c\u0435\u0448 \u0438\u043b\u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f AbsLocation \u0438 AbsRotation. \u041c\u0435\u0442\u043e\u0434 PostEditChangeProperty \u043a\u0430\u043a \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u043e\u0434\u044b.<\/p>\n<p>  \u041d\u043e \u043a\u0430\u043a \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u043d\u043e\u0434\u044b \u043d\u0430 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u0432\u0438\u0434\u0443 \u043e\u0442 \u0442\u0435\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0432\u0438\u0434\u0435\u0442\u044c. \u041a\u0430\u043a \u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a SGraphNode. \u041a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u0437\u0434\u0435\u0441\u044c \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441.<\/p>\n<pre><code class=\"cpp\">class  SGraphNode_CustomNodeBase : public SGraphNode, public FNodePropertyObserver { public: \tSLATE_BEGIN_ARGS(SGraphNode_CustomNodeBase) { } \tSLATE_END_ARGS()  \t\/** Constructs this widget with InArgs *\/ \tvoid Construct(const FArguments& InArgs, UCustomNodeBase* InNode);  \t\/\/ SGraphNode interface \tvirtual void UpdateGraphNode() override; \tvirtual void CreatePinWidgets() override; \tvirtual void AddPin(const TSharedRef&lt;SGraphPin&gt;& PinToAdd) override; \tvirtual void CreateNodeWidget(); \t\/\/ End of SGraphNode interface  \t\/\/ FPropertyObserver interface \tvirtual void OnPropertyChanged(UEdGraphNode* Sender, const FName& PropertyName) override; \t\/\/ End of FPropertyObserver interface  protected: \tUCustomNodeBase* NodeBace; \tvirtual FSlateColor GetBorderBackgroundColor() const; \tvirtual const FSlateBrush* GetNameIcon() const; \tTSharedPtr&lt;SHorizontalBox&gt; OutputPinBox; \tFLinearColor BackgroundColor; \tTSharedPtr&lt;SOverlay&gt; NodeWiget; }; <\/code><\/pre>\n<p>  \u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 FNodePropertyObserver \u043d\u0443\u0436\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 OnPropertyChanged. \u0421\u0430\u043c\u044b\u043c \u0432\u0430\u0436\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 UpdateGraphNode \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0435\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0436\u0435\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043d\u0435\u0433\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u0432\u0438\u0436\u0434\u0435\u0442\u0430. <\/p>\n<p>  \u041f\u0440\u043e\u0448\u0443 \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 SGraphNode \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c UEdGraphNode. SGraphNode \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043d\u043e\u0434\u044b, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441 UEdGraphNode \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0430\u043c\u043e\u0439 \u043d\u043e\u0434\u044b.<\/p>\n<p>  \u041d\u043e \u0434\u0430\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0436\u043d\u0438\u0439 \u0432\u0438\u0434. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u0432\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u0432 \u0441\u0438\u043b\u0443, \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0413\u0434\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u044f:  <\/p>\n<pre><code class=\"cpp\">void FUICustomEditorModule::StartupModule() { \t\/\/Registrate asset actions for MyObject \tFMyObjectAssetAction::RegistrateCustomPartAssetType();  \t\/\/Registrate detail pannel costamization for TestActor \tFMyClassDetails::RegestrateCostumization();  \t\/\/ Register custom graph nodes \tTSharedPtr&lt;FGraphPanelNodeFactory&gt; GraphPanelNodeFactory = MakeShareable(new FGraphPanelNodeFactory_Custom); \tFEdGraphUtilities::RegisterVisualNodeFactory(GraphPanelNodeFactory);  \t\/\/Registrate ToolBarCommand for costom graph \tFToolBarCommandsCommands::Register();  \t\/\/Create pool for icon wich show on costom nodes \tFCustomEditorThumbnailPool::Create(); } <\/code><\/pre>\n<p>  \u0425\u043e\u0447\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043e\u043a \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u043e\u0434\u0430\u0445 UBranchNode. \u0420\u0435\u0433\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 CreateNode \u043a\u043b\u0430\u0441\u0441\u0430 FGraphPanelNodeFactory_Custom.  <\/p>\n<pre><code class=\"cpp\">TSharedPtr&lt;class SGraphNode&gt; FGraphPanelNodeFactory_Custom::CreateNode(UEdGraphNode* Node) const { \tif (URootNode* RootNode = Cast&lt;URootNode&gt;(Node)) \t{ \t\tTSharedPtr&lt;SGraphNode_Root&gt; SNode = SNew(SGraphNode_Root, RootNode); \t\tRootNode-&gt;PropertyObserver = SNode; \t\treturn SNode; \t} \telse if (UBranchNode* BranchNode = Cast&lt;UBranchNode&gt;(Node)) \t{ \t\tTSharedPtr&lt;SGraphNode_Brunch&gt; SNode = SNew(SGraphNode_Brunch, BranchNode); \t\tBranchNode-&gt;PropertyObserver = SNode; \t\treturn SNode; \t} \telse if (URuleNode* RuleNode = Cast&lt;URuleNode&gt;(Node)) \t{ \t\tTSharedPtr&lt;SGraphNode_Rule&gt; SNode = SNew(SGraphNode_Rule, RuleNode); \t\tRuleNode-&gt;PropertyObserver = SNode; \t\treturn SNode; \t} \telse if (USwitcherNode* SwitcherNode = Cast&lt;USwitcherNode&gt;(Node)) \t{ \t\tTSharedPtr&lt;SGraphNode_Switcher&gt; SNode = SNew(SGraphNode_Switcher, SwitcherNode); \t\tSwitcherNode-&gt;PropertyObserver = SNode; \t\treturn SNode; \t} \treturn NULL; } <\/code><\/pre>\n<p>  \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 TestActor.  <\/p>\n<pre><code class=\"cpp\">bool  ATestAct::GenerateMeshes() { \tFRandomStream  RandomStream = FRandomStream(10); \t \t \tif (!MyObject) \t{ \t\treturn false; \t} \tfor (int i = 0; i &lt; Roots.Num(); i++) \t{ \t\tURootNode* RootBuf;  \t\tRootBuf = MyObject-&gt;FindRootFromType(Roots[i].RootType); \t\tif (RootBuf) \t\t{ \t\t\t \t\t\tRootBuf-&gt;Location = Roots[i].Location; \t\t\tRootBuf-&gt;CreateNodesMesh(GetWorld(), ActorTag, RandomStream, FVector(0, 0, 0), FRotator(0, 0, 0)); \t\t} \t} \treturn true; } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0435\u0440\u0435\u0431\u0435\u0440\u0435\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b root, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0435\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0439 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438 \u0442\u0438\u043f\u043e\u043c. \u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u044b \u0438\u0449\u0435\u043c \u0432 \u0433\u0440\u0430\u0444\u0435 \u043d\u043e\u0434\u0443 URootNode c \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0442\u0438\u043f\u043e\u043c. \u041d\u0430\u0439\u0434\u044f \u0435\u0451 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0435\u0439 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 CreateNodesMesh \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0441\u044c \u0433\u0440\u0430\u0444. \u0414\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b root \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0442 \u0438 \u0432\u0441\u0435. \u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438.<\/p>\n<p>  <b>\u041f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c<\/b> <a href=\"https:\/\/cloud.mail.ru\/public\/GLLi\/kCGwR9HuT\">\u0437\u0434\u0435\u0441\u044c<\/a><\/p>\n<p>  \u0410 \u044f \u043f\u043e\u043a\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043a\u0430\u043a \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u043e. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 TestActor, \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0432 \u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u0438\u043f\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 root (\u0430 \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0447\u0435\u0431\u043d\u044b\u0439). <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/e79\/bed\/b76\/e79bedb76655482980c98fa2000eed8a.png\" alt=\"image\"\/><br \/>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0444\u0430\u0439\u043b MyObject, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0448\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b.<\/p>\n<p>  \u0418\u0442\u0430\u043a \u043a\u0430\u043a-\u0436\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u043d\u043e\u0434\u044b rule \u0438 switcher. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043f\u043b\u044e\u0441\u0438\u043a \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0431\u043b\u044e\u043f\u0440\u0438\u043d\u0442. <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3d3\/0a1\/9ef\/3d30a19ef68b425d97f50e76f0e0729c.png\" alt=\"image\"\/><br \/>  \u041d\u043e \u043e\u043d \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u044b\u043c \u0447\u0442\u043e-\u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435? \u041d\u0443\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c Override NodeBool.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d73\/a94\/efe\/d73a94efe312433a90f24d4e721eea5e.png\" alt=\"image\"\/><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043d\u043e\u0434\u0443. <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/f7a\/2ff\/8a3\/f7a2ff8a3b8a45cd931b77a2a9da081a.png\" alt=\"image\"\/><br \/>  \u0412\u0441\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438 \u0434\u043b\u044f switchera. \u0423 \u043d\u043e\u0434\u044b Brunch \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u044b\u0445\u043e\u0434, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0435\u0441\u043b\u0438 \u043a \u043d\u0435\u0439 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e Brunch \u0442\u043e \u043e\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 Generate Meshes \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 TestActor, \u0438 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c. <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/e17\/7c5\/e71\/e177c5e7140f478e86f826cb1dca01d1.png\" alt=\"image\"\/><\/p>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f. \u041e\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u0435\u0439 \u0447\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435, \u0431\u043e\u044f\u043b\u0441\u044f \u0447\u0442\u043e \u043d\u0435 \u0434\u043e\u043f\u0438\u0448\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/277515\/\"> https:\/\/habrahabr.ru\/post\/277515\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/0d5\/f4a\/c99\/0d5f4ac99ea848be93896fdae0531fce.png\" alt=\"image\"\/><\/p>\n<p>  \u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439. \u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0438\u0433\u0440 \u043d\u0430 Unreal Engine \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u043e\u0431\u0431\u0438. \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043f\u0440\u043e\u0434\u0446\u0435\u0434\u0443\u0440\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u041c\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u043a\u043e\u0440\u043d\u0438 \u00abroots\u00bb), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043a \u044d\u0442\u0438\u043c \u0442\u043e\u0447\u043a\u0430\u043c \u044f \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044e \u043c\u0435\u0448\u0438. \u041d\u043e \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043c\u0435\u0448 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043b\u0438\u0448 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u043e\u043d\u0430 \u0432\u0441\u0442\u0430\u043b\u0430. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0431\u0435\u0433\u0430\u0442\u044c \u0438\u0437 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0432 \u043e\u043a\u043d\u043e VS \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e. \u0418 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e-\u0431\u044b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 bluprint, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430 \u043f\u043b\u0430\u0433\u0438\u043d Dungeon architect, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 bluprint. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0438\u0441\u0443\u043d\u043a\u0435.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-274559","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/274559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=274559"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/274559\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=274559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=274559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=274559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}