UE4:Widgetからドラッグアンドドロップでアクターをスポーンさせる
お久しぶりです
Twitterの方で制作方法を教えてくれと連絡が来ましたので、ブログに書きます。
それが以前作ったこちらのなります。
(懐かしい・・・)
Widgetの内部処理はめんどいので簡易版を
必要なBP
FPSテンプレート
PlayerController
設置のActor
仕様
Widgetのボタンを押すと指定したメッシュを出すことが出来る
デリートボタンを押してメッシュをクリックすると消す
エディットボタンでメッシュの位置、角度の編集
マウスホイールで角度の調整
Widget側のBP
Widgetを作成します。
今回はボタン4つにしました。
ボタンのClickMethodをPreciseClickにします。
各ボタンのEventを作成しておきます。各ボタンのOnPressedの+を押して作成してください。
PlayerController側の処理
今回はPlayerControllerに処理を記述しました。理由は忘れました。Character側でも大丈夫です。
"T"ボタンでWidgetを出します。
Widgetの変数を作成し、変数が空だった場合Widgetを作成するようにします。
その後でWidgetが表示されていた場合、消す、非表示の場合表示する用にIsVisibleでブランチを立てておきます。
表示されていなかったらWidgetのSetVisilityをVisibleに、ShowMouseをTrueに、SetInputModeGameAndUIを設置、ホ表示だった場合WidgetのSetVisilityを破壊に、ShowMouseをFalseに、SetInputModeGameOnlyノードを設置してください。
設置用のアクターの作成
Actorを作成します。Componentにはスタティックメッシュの設定します。
スタティックメッシュを設定する関数を作成します。
Controller側のブループリント
アクターをスポーンする関数を作成します。
Inputをスタティックメッシュにして、先程作成した関数を呼び出しInputに入れます。
次にWidgetには設置ボタン、デリートボタン、エディットボタンを作りましたので、これらに対応するようにEnumを作成します。
このEnumの変数をコントローラー側で作成し、関数を作成します。
Widget側のBP
Chair、テーブルボタンのEventの後に処理を組みます。
関数内のInputにはスタティックメッシュを入れます。今回は椅子とテーブルのボタンを作成したのでスターターコンテンツの椅子とテーブルを各ボタンのイベントに入れています。
Controller側のBP
次は設置するアクターの移動させるための処理を作成します。
設置用のアクター変数が空でなかった場合の処理を組みます。
この処理でマウスの座標、奥行きを取得しLineTraceで判断するようにしました。
そして、ものに当たった場合設置するアクターのVisibilityを変更し、SetActorLocationで位置を設定しています。(Visibilityの処理はVisibilityがFalseだった場合のみTrueにするような処理にしたほうが良いと思います。今回は割愛)
次にマウスホイールで角度を変更したいので設置のアクター側で関数を作ります。
それをマウスホイールのイベントに繋げます。
次にマウスクリックを辞めた際にアクターの移動もやめたいので、以下の処理を作成します。
これでTickの処理は動かなくなります。
WidgetのBP
デリートとエディットの処理を作成します。各ボタンのイベントに先程作成したSetState関数を繋げます。
Controllerの処理
デリートの処理
Switchノードを使用しクリックした際に設置用のアクターを取得してデリートします。
LineTrace関数内は以下のようになっています。Tickの処理とほとんど変わっていません。
エディットの処理
LineTraceを使用して設置用のアクターだった場合、変数に取得したアクターを設定します。
Widgetを閉じた場合、EnumをDefaultに戻します。
カメラの処理
上からの視点の処理を作成します。カメラを設置してTagsにCameraと入れておきます。
Controller側の処理
Cを押したらまずGetAllActorClassでCameraActorClassを取得してTag"Camera"のものを取得して変数化します。処理のはじめに変数でIsvalidの処理を噛ませ変数が空の場合のみ最初に変数を作成するようにします。
そしてGetPlayerControllerからViewTargetを出し、変数とEqualだった場合、Playerのカメラに戻す、違った場合は設置したカメラに視点を映すようにします。
一応、Player視点でも設置することが出来ますが、少し修正が必要です。
まずEnumにNotUIを追加します。
クリックをリリースした際、デリート、エディットモードではなかった場合は視点移動をOnにしたいので以下のようにしました。
Tickの処理にあるLineTraceのActorToIgnoreにPlayerCharacterを追加しました。これでPlayerに当たった際のご動作を防ぐことが出来ます。
PlayerCharacter側のブループリント
EnumがNotUIの場合のみにマウスの視点移動をOnにする処理にします。
以下の場合はBeginPlayでControllerの変数を作成しているのでInputイベントにてエラーが起こらないようにAndで処理を作っています。
てことで過去の動画とかで何かありましたらTwitterで行ってくれれば書きます。
以上。