てんちょーの技術日誌

自分がつまづいたこととかメモ

【UE4】MotionControllerSampleを読んでみたメモ【Vive】

はじめに

おかずさんが公開しているMotionControllerSampleを読んでみたメモを 書いておきます

pafuhana1213.hatenablog.com

プロジェクトはこれ

github.com

近いうちにドキュメントを書いていただけるそうなので、個人的なメモだと思ってください

中身を読む

最初、中身は入り組んでるっぽいと思ったのですが、よく読むとオブジェクト指向な感じで出来てて勉強になるところが色々ありました

メイン

メインになるBP_PIControllerから

BP_PIController

f:id:shop_0761:20160407220351p:plain

TunrRate/LookUpRate MoveはどうやらHMDなしの時の操作の名残りみたいです

今はViveでテストするので放置されてるといったところですかね…

大事なのはこの辺ですよね

f:id:shop_0761:20160407220552p:plain

f:id:shop_0761:20160407220605p:plain

これそれぞれProjectSettingでMappingされてます

UE4ではMotion Controller ComponentがOculus touchでもつかえるらしいです

そしてViveコントローラーではGrab/Release (時々Graped)は横についてるボタンに、Use/UnUseはTriggerボタンに対応しててBooleanで右か左か渡しています

これらは全てBPIF_HandsというBPInterfaceで定義された関数を呼んでるのでそっちを見に行きます

するとBP_PIHandsの中にありました

BP_PIHands

f:id:shop_0761:20160407222545p:plain

他の

  • Release for Hands
  • Use for Hands
  • Unuse for Hands

も呼んでいる関数が違うだけでやっていることは同じなので省略します

でこのHandActorが何者かというとBP_PIHandsのHand_R(Hand_L)というChildActorComponentからSetされたものでした

f:id:shop_0761:20160407223202p:plain

でこれらのHand_R(Hand_L)はBP_PISingleHand Classからなるものです

ここに色々ありました! やっとみつけた!

BP_PISingleHand

f:id:shop_0761:20160407223545p:plain

要になりそうなTickから

f:id:shop_0761:20160407223806p:plain

PsysicsHandleを使って掴んだりするところはこちらを参考にするとスムーズかと思います

shuntaendo.hatenablog.com

UpdateDebugTextは省略して、UpdateGrabTargetにいきます

f:id:shop_0761:20160407224602p:plain

GetnearestTargetで近くのものをgetしてきてそれが今持ってるGrabTargetActorと違ったら処理をするのはいいんですがその後の処理がThen1だけでいい気がするんですが…(おかずさん教えて下さい!

2016/04/07/23:56 追記

GetnearestTargetはこれ

f:id:shop_0761:20160407225055p:plain

でもってそこで使ってるHoldTargetsはここでaddされてます

f:id:shop_0761:20160407225255p:plain

掴めるものリストを作ってる感じですね

でTickのところにあったCollisionとCollsionRootのSetWorldRotationするところはどちらか片方でもいいような気がします…(おかずさん教えてry

2016/04/08/0:00 追記

で一通り終わったのでBP_PIHandsに戻ります

BP_PIHands

ここでやっと全体図をば

f:id:shop_0761:20160407230531p:plain

init上半分から

f:id:shop_0761:20160407230649p:plain

さっきちらっとで出てきたSetChildHandActorsとInitHandsです

InitHandsはこれ

f:id:shop_0761:20160407230810p:plain

これらはどうやらBP_PISingleHandにあるのでまた行きます

BP_PISingleHand

Set Is Debug

f:id:shop_0761:20160407231013p:plain

Debug用です おわり

Set Collision Param

f:id:shop_0761:20160407231201p:plain

ここで初めて知ったのがSetBoxExtentです

これすでにあるBoxCollisionのサイズを設定できるみたいで割と便利です

で、そのCollisionのLocationをセットしていますね

Setup Grab

f:id:shop_0761:20160407231532p:plain

これは先程出てきたPhysics Handle周りの設定なのでここは省略します

BP_PIHands

戻ってきました

さっきのSequenceの続き

f:id:shop_0761:20160407231804p:plain

MotionControllerを使うかどうかの分岐でした

とりあえずメインおわりましたー

BP_GrabTargetBase

ここからは実際に掴むもののBPにはいります

BeginPlayでは僕にとって面白いことをしていました

これです

このBaseBPを継承してBPを作ると、予めイベントがbindされてるので継承先で同じ名前のイベントを作るとそっちのイベントが優先されるというプログラム的でいいなと思いました(たぶんこれで解釈あってるはず

BP_GrabTargetBase_StaticMesh

さっきのをベースに作られたStaticMeshのBPです

f:id:shop_0761:20160407233149p:plain

BeginPlay

f:id:shop_0761:20160407233321p:plain

Reset Materials

f:id:shop_0761:20160407233445p:plain

BaseEvent

f:id:shop_0761:20160407233604p:plain

ResetStaticMesh

f:id:shop_0761:20160407233735p:plain

でConstruction Script

f:id:shop_0761:20160407233953p:plain

とあまり説明する感じでもないですね…

SkeltalMeshもほぼ同様の内容でした

自分のプロジェクトで使う

2016/04/08 追記

思い出したように追記します

MotionControllerSampleフォルダを自分のプロジェクトにmigrate(移行)してきます

でそのついでにInputの設定も持って行きます

ProjectSettings->Engine->InputからExportしておきます (この時、特に何も考えず.iniファイルを保存すると、 MotionControllerSample-master\Saved\Config\Windows などに保存されるので見失わないように)

f:id:shop_0761:20160408144609p:plain

で、自分のプロジェクトでImportします

それからGameModeを持ってきたBP_GameModeに変更して、マップ上にこれらを配置します

f:id:shop_0761:20160408144937p:plain

でここにチェックいれないと上手くコントローラーが動かないので要注意

f:id:shop_0761:20160408145046p:plain

2016/04/09 追記

これで終わりかとおもいきやレベルに設置したBP_PICameraのここも設定してください(これでイベント取れなくて迷ってた

f:id:shop_0761:20160409035746p:plain

まとめ

概ねこんなところかと思います

間違ってる所があれば修正するので@shop_0761までお気軽に

ついでにViveはまだないとか、Sampleの中身見たけど読むの大変そうと思った方の役に立てばいいなと思いました