x

Search in
Sort by:

Question Status:

Search help

  • Simple searches use one or more words. Separate the words with spaces (cat dog) to search cat,dog or both. Separate the words with plus signs (cat +dog) to search for items that may contain cat but must contain dog.
  • You can further refine your search on the search results page, where you can search by keywords, author, topic. These can be combined with each other. Examples
    • cat dog --matches anything with cat,dog or both
    • cat +dog --searches for cat +dog where dog is a mandatory term
    • cat -dog -- searches for cat excluding any result containing dog
    • [cats] —will restrict your search to results with topic named "cats"
    • [cats] [dogs] —will restrict your search to results with both topics, "cats", and "dogs"

プラグインでマテリアルの生成を行いたい

外部ファイルからマテリアル情報を読み込んでブループリントノードを自動生成し、既存のマテリアルに追加するプラグインを作成しています。 マテリアル情報とは、例えば「スペキュラー:0.5」「透明度:0.8」のような簡単なものです。

動作イメージとしては

  1. 編集対象となるマテリアルをコンテンツブラウザ内で選択状態にする

  2. プラグインを起動して外部ファイル選択(読み込み)

  3. 選択されているマテリアルに読み込んだ内容を適用(例えばスペキュラーの値が追加されるなど)

  4. 適用ボタン押下時と同じ処理でビューポート上のマテリアルも変化

といった具合になります。

そこで質問です。

現状は途中まで作成し、ブループリントのノードを自動生成して繋ぐところまではできたのですが、マテリアルエディタ上で「適用」ボタンを押すのと同じ動作をどのように実装すればよいかで行き詰まっています。(上の流れの4番が未完成)

UMaterialクラスにApply()のような関数があれば良いのですが、そのような関数もなく困っています。

現状のソースは以下のようになっています。

 // メニューがクリックされたとき
 void FImportMaterialsModule::PluginButtonClicked()
 {
     // ここで外部ファイルの内容を読み込み
     // この例では簡略化のため省いています

     // 選択されているアセットのリストを取得
     FContentBrowserModule& ContentBrowserModule =
         FModuleManager::Get().LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
     TArray<FAssetData> Assets;
     ContentBrowserModule.Get().GetSelectedAssets(Assets);

     // 選択されたアセットの数だけループ
     for (int i = 0; i < Assets.Num(); i++) {
         FAssetData& AssetData = Assets[i];
         // アセットの種類がマテリアルなら
         if (AssetData.AssetClass.Compare("Material") == 0) {
             UMaterial* Material = Cast<UMaterial>(AssetData.GetAsset());

             // ここで外部ファイルの内容をブループリントのノードとして追加する
             // この例では外部ファイルの読み込みを省いているため強制でラフネスの値を追加しています
             {
                 // 新しいエクスプレッションを生成
                 UMaterialExpressionConstant *exp =
                     NewObject<UMaterialExpressionConstant>(Material, TEXT(""));
                 exp->R = 0.3;
                 exp->Material = Material;
                 // エクスプレッションをマテリアルに割り当て
                 Material->Expressions.Add(exp);
                 Material->Roughness.Expression = exp;
             }

             // ここでマテリアルエディタの「適用」に相当する処理を記述予定
             // この処理が知りたいです!!
         }
     }
 }

分かる方がいましたら、ご教授いただけると助かります。

Product Version: UE 4.11
Tags:
more ▼

asked Jul 12 '16 at 04:10 AM in C++ Programming

avatar image

mattsun_12
1 1 2

(comments are locked)
10|2000 characters needed characters left
Viewable by all users

0 answers: sort voted first
Be the first one to answer this question
toggle preview:

Up to 5 attachments (including images) can be used with a maximum of 5.2 MB each and 5.2 MB total.

Follow this question

Once you sign in you will be able to subscribe for any updates here

Answers to this question