こんにちは私の名前はドミトリーです。 私は趣味としてアンリアルエンジンでコンピューターゲームを作っています。 今日は、Unreal Engineでdxfファイルのサポートを追加する方法を説明します。 (記事の最後にいつものように情報源)。
DXFは、オートデスクが開発したオープンベクターグラフィックス形式です。 開かれているため、この形式はベクターグラフィックスの膨大な数のエディターによってサポートされています。
それでは、インポートしたファイルに関する情報を含むクラスを作成することから始めましょう。
UCLASS(BlueprintType) class DXFPLUGINRUNTIME_API UDXFSketch : public UObject { GENERATED_BODY() public: #if WITH_EDITORONLY_DATA UPROPERTY(VisibleAnywhere, Instanced, Category = ImportSettings) class UAssetImportData* AssetImportData; virtual void PostInitProperties() override; #endif
ここで、UAssetImportDataオブジェクトをクラスに追加したことに注意してください。このオブジェクトにはソースファイルに関する情報が含まれ、アセットを再インポートするために必要です。 PostInitProperties()メソッドは、このクラスのインスタンスを作成します。 FDXFLayerオブジェクトの配列には、実際にはdxfファイルからのすべての情報が含まれています。
作成されたアセットは、ファクトリクラスを作成する必要があります。
この記事で新しいアセットの作成について詳しく読んで
ください 。
UCLASS() class UDXFSketchFactory : public UFactory, public FReimportHandler { GENERATED_UCLASS_BODY()
インポートされたアセットと通常のアセットのファクトリクラスの主な違いは、FactoryCreateNewではなくFactoryCreateBinaryメソッドを使用することです。 このメソッドには、パラメーターの中でも特に、バイトの配列(インポートされたファイル)への参照と、この配列の末尾へのポインターが与えられます。
そしてもちろん、コンストラクター:
UDXFSketchFactory::UDXFSketchFactory(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { SupportedClass = UDXFSketch::StaticClass(); Formats.Add(TEXT("dxf;DXF")); bCreateNew = false; bEditorImport = true; }
ファイルを再インポートできるように、FReimportHandlerクラスも基本クラスに追加する必要があります。これにより、Reimportメソッドが追加されます。
LoadFileメソッドの目的も明確です。 ファイルを解析するための車輪を再発明しないために、私は
ribbonsoftのdxflibライブラリを使用しました。
資産がインポートされました。 ただし、インポートされたファイルの内容を理解するには、アセットのエディターを作成するとよいでしょう。 (アセットのエディターの作成について詳しくは、
こちらをご覧ください )。 前の記事を完全に再説明するのではなく、必要なタブ(この場合はデータを描画するビューポートタブとプロパティパネルのタブ)を作成するFAssetEditorToolkitから派生オブジェクトを作成する必要があると言うだけです。 プロパティパネルの作成は既に検討されています。 それでは、ビューポートについて話しましょう。
[ビューポート]タブで、SDXFEditorViewportオブジェクトを作成します
class SDXFEditorViewport : public SCompoundWidget { public: SLATE_BEGIN_ARGS(SDXFEditorViewport) { } SLATE_ARGUMENT(TWeakPtr<FDXFAssetEditor>, CustomEditor) SLATE_END_ARGS() public: void Construct( const FArguments& InArgs); TSharedPtr<FSceneViewport> GetViewport( ) const; TSharedPtr<SViewport> GetViewportWidget( ) const; TSharedPtr<SScrollBar> GetVerticalScrollBar( ) const; TSharedPtr<SScrollBar> GetHorizontalScrollBar( ) const; void UpdateScreen(); protected: TSharedRef<SWidget> GenerateViewOptionsMenu() const; private:
これはインターフェイスオブジェクトであり、すべてのインターフェイス要素(スライダーメニューなど)を作成し、さらに、実際にファイルからロードされたプリミティブが描画されるFDXFEditorViewportClientオブジェクトを作成します。
class FDXFEditorViewportClient: public FViewportClient { public: FDXFEditorViewportClient(TWeakPtr<FDXFAssetEditor> InTextureEditor, TWeakPtr<SDXFEditorViewport> InTextureEditorViewport); virtual void Draw(FViewport* Viewport, FCanvas* Canvas) override; virtual bool InputKey(FViewport* Viewport, int32 ControllerId, FKey Key, EInputEvent Event, float AmountDepressed = 1.0f, bool bGamepad = false) override; virtual UWorld* GetWorld() const override { return nullptr; } float GetViewportVerticalScrollBarRatio() const; float GetViewportHorizontalScrollBarRatio() const; void SetZoom(double ZoomValue); void ZoomIn(); void ZoomOut(); double GetZoom() const; DrawVar Vars;
実際にはエディターが作成されますが、もう少し些細なことがあります。 Unreal Engineには、サムネイルなどのコンセプトがあります。これは、アセットアイコンの代わりにコンテンツブラウザに表示される小さな画像です。 このサムネイルを作成するには、UThumbnailRendererから派生したオブジェクトを作成する必要があります。
UCLASS() class UDXFThumbnailRenderer : public UThumbnailRenderer { GENERATED_BODY()
このオブジェクトには、実際にサムネイルを描画するDrawメソッドがあります。 もちろん、このオブジェクトを作成したら、登録する必要があります。
void FDXFPluginEditor::StartupModule() {
サムネイルレンダリングはどこから来たのですか? そのような場所として、FDXFAssetEditorオブジェクトのHandleReimportManagerPostReimportメソッドを選択しました。このメソッドは、ファイルをインポートした後に実行されます。
void FDXFAssetEditor::HandleReimportManagerPostReimport(UObject* InObject, bool bSuccess) { TArray<UObject*> SelectedObjects; SelectedObjects.Add(InObject); AssetData = CastChecked<UDXFSketch>(InObject); if (bSuccess) { PropertyEditor->SetObjects(SelectedObjects); } DXFViewport->UpdateScreen(); FThumbnailRenderingInfo* RenderInfo = GUnrealEd->GetThumbnailManager()->GetRenderingInfo(AssetData); if (RenderInfo != NULL) { RenderInfo->Renderer;
しかし、インポートしたアセットを使用するにはどうすればよいですか? 残念ながら、dxfファイルをテクスチャとしてオーバーレイすると失敗します。 ただし、たとえば、ポイントをロードし、その座標を使用してオブジェクトを配置できます。 または、いわゆるSplineMeshを作成し、線に沿って引き伸ばします。 これまでのところ、プラグインはライン、閉じたパス、およびポイントを認識します(ブラシを使用してキャンバスをadobe illustratorに挿入すると、これらのポイントは10ポイントで構成されるスプラインになります)。
実際にはそれだけです。 プロジェクトをプラグインとして作成したので、プロジェクトにdxfサポートを追加するには、そのディレクトリにPluginsフォルダーを作成し、そこにDXFPluginフォルダーをドロップします。VSのプラグインソースを確認するには、古いVSプロジェクトファイルを削除して新しいものを生成する必要があります。 (プラグインの詳細については、
こちらをご覧ください )
ソースを含むプロジェクトは こちら