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

<!-- wp:paragraph -->
<p>（このブログではOculus Riftを使ってます。Vive Proを使う場合は適宜読み替えてください）</p>
<!-- /wp:paragraph -->

<p>Robo Recallみたいに銃が持ちたいので作ってみました。</p>
![VRGunTest_Moment.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/886d74d7-3645-8b51-0597-bc68702f3b40.jpeg)


[![映像はこちらから](https://www.youtube.com/watch?v=Re1gfajAze8)](https://www.youtube.com/watch?v=Re1gfajAze8)

<!-- wp:heading {"level":3} -->
<h3>軽い解説</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>最初にキューブなどを持つときの仕組みについて軽く解説を。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>GrabLeftかGrabRightが呼ばれるとBP_MotionControllerの関数GrabActorが実行されます。</p>
<!-- /wp:paragraph -->

![VRRotate - Unreal Editor 2019_10_16 21_48_52 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/297d0df5-aacd-5889-3ddb-044b8e78955c.png)


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

![VRRotate - Unreal Editor 2019_10_16 21_56_55 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/10dd9883-7e44-2483-3db6-3f6de765863c.png)

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

![VRRotate - Unreal Editor 2019_10_16 21_59_28 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/9d9b5dc4-0825-e9e4-f013-2c9bfb519d02.png)

![VRRotate - Unreal Editor 2019_10_16 21_59_32 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/a3e932aa-ae22-c804-62db-64adc902eeaa.png)

<!-- wp:paragraph -->
<p>そしてGrabActorに戻り、返り値に何らかのActorがあればそのActorが持っているPickup関数を実行します。</p>
<!-- /wp:paragraph -->

![VRRotate - Unreal Editor 2019_10_16 22_07_02 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/19a16ec8-347b-4d4c-2e80-0ca8eebf3367.png)

<!-- wp:paragraph -->
<p>Pickup関数を実行したActorは持とうとした手のBP_MotionControllerに自身をAttachします。</p>
<!-- /wp:paragraph -->
![VRRotate - Unreal Editor 2019_10_16 22_11_58 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/9743b50e-7ccd-deae-934d-05b587ec3eb9.png)

<!-- wp:heading -->
<h2>実践</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>という事でこれを組みなおしていきます。</p>
<!-- /wp:paragraph -->

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

<!-- wp:paragraph -->
<p>次にプロジェクト設定-&gt;インプットから「GrabLeft」「GrabRight」をそれぞれの「MotionController Grip 1」に変え、「UseAttachedActorLeft」「 UseAttachedActorRight」を追加します。（キーは「MotionController Trigger」）</p>
<!-- /wp:paragraph -->

![VRGunTest - Unreal Editor 2019_10_19 22_00_39 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/b793de99-2621-370a-6c2f-52854a1cde46.png)


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

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

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

![VRGunTest - Unreal Editor 2019_10_19 22_24_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/4867e615-2ba9-47a5-a5a8-9346ee63f2e3.png)


<!-- wp:paragraph -->
<p>イベントグラフを下の通りに組んでいきます。SpawnSoundAtLocationには、Pickupに「 AssaultRifle_Equip_Stereo_Cue 」、Useに「 AssaultRifle_Shot01_Stereo 」を割り当ててます。</p>
<!-- /wp:paragraph -->

![VRGunTest - Unreal Editor 2019_10_19 22_34_00 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/6dd1c8c6-a9c6-f807-e80e-54fa9974fa4b.png)
![VRGunTest - Unreal Editor 2019_10_19 22_37_00 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/c21bb33d-39a6-1beb-157d-182b23e457db.png)
![VRGunTest - Unreal Editor 2019_10_19 22_38_41 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/4878bf55-07c0-693d-75c5-5042a37db70a.png)

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

![VRGunTest - Unreal Editor 2019_10_19 22_56_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/fcb22421-52bf-1091-c725-d9c07780271b.png)


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

![VRGunTest - Unreal Editor 2019_10_19 23_03_55 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/06d68770-f979-cc38-27ea-2fb7cc9c567e.png)

<!-- wp:paragraph -->
<p>そして「ReleaseActor」を開き、MotionControllerをHandMeshに変えます。</p>
<!-- /wp:paragraph -->

![VRGunTest - Unreal Editor 2019_10_19 23_07_21 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/7dc21c65-0554-e807-fe48-569f0d20811d.png)

<p>後はUseAttachedActor関数を作ります。</p>

![VRGunTest - Unreal Editor 2019_10_19 23_10_28 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/d59cfb41-1af7-96f8-2596-157e5eea7e09.png)


<!-- wp:paragraph -->
<p>最後にMotionControllerPawnのイベントグラフに以下を足して完成です。</p>
<!-- /wp:paragraph -->

![VRGunTest - Unreal Editor 2019_10_19 23_13_07 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539108/8bf45d6f-2fb5-908c-a8d0-fd639ddeada7.png)