僕の私のUnrealな日々

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

UE4:Widgetからドラッグアンドドロップでアクターをスポーンさせる

お久しぶりです

Twitterの方で制作方法を教えてくれと連絡が来ましたので、ブログに書きます。 

それが以前作ったこちらのなります。

www.youtube.com

(懐かしい・・・)

 

 

 

Widgetの内部処理はめんどいので簡易版を

youtu.be

 

 

必要なBP

FPSテンプレート

PlayerController

設置のActor

Enum

Widget

 

仕様

Widgetのボタンを押すと指定したメッシュを出すことが出来る

デリートボタンを押してメッシュをクリックすると消す

エディットボタンでメッシュの位置、角度の編集

マウスホイールで角度の調整

 

 

 

 

Widget側のBP

Widgetを作成します。

今回はボタン4つにしました。

f:id:Bussan_dayo:20170304172020p:plain

 

 

ボタンのClickMethodをPreciseClickにします。

f:id:Bussan_dayo:20170304172039p:plain

 

各ボタンのEventを作成しておきます。各ボタンのOnPressedの+を押して作成してください。

f:id:Bussan_dayo:20170304172121p:plain

 

PlayerController側の処理

今回はPlayerControllerに処理を記述しました。理由は忘れました。Character側でも大丈夫です。

 

"T"ボタンでWidgetを出します。

Widgetの変数を作成し、変数が空だった場合Widgetを作成するようにします。

f:id:Bussan_dayo:20170304172412p:plain

 

その後でWidgetが表示されていた場合、消す、非表示の場合表示する用にIsVisibleでブランチを立てておきます。

 

f:id:Bussan_dayo:20170304172514p:plain

 

表示されていなかったらWidgetのSetVisilityをVisibleに、ShowMouseをTrueに、SetInputModeGameAndUIを設置、ホ表示だった場合WidgetのSetVisilityを破壊に、ShowMouseをFalseに、SetInputModeGameOnlyノードを設置してください。

 

設置用のアクターの作成

Actorを作成します。Componentにはスタティックメッシュの設定します。

f:id:Bussan_dayo:20170304173414p:plain

 

スタティックメッシュを設定する関数を作成します。

f:id:Bussan_dayo:20170304174433p:plain

 

Controller側のブループリント

アクターをスポーンする関数を作成します。

f:id:Bussan_dayo:20170304174532p:plain

 

Inputをスタティックメッシュにして、先程作成した関数を呼び出しInputに入れます。

 

次にWidgetには設置ボタン、デリートボタン、エディットボタンを作りましたので、これらに対応するようにEnumを作成します。

f:id:Bussan_dayo:20170304175230p:plain

 

このEnumの変数をコントローラー側で作成し、関数を作成します。

f:id:Bussan_dayo:20170304175314p:plain

 

Widget側のBP

Chair、テーブルボタンのEventの後に処理を組みます。

f:id:Bussan_dayo:20170304175406p:plain

関数内のInputにはスタティックメッシュを入れます。今回は椅子とテーブルのボタンを作成したのでスターターコンテンツの椅子とテーブルを各ボタンのイベントに入れています。 

 

 

Controller側のBP

次は設置するアクターの移動させるための処理を作成します。

設置用のアクター変数が空でなかった場合の処理を組みます。

 

f:id:Bussan_dayo:20170304175537p:plain

 

この処理でマウスの座標、奥行きを取得しLineTraceで判断するようにしました。

 

そして、ものに当たった場合設置するアクターのVisibilityを変更し、SetActorLocationで位置を設定しています。(Visibilityの処理はVisibilityがFalseだった場合のみTrueにするような処理にしたほうが良いと思います。今回は割愛)

f:id:Bussan_dayo:20170304175638p:plain

 

次にマウスホイールで角度を変更したいので設置のアクター側で関数を作ります。

 

f:id:Bussan_dayo:20170304180126p:plain

 

それをマウスホイールのイベントに繋げます。

f:id:Bussan_dayo:20170304180204p:plain

 

 

次にマウスクリックを辞めた際にアクターの移動もやめたいので、以下の処理を作成します。

f:id:Bussan_dayo:20170304180001p:plain

 

これでTickの処理は動かなくなります。

 

WidgetのBP

デリートとエディットの処理を作成します。各ボタンのイベントに先程作成したSetState関数を繋げます。

f:id:Bussan_dayo:20170304210415p:plain

 

Controllerの処理

デリートの処理

Switchノードを使用しクリックした際に設置用のアクターを取得してデリートします。

f:id:Bussan_dayo:20170304210537p:plain

 

 

LineTrace関数内は以下のようになっています。Tickの処理とほとんど変わっていません。

 

f:id:Bussan_dayo:20170304210700p:plain

 

 

 

エディットの処理

LineTraceを使用して設置用のアクターだった場合、変数に取得したアクターを設定します。

f:id:Bussan_dayo:20170304210732p:plain

 

Widgetを閉じた場合、EnumをDefaultに戻します。

f:id:Bussan_dayo:20170304213706p:plain

 

 

 

 

カメラの処理

上からの視点の処理を作成します。カメラを設置してTagsにCameraと入れておきます。

f:id:Bussan_dayo:20170304210825p:plain

 

Controller側の処理

Cを押したらまずGetAllActorClassでCameraActorClassを取得してTag"Camera"のものを取得して変数化します。処理のはじめに変数でIsvalidの処理を噛ませ変数が空の場合のみ最初に変数を作成するようにします。

f:id:Bussan_dayo:20170304213337p:plain

 

そしてGetPlayerControllerからViewTargetを出し、変数とEqualだった場合、Playerのカメラに戻す、違った場合は設置したカメラに視点を映すようにします。

f:id:Bussan_dayo:20170304213513p:plain

 

 

一応、Player視点でも設置することが出来ますが、少し修正が必要です。

まずEnumにNotUIを追加します。

Widget表示の際にEnumを変更します。

f:id:Bussan_dayo:20170304213820p:plain

 

クリックをリリースした際、デリート、エディットモードではなかった場合は視点移動をOnにしたいので以下のようにしました。

f:id:Bussan_dayo:20170304214046p:plain

 

Tickの処理にあるLineTraceのActorToIgnoreにPlayerCharacterを追加しました。これでPlayerに当たった際のご動作を防ぐことが出来ます。

f:id:Bussan_dayo:20170304214206p:plain

 

 

 

PlayerCharacter側のブループリント

EnumがNotUIの場合のみにマウスの視点移動をOnにする処理にします。

以下の場合はBeginPlayでControllerの変数を作成しているのでInputイベントにてエラーが起こらないようにAndで処理を作っています。

f:id:Bussan_dayo:20170304213849p:plain

 

 

てことで過去の動画とかで何かありましたらTwitterで行ってくれれば書きます。

 

 

 

以上。