外部ファイルからマテリアル情報を読み込んでブループリントノードを自動生成し、既存のマテリアルに追加するプラグインを作成しています。
マテリアル情報とは、例えば「スペキュラー:0.5」「透明度:0.8」のような簡単なものです。
動作イメージとしては
- 編集対象となるマテリアルをコンテンツブラウザ内で選択状態にする
- プラグインを起動して外部ファイル選択(読み込み)
- 選択されているマテリアルに読み込んだ内容を適用(例えばスペキュラーの値が追加されるなど)
- 適用ボタン押下時と同じ処理でビューポート上のマテリアルも変化
といった具合になります。
そこで質問です。
現状は途中まで作成し、ブループリントのノードを自動生成して繋ぐところまではできたのですが、マテリアルエディタ上で「適用」ボタンを押すのと同じ動作をどのように実装すればよいかで行き詰まっています。(上の流れの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;
}
// ここでマテリアルエディタの「適用」に相当する処理を記述予定
// この処理が知りたいです!!
}
}
}
分かる方がいましたら、ご教授いただけると助かります。