Создание системы расстановки объектов по уровню при помощи редактора blueprint. Часть 2: добавление окна пред просмотра

от автора

image
Здравствуйте, меня зовут Дмитрий. Я занимаюсь созданием компьютерных игр на Unreal Engine в качестве хобби. Итак сегодня я продолжу создание системы расстановки объектов. После того как я её сделал я подумал, что добавление окна пред просмотра позволит ускорить процесс расстановки объектов. Об этом я сегодня и расскажу.

Если вы не читали первую часть то рекомендую сделать это (статья). Здесь я буду приводить только код который был измене, для экономии места. Исходники как всегда можно скачать в конце статьи.

Сначала нужно добавить ещё одну вкладку в окно редактора файл 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(). В этом методе создается объект FEditorViewportClient которому нужно передать указатель на FPreviewScene (этот объект создан в методе Construct). Теперь если получить указатель на мир при помощи этого объекта, а потом использовать его при создании объекта Actor. То Actor появится не в окне редактора а в окне пред просмотра.

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

В методе MakeViewportToolbar() как вы наверно догадались создается панель инструментов окна пред просмотра. Здесь я создал две кнопки одна обновляет окно пред просмотра. А другая отображает свойства этого окна. Свойства окна пред просмотра аналогичны свойствам 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);  	}  } 

На этом все.

Проект с исходным кодом здесь

ссылка на оригинал статьи https://habrahabr.ru/post/278491/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *