LoginSignup
2
2

More than 3 years have passed since last update.

[UE4]VRで銃を持ったり撃ったり

Posted at

(このブログではOculus Riftを使ってます。Vive Proを使う場合は適宜読み替えてください)

Robo Recallみたいに銃が持ちたいので作ってみました。

VRGunTest_Moment.jpg

映像はこちらから

軽い解説

最初にキューブなどを持つときの仕組みについて軽く解説を。

GrabLeftかGrabRightが呼ばれるとBP_MotionControllerの関数GrabActorが実行されます。

VRRotate - Unreal Editor 2019_10_16 21_48_52 (2).png

今回の解説で重要な所だけ抜き出すと、GrabActorはまず初めにBP_MotionControllerの周りに掴めるものがないか調べるためにGetActorNearHandという関数を呼びます。

VRRotate - Unreal Editor 2019_10_16 21_56_55 (2).png

GetActorNearHandは「GrabSphereにOverlapしている」Actorの中から、「PickUpInterfaceが実装されている」かつ「(GrabSphereとそのActorの距離)<(NearestOverlap)」を満たすActorを選別し、GrabSphereから一番近いところにある条件を満たしたActorを返します。

VRRotate - Unreal Editor 2019_10_16 21_59_28 (2).png

VRRotate - Unreal Editor 2019_10_16 21_59_32 (2).png

そしてGrabActorに戻り、返り値に何らかのActorがあればそのActorが持っているPickup関数を実行します。

VRRotate - Unreal Editor 2019_10_16 22_07_02 (2).png

Pickup関数を実行したActorは持とうとした手のBP_MotionControllerに自身をAttachします。

VRRotate - Unreal Editor 2019_10_16 22_11_58 (2).png

実践

という事でこれを組みなおしていきます。

まずはラーニングにある「シューターゲーム」から、Weaponsフォルダにある「Rifle」、Sounds->Weapon_AssaultRifleにある「AssaultRifle_Equip_Stereo_Cue」、「AssaultRifle_Shot01_Stereo」をインポートしてきます。

次にプロジェクト設定->インプットから「GrabLeft」「GrabRight」をそれぞれの「MotionController Grip 1」に変え、「UseAttachedActorLeft」「 UseAttachedActorRight」を追加します。(キーは「MotionController Trigger」)

VRGunTest - Unreal Editor 2019_10_19 22_00_39 (2).png

次に「Rifle」に物理アセットを追加します。アセットを右クリックして作成する->物理アセット->作成と割り当てを選び、Primitive TypeをSingle Convex Hullに変えて「アセットを作成」を選びます。後は特にいじらなくても大丈夫です。

後はPickupActorInterfaceにUseという関数を1つ足します。インプットやアウトプットはいりません。Pickup関数にインプットを一つ足し、名前を「SocketName」、変数を「名前(Name)」にします。

次に銃のActorを作っていきます。クラスは「SkeletalMeshActor」、名前はここでは「BP_PickGun」とします。作成したら開き、「SkeletalMeshComponent」に先ほどインポートした「Rifle」を、クラス設定->インターフェイスにPickupActorInterfaceを追加します。続いてコンポーネントタブから「SkeletalMeshComponent」を選び、Simulate PhysicsとGenerate Overlap Eventsをオンにして一度コンパイルします。

VRGunTest - Unreal Editor 2019_10_19 22_24_49.png

イベントグラフを下の通りに組んでいきます。SpawnSoundAtLocationには、Pickupに「 AssaultRifle_Equip_Stereo_Cue 」、Useに「 AssaultRifle_Shot01_Stereo 」を割り当ててます。

VRGunTest - Unreal Editor 2019_10_19 22_34_00 (2).png
VRGunTest - Unreal Editor 2019_10_19 22_37_00 (2).png
VRGunTest - Unreal Editor 2019_10_19 22_38_41 (2).png

次に「MannequinHand_Right_Skeleton」にソケットを追加していきます。UE4のVRテンプレートでは右手のスケルトンだけ用意し、左手をスポーンする時はZ軸に-1.0をかけて反転しています。そのため右手のスケルトンに右手・左手のソケットを追加します。ソケットの位置はそれぞれで調整してください。左手のソケットは特別な調整をしないのなら、右手のソケットをコピペしてRelative RotationのYに180を足し、Relative ScaleのZに-1.0を入れると簡単に作れます。ここで追加したSocketの名前は後で使うのでメモ帳にでもコピーしとくと後が楽です。

VRGunTest - Unreal Editor 2019_10_19 22_56_00.png

次に「BP_MotionController」を少しいじります。GrabActor関数を開き、Pickup関数の周りを下のようにします。「選択」に先ほど作ったソケットの名前を、False->(右手のソケット名)、True->(左手のソケット名)、という風に入れます。

VRGunTest - Unreal Editor 2019_10_19 23_03_55 (2).png

そして「ReleaseActor」を開き、MotionControllerをHandMeshに変えます。

VRGunTest - Unreal Editor 2019_10_19 23_07_21 (2).png

後はUseAttachedActor関数を作ります。

VRGunTest - Unreal Editor 2019_10_19 23_10_28 (2).png

最後にMotionControllerPawnのイベントグラフに以下を足して完成です。

VRGunTest - Unreal Editor 2019_10_19 23_13_07 (2).png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2