僕の私のUnrealな日々

UE4のBluePrintを使って小さなギミックを作ったりしてます。ブログを通じて情報共有ができたらなと思います。

UE4:ドラッグアンドドロップでマテリアルを変えるブループリントの実装

 

f:id:Bussan_dayo:20160612205047p:plain

 

以前こういったものを作りまして

www.youtube.com

 

 

配布すると書いておきながら、ノードが汚くそのまま配布するのも嫌だなと思って一週間以上が立ってます。

 

その中の処理の一個で一個ドラッグアンドドロップでマテリアルを変えるものを作ったのですが思ったより簡単に実装できたので記事にします。

 

 

動画での手法はデータテーブルにマテリアルデータとテクスチャーを入れて、テーブルに存在する分Widget上のスクロールボックスにボタンのWidgetを配置していく手法なのですが、この処理をブログに書くのはちょっとアレなので簡易版を作成しました。

f:id:Bussan_dayo:20160612180330p:plain

 

 

 

 

ドラッグアンドドロップでマテリアルを変えよう!

 

 

 

 

Pawn側のBlueprint

Pawnを作成します。

f:id:Bussan_dayo:20160612173617p:plain

 

親クラスをDefaultPawnにしました。

f:id:Bussan_dayo:20160612173645p:plain

 

 

 

GameModeのBPを作成しました。ここに先ほど作ったPawnをDefaultPawnClassに設定します。

 

f:id:Bussan_dayo:20160612173725p:plain

 

 

Pawn上のブループリントグラフにてマウスの表示とイベントが発生できるようにしました。

f:id:Bussan_dayo:20160612175532p:plain

 

 

Widgetのブループリント

Widgetを作成します。普通にボタンを表示しただけとなります。

f:id:Bussan_dayo:20160612175633p:plain

 

ボタンの設定を変更します。

ClickMethodをPreciseClickにしました。カーソルがボタンに合わさった時にカーソルの種類がGrabHandに変わるようにも設定しました。

 

f:id:Bussan_dayo:20160612175810p:plain

 

Widgetグラフ上でボタンをプレスした場合とリリースした場合のイベントノードを設置しました。

f:id:Bussan_dayo:20160612175945p:plain

 

マテリアル型の変数を作成します。ボタンを押したらBoolean型をTrueにしマテリアルの変数にマテリアルを設定します。リリースしたらBoolean型をFaulseにします。

f:id:Bussan_dayo:20160612180018p:plain

 

BlueprintInterface

WidgetとPawnを通信するためにBlueprintInterfaceを作成します(書いている時に気が付きましたが、普通にカスタムイベントでも行ける気がしますね!)

 

インプットにBoolean型の変数を設定しました。これでクリックしているかどうかを判別します。

f:id:Bussan_dayo:20160612180626p:plain

 

Widgetのブループリント

BluePrintInterfaceをWidgetに設定した後、作成したイベントを設置します。Branchで枝分けしてFalseだった場合先ほど作成したBoolean型の変数をFalseにします。

 

f:id:Bussan_dayo:20160612180836p:plain

 

Pawnのブループリント

先ほどマウスを設定したノード構成の後ろにWidgetを作成しViewPortするノードを加えます。これでWidgetが反映されます。

f:id:Bussan_dayo:20160612180934p:plain

 

アクションインプットからFireを出し、以下のように設定します。

f:id:Bussan_dayo:20160612181035p:plain

 

ブループリントインターフェース

マテリアル情報をWidget側とPawn側で通信するためにブループリントインターフェースを作成します。

f:id:Bussan_dayo:20160612181156p:plain

 

Pawnのブループリント

ブループリントインターフェースを設定します。

f:id:Bussan_dayo:20160612181431p:plain

 

Widgetのブループリント

作成したブループリントインターフェースの関数を出します。GetPlayerPawnから関数を出します。そしてマテリアルのインプットにはWidget上で作成した変数を入れておきます。

f:id:Bussan_dayo:20160612181225p:plain

 

 

Pawnのブループリント

f:id:Bussan_dayo:20160612181519p:plain

BPインターフェース上で作成したイベントを設置します。Pawn側でもMaterial型の変数を作成し繋げます。

 

これでボタンを押した時にPawnにMaterial情報が行くようになりました。

 

マウスをリリースした後にカーソルの下にあるオブジェクトのマテリアルを変えたいのでリリースの処理の後にノードを組んでいきます。

 

Isvalidでマテリアルの変数の中身が入っているかを判別します。入っていない場合は処理が何も起こらないようにしないとエラーが起こりがちとなります。

f:id:Bussan_dayo:20160612181848p:plain

 

 

リリースした後にマウス下のメッシュを取得します。BreakHitResultで取得したメッシュをターゲットとしたSetMaterialノードを設置します。

f:id:Bussan_dayo:20160612181920p:plain

 

ドラッグアンドドロップで持って行きたいのでマテリアルをセットした後にマテリアル変数の中身を空にします。

f:id:Bussan_dayo:20160612204825p:plain

 

最後にクリックした後にSetInputModeGameAndUIノードを設置すれば完成です。

 

f:id:Bussan_dayo:20160612211855p:plain

 

他の手法もあったら是非教えて下さい。

以上です。

 

 

 

告知

 

何かしら形にして配布するのでよろしくお願いします。