UE4に便利な機能があり、簡単に実装できるので紹介します(゜-゜)
細かい説明要らない!って方は各項目の最後あたりにノードの全体図があるのでそちらをどぞ!
「持つ」!「運ぶ」!
まずはアクターの詳細から物体の物理エンジンを有効にします。
プレイヤーのブループリントにて入力イベント(何のイベントでもいいですが今回はマウスの左クリック)と
Boolean型の変数を一つ用意しました。(デフォルトでFalse)
Falseからピンを伸ばしLineTraceForObjectsに繋ぎます。
Get Player Camera Managerでカメラを取得して、カメラの位置からTrace Distanceで決めた距離までレイキャストを飛ばします。
デバッグ時はDraw Debug TypeをFor Durationにしておくとデバッグがしやすいです。
Object Typesに配列を繋ぎます。
配列を1つ増やしデフォルトでPhysicsBodyを入れておきます。
これでObject TypeがPhysicsBodyのアクターをレイキャストした時、LineTraceForObjectsのReturn ValueからTrueが返ってくるようになりました。
始めにアクターの物理エンジンを有効にしたときに勝手にObject TypeをPhysicsBodyに変えてくれてます。(正確にはCollision Presetsが変わってます。)
レイキャストが成功したら最初に作ったIs HandleをTrueにします。
そして、Break Hit Resultでレイキャストしたアクターの情報を取得します。
Is HandleからAdd Physics Handle Componentというノードに繋ぎ、コンポーネントを追加します。
これが便利なコンポーネント!
Physics Handle ComponentとHit Componentから変数に格納しておきます。後で使います。
Physics Handle Componentを格納した変数からピンを伸ばしGrab Componentノードに繋ぎます。このノードに設定したコンポーネントを持つことができます!
入力ピンに相手の情報を入れます。
Set Collision Response to Channelノードに繋ぎます。レイキャストしたオブジェクトのPawnとの衝突判定を無視するようにします。
プレイヤーのObject TypeはPawnなので、プレイヤー自身とオブジェクトが当たらないようにしてます。
全体図はこんな感じ!
次にTickノードから繋いでいきます。
オブジェクトを持っている時にオブジェクトのLocationを更新してします。
Update Handle Objectというのは作った関数です。
中身はこんな感じ~。
これで「持つ」「運ぶ」ができるようになりました!ヤッター!
「放す」 !
最初のマウスの左クリックのイベントに戻りましょう。
放すのは簡単です。
Release ComponentでPhysics Handle Componentをプレイヤーから外してオブジェクトとプレイヤーの衝突判定を直しておきます。
細かい設定
Physics Handle Componentのパラメータを弄ることによってオブジェクトを持った時のオブジェクトの挙動を調整することができます。
特に設定してないとデフォルトの値になります。
・Damping = 移動した時のブレ
・Stiffness = 修正速度
・Interpolation Speed = DampingとStiffnessの補間のスピード?間隔?
また、持つ処理の時に使っていたGrab ComponentのConstain Rotationのチェックを入れると持った時の角度を元の角度とし、オブジェクトが壁などに当たって角度が変わると、元の角度に戻ろうとします。
以上です!
Physics Handle ComponentはContentExamplesにもサンプルがありますので分からなかったらそっちのノードを見てみるとよいかもしれません!
※補足
Grab ComponentのGrab Location(持つ位置、中心点)はBreak Hit ResultのLocationではなくHit ActorからのGet Actor Locationを繋いだ方がよさそうです。
UE Version : 4.10