ブループリントエディターを使用して、レベルごとにオブジェクトを配置するシステムを作成します。 パート2:プレビューウィンドウを追加する

画像



こんにちは、私の名前はドミトリーです。 私は趣味としてアンリアルエンジンでコンピューターゲームを作っています。 したがって、今日はオブジェクトを配置するためのシステムを作成し続けます。 試した後、プレビューウィンドウを追加すると、オブジェクトの配置プロセスが高速化されると考えました。 今日はこれについてお話します



最初の部分を読んでいない場合は、これを行うことをお勧めします( 記事 )。 ここでは、スペースを節約するために変更されたコードのみを引用します。 いつものように、ソースは記事の最後にあるリンクからダウンロードできます。



まず、エディターウィンドウに別のタブ、CustAssetEditor.cppファイルを追加します。



const TSharedRef<FTabManager::FLayout> StandaloneDefaultLayout = FTabManager::NewLayout("CustomEditor_Layout_2") ->AddArea ( FTabManager::NewPrimaryArea() ->SetOrientation(Orient_Vertical) ->Split ( FTabManager::NewStack() ->SetSizeCoefficient(0.1f) ->SetHideTabWell(true) ->AddTab(GetToolbarTabId(), ETabState::OpenedTab) ) ->Split ( FTabManager::NewSplitter() ->SetOrientation(Orient_Horizontal) ->SetSizeCoefficient(0.2f) ->Split ( FTabManager::NewStack() ->SetSizeCoefficient(0.75f) ->SetHideTabWell(true) ->AddTab(FCustomEditorTabs::ViewportID, ETabState::OpenedTab) ) ->Split ( FTabManager::NewSplitter() ->SetOrientation(Orient_Vertical) ->SetSizeCoefficient(0.25f) ->Split ( FTabManager::NewStack() ->SetSizeCoefficient(0.35f) ->SetHideTabWell(true) ->AddTab(FCustomEditorTabs::DetailsID, ETabState::OpenedTab) ) ->Split ( FTabManager::NewStack() ->SetSizeCoefficient(0.65f) ->SetHideTabWell(true) ->AddTab(FCustomEditorTabs::PreviewID, ETabState::OpenedTab) ) ) ) );
      
      





重要:タブを追加または削除する場合は、レイヤーの名前を変更する必要があります。



その後、新しいPreviewViewportオブジェクトを作成します。



 TPreviewViewport = SNew(SCustomEditorViewport) .CustomEditor(SharedThis(this)) .ObjectToEdit(PropBeingEdited); class SCustomEditorViewport : public SEditorViewport//, public FGCObject { public: SLATE_BEGIN_ARGS(SCustomEditorViewport){} SLATE_ARGUMENT(TWeakPtr<FCustAssetEditor>, CustomEditor) SLATE_ARGUMENT(UMyObject*, ObjectToEdit) SLATE_END_ARGS() void Construct(const FArguments& InArgs); ~SCustomEditorViewport(); void SetParentTab(TSharedRef<SDockTab> InParentTab) { ParentTab = InParentTab; } EVisibility GetToolbarVisibility() const; FReply OnRebildScen(); FReply OnShowPropertyPreview(); void RebildScen(); protected: /** SEditorViewport interface */ virtual TSharedRef<FEditorViewportClient> MakeEditorViewportClient() override; virtual EVisibility OnGetViewportContentVisibility() const override; virtual void OnFocusViewportToSelection() override; virtual TSharedPtr<SWidget> MakeViewportToolbar() override; private: bool IsVisible() const; void DestroyActors(); FName ActorTag; TWeakPtr<FCustAssetEditor> CustomEditorPtr; UMyObject* ObjectToEdit; TWeakPtr<SDockTab> ParentTab; TSharedPtr<class FEditorViewportClient> EditorViewportClient; TSharedPtr<FPreviewScene> PreviewScene; USkyLightComponent* Skylight; UAtmosphericFogComponent* AtmosphericFog; };
      
      





ここで最も興味深いのは、MakeEditorViewportClient()メソッドです。 このメソッドは、FPreviewSceneにポインターを渡す必要があるFEditorViewportClientオブジェクトを作成します(このオブジェクトはConstructメソッドで作成されました)。 ここで、このオブジェクトを使用してワールドへのポインターを取得し、それをアクターオブジェクトの作成時に使用すると、アクターはエディターウィンドウではなくプレビューウィンドウに表示されます。



 World = PreviewScene->GetWorld(); World->SpawnActor<AStaticMeshActor>(AStaticMeshActor::StaticClass(), FVector(0, 0, 0), FRotator(0, 0, 0));
      
      





おそらくご想像のとおり、MakeViewportToolbar()メソッドでは、プレビューウィンドウのツールバーが作成されます。 ここで2つのボタンを作成しました。1つはプレビューウィンドウを更新し、もう1つはこのウィンドウのプロパティを表示します。 プレビューウィンドウのプロパティは、TestActorのプロパティに似ています。 これらのプロパティは、PreviewViewportオブジェクトには保存されません(アセットエディターが開いているときのみ存在するため)が、MyObjektオブジェクト(ファイルMyObjekt.h)に保存されます。



 UCLASS() class UCustomEditorViewportProperties : public UObject { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadWrite) TArray<FRoot> Roots; }; UCLASS(Blueprintable) class UICUSTOM_API UMyObject : public UObject { GENERATED_UCLASS_BODY() public: UPROPERTY(EditAnywhere, Category = "My Object Properties") FString Name; URootNode* FindRootFromType(ERootType RootType); UPROPERTY() UEdGraph* UpdateGraph; #if WITH_EDITORONLY_DATA UPROPERTY() UCustomEditorViewportProperties* PreviewViewportProperties; #endif // WITH_EDITORONLY_DATA };
      
      





実際、プレビューウィンドウに関してはこれですべてです。 さらに、編集の利便性を高めるため、これらのノードをダブルクリックしてノードのルールエディターを開く機能を追加しました(ルールを選択するだけです)。



 void FCustAssetEditor::OnNodeDoubleClicked(class UEdGraphNode* Node) { ((UCustomNodeBase*)Node)->DoubleClicke(); } void URuleNode::DoubleClicke() { FStreamableManager AssetLoader; TArray<FString> Name; if (Rule) { Name.Add(Rule->GetPathName()); FAssetEditorManager::Get().OpenEditorsForAssets(Name); } }
      
      





以上です。



ソースコードプロジェクトはこちらです。



All Articles