てんちょーの技術日誌

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

【UE4】AnimationStateの遷移通知を取得してみた

はじめに

今再生してるアニメーションってどうやって取得するんだろ…と思っていろいろ見てたら発見したので、書いておきます

今回扱うのはこれ

f:id:shop_0761:20160423151057p:plain

AnimNotify

アニメーション自体に通知を追加するのが一般的な気がします。

f:id:shop_0761:20160423150211p:plain

けど、これってそのアニメーションでの状態をトリガーにするのであって これを使って再生開始とか再生終わりを設定するのって結構手間な気がします。

そこで発見したのがこれ

f:id:shop_0761:20160423150827p:plain

これはトロンとカノのボスのAnimBPなんですが、各Stateを選択すると 図で言う右下のところにAnimationStateってのがあります。

ここに設定したCustomBluePrintEventを使って通知できるみたいです。

今回はすでにイベント名を入れてありますが、何も入ってない状態だとNoneになってます。

f:id:shop_0761:20160423151057p:plain

で、ここで設定したイベントはそのAnimBPのEventGraphで呼べます。

f:id:shop_0761:20160423151139p:plain

f:id:shop_0761:20160423151147p:plain

で通知できるのは3パターンあって

  • EnteredStateEvent そのStateに入ったとき(再生開始)
  • LeftStateEvent そのStateを離れるとき(再生終了)
  • FullyBlendedStateEvent (よく分かりません…知っていたら教えてほしいです…)

呼ばれる順番的にはEntered→FullyBlended→Leftでした。

追記

だそうです!

まとめ

この通知方法だとアニメーション一つ一つに再生開始、終了みたいなものを仕込まずにstateごとに設定できるので便利なんじゃないかなと思います。(資料があまり見当たらないけど…

【UE4】ビヘイビアツリーでちょっといいAIMoveToもどきを作ってみた

はじめに

ぷちコンで作ったもろもろ紹介編です

元記事

shop-0761.hatenablog.com

すでにあるAIMoveToはなんか使いにくくありませんか…

移動にかかる時間がわからないし、障害物に引っかかってもなかなか中断できないしでやや困り者です。 さらに言うなら、トロンのように空中を動き回るものには使えなかった気がします。(ただこちらはPluginがあるみたいです 

forums.unrealengine.com

なら自分で作っちゃえってことで作りました

まあ無理やりな感じなのでバッドノウハウな気がします…

作ったもの

ビヘイビアツリーではTimeLineノードが使えません。なので、使いたい場合は別のBPのイベントを呼んで、そちらで実装する必要があります。

Task側はこんなイメージです(画像はBossの攻撃分岐ですが…

f:id:shop_0761:20160422111352p:plain

これBindは1回すればいいみたいなのでこう書き換えたほうが処理的にはいいかもしれませんね(分岐の上だけ書き換えてみた

f:id:shop_0761:20160422111839p:plain

流れとしては、

  1. Event Receive Execute AI
  2. OwnerController/ControlledPawnをcast
  3. EventDispactherとbind
  4. castした変数からイベントを呼ぶ
  5. そのイベントが終わった時にEventDispactherをCallする

って感じです。ここでは4までやってます。よくあるイベントディスパッチャと同じです。

で、ビヘイビアツリーのタスクはFinish Executeを呼ばないかぎり、そのタスクが実行中になります。

それを逆手?に取ってbindしたものが呼ばれるまで他のBPのイベントの処理待ちが出来ます。

なので中断するときも同様に実装してあげれば好きなタイミングで中断させられますね。

中断はこんな感じで使ってました。

f:id:shop_0761:20160422113047p:plain

で、あとは呼び出した先で自由に処理すればいいわけです。

実装例

トロン

トロンの移動はこうなってます。

f:id:shop_0761:20160422113619p:plain

最後にEventDispactherをCallしてます。

そしてちょっと注意が必要なのがTimeLineノードでのlerpノードに使うalpha値です。ただの0から1の直線にすると変化が急すぎたりします。(特にLocationのほう)

なのでトロンの場合は最後にギュッとあげるよう調整してますが、動画にある通りなめらかに動いてくれてます。

f:id:shop_0761:20160422114115p:plain

トロンの場合は空中移動なので、歩くなどのモーションが絡んでこないため楽ですがボスのように走り回る場合は調整が大変でした。

ボス

1つのアニメーションのplayRateを書き換えることで走る速さを距離によってCurveを使って変えてました。

そのCurveはこんな感じです。縦軸がPlayRateで、横軸が目的の位置までの距離です。

f:id:shop_0761:20160422115704p:plain

移動可能な最小距離を400にしてたので微妙な位置からはじまってますね…

(デバッグ中に距離とPlayRateを出して早すぎたり遅すぎたりしたら点を追加して…みたいにつくりました)

こればっかりは自分で見て納得がいくまで調整が必要なので、歩いたり走ったりするモーションが含まれるものの調整は大変です…

メリット・デメリット

この方法のいいところはTimeLineで調整するため、LengthやPlayRateを自分で調整できて、かつ中断するのも容易です。AIMoveToでは目的地につくまでゴリゴリ進んだりすることが多いので…

そして、NavMeshBoundsVolumeが要りません。設定し忘れでハマることも減りそうです。SetActorLocationのSweepにチェックをつければ、壁にぶつかってすり抜けなくなったり、逆にすり抜けさせることも出来るかと思います。

悪いところとしては、AIController/ControlledPawnのBPに処理を書くことが多いのでビヘイビアツリーが形骸化してるようにも思います…(そしてBPが重くなる

さらに現在地のZ値と目的地のZ値が異なると、キャラクターが傾いたりするのでちょっと注意が必要です。

良くも悪くも調整するところがたくさんありますが、今回の方法のほうがTimeLineノードのようにタスクで使えないノードもあったりするので凝った処理をするなら いろいろ都合がいいのかなと思いました。

質問などがあれば@shop_0761までお願いしますー

【UE4】第5回ぷちコンに応募しました トロンとカノ編 【概要とか】

はじめに

今回は2作品応募したので、こちらも書きます

今回はこちら

www.youtube.com

もう1つのほうはこちら

shop-0761.hatenablog.com

応募時に送ったスクリーンショット

f:id:shop_0761:20160422004153p:plain

f:id:shop_0761:20160422004210p:plain

f:id:shop_0761:20160422004233p:plain

f:id:shop_0761:20160422004246p:plain

f:id:shop_0761:20160422004312p:plain

概要

今回は2人称視点+姉妹愛をテーマにしてます。1人称と3人称視点のゲームがあるならなぜ2人称はないのかと思って作り始めました。 といっても、何を持って2人称なのかははっきり決まってないみたいです。そんな時、こちらの記事を読みました。

ぺぺぺな日々 ゲームにおける二人称視点カメラってなんだ走り書き

個人的なその一例が昔スーパーファミコンで遊んだことのある「ハロー!パックマン」です。

ハロー!パックマンを知っている方がどれだけいるか分かりませんが(ほぼいない気がする)、過去にやったことがあるので個人的にはなるほどと思いました。

動画

www.youtube.com

これはあのパックマンをパチンコを使って誘導したり、アシストするといったようなプレイスタイルです。そしてパックマンの機嫌も攻略の鍵になったりします。 なので、プレイヤーの感情的には「なにやってるんだよ!!」とか「よくやった!!」とパックマンとプレイヤー間のコミュニケーションがある程度発生するので、 結構面白い試みだったんだと思って参考にしました。

作ったものはここまで濃い感じのコミュニケーションではないですが、指示を出す、アシストしてもらう、といったコミュニケーション面に目を向けてみました。

愛の方のテーマとしては、OPで原因不明でなかちゃんが倒れてしまったのでそれを助けに妹が頑張る、みたいな設定にしてみました。

ちなみにトロンはTrace OnというBASICコマンドのTRONを引っ張ってきて、"追跡する"とかいう意味で使ってます。

技術的なおはなし

今回いろいろやってみて、使えそうな感じのものは別記事にして検索しやすいように1記事1ネタみたいにしようと思ってます。 以下リスト書いておきます。他にもここどうなってるのみたいのがあれば書くので、@までお願いします。

思いついたら追記するかもです(多いなこれ…

ほかにも

  • LightはLightSource(intensity0)と多分skyLightくらいしか残ってなくて全部UnlitでEmissiveColorだった
  • 最初はVR対応を考えてたのでカノちゃん操作時は頭のスケールめっちゃ小さくしてた
  • 後ろ振り返るの面倒だから後ろ見るボタン作ってあった
  • リターゲットしても微妙なモーションがいっぱいだったからアニメーションブレンドで誤魔化した
  • 見えない床はCSVファイルで生成パターンを変えれるようにした
  • 最初の"カ…ノ…"は既存ボイスから無理やり切り出した
  • Dissolve大好きマンになって多用した
  • 壁の色が変わるやつも気に入って多用した
  • PhotoShopの体験版でLookUpTableで絵作りしようとして結果ボツにした
  • 座標から図形を割り出してみた

などなどあります。

そして今回使った素材はtextureとMesh系は全部自作しました。 ボツになったのも含めてtexture(UI用も含む)は約70点、Mesh(skeltalも含む)は約30点をクリスタとBlenderで作ってましたね…

BGMやSEは以下のサイトなどからお借りしました。ありがとうございました!!

パッケージングしたものはすでにあって公開できると思うのですが、どこにあげるのが一番いいのか分からなくて困ってます(dropBoxとかだと容量があとあと辛くなるので避けたい)

どこかいいところがあれば教えて下さい。

googleDriveにあげてみました。何かあればご連絡ください。

TronAndKano.zip - Google ドライブ

そして今回ゲームを作るにあたって友人の@Shooter_nmに色々と意見を頂きました、ありがとうございました。

【UE4】第5回ぷちコンに応募してみた LieV編

はじめに

第5回ぷちコン

historia.co.jp

HTC VivePreを頂いたので何か作らなきゃと思って作りました。

それがこれ

www.youtube.com

寝っ転がって見れるVR="ねっころVR"と勝手に命名したいです。

4日くらいで作ったので"ぷち"ですよね!!

概要

動画のとおりです。はい。何故か月を爆発させたくなりました。

目の前で見ると結構ビビりましたw

こだわったところ

まず夜空ですが、色々試した結果すでにあったSkyLightとかSkySphereが優秀だったのでそのまま使うことにしました。

あとは参考動画通りにすすめていい感じにしました。

参考

historia.co.jp

www.youtube.com

初音ミクの服はこちらのノーマルマップをお借りしています。

seiga.nicovideo.jp

これめっちゃいい感じに質感出るのでよいです!ありがとうございます!

で、こんな感じのマスクマップを書いて調整しました。

f:id:shop_0761:20160418140858p:plain

肌と髪にはContentsSampleにあったものをそのまま移植したりしてます。

モーションはこちらをお借りしてます。

seiga.nicovideo.jp

最初は作ろうとしたんですが…はい。助かりました!

一番大変だったのは呼吸音をリンクさせるところですかね。

V3を買うか一瞬迷いましたが、探していたらありました。

momolabo

よいです。

ねっころVRについて

6帖の部屋でかつ使える範囲が限られてるので死角が多くトラッキングが切れまくって、ゲロゲロ言いながらデバッグしてました。楽しいとか以前に辛かったです。多分、広いところで障害物がなければ快適かと思ってます。自分の環境だと、起き上がったり、寝っ転がるときに切れやすかったです。なので、始めから寝ている状態だと比較的安定してました。

寝っ転がれる利点としては、非常に楽です。コントローラーを持って振り回すのも疲れたら、手を置けばいいのです。動いていないのに自由に動き回れるものを作ってみたいです。

【UE4】サウンドキューで演奏してみた【小ネタ】

はじめに

今朝 

これ演奏できるじゃん…ってなったのでやってみた

youtu.be

やってみた

使っているのは1つのwaveファイルでファの音だけであとはPitchを計算してmodulatorで音を変えてます

でこのファイルだとちょっと余韻がのこる感じの音だったのでわざわざDelayかけてMixerしてます

Pitchの計算方法は

使いたい音(Hz) / 使う音(Hz)

で倍率を求めてます

たとえばファのデータでドを鳴らしたかったら

261.6255653005986 / 349.2282314330039 = 0.74915353843

とこの値をModulatorのPitchMin PitchMaxにセットしてあげれば出来ます

参考

音階と周波数の対応表

おまけ

どうやらこのやりかたで再生できる数が限られてるっぽいので(Max Concurrent Play Countを増やしても)ブッツリきられます

フルで用意したのに…

【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の中身見たけど読むの大変そうと思った方の役に立てばいいなと思いました

【UE4】VivePreが届いたのでVR Editor使ってみた

はじめに

VivePreが無事届きました!

最初の返信は5分できたので発送もすぐかなと思ったらそんなに世の中甘くなかったです。約2週間かかりました。

個人的な都合でセットアップが概ね終わったのが今日でした…

2016/03/26 現在の観測範囲で道内にこれ1台しかVivePreないっぽいです!!やったぜ!! (すでに道内で持っている方がいれば教えて下さい… 

セットアップとか

細かいセットアップについてはこちらを見ていただいたほうがいいかと思います。

pafuhana1213.hatenablog.com

一般的には三脚で固定するようなのですが、許可が降りたので穴を開けてみました。

失敗しました

でもこれかなり安定するので穴を開けても良さそうならおすすめです(間違って開けた穴は埋めましょう

そしてなんと手元のPCではHDMIではなくDisplayPortしかないので変換プラグをかましていたのですが、映らない!!(セットアップは問題なくできます

なのでこれを買いました

VivePreだけの可能性はありますが、miniDisplayport用の端子があったのでそれを使ってしのいでいます

VREditor

UE4ではVREditorが使えるようになります(現在はエンジンビルドすれば使える

www.unrealengine.com

なので今回はこれを使うところまでさらっとメモしておきます

UE4のエンジンのソースコードは全てgithubにあるので、dev-vr-editorを使ってください

参考

historia.co.jp

注意すべきは以下2点くらいです

  • パスに日本語が入らないようにする
  • ビルドエラーを回避するために削除する行がある

一つ目は当たり前ですが、よくやらかすのでメモ。日本語環境でダウンロードフォルダなどに入れてしまうとパス名に"ダウンロード"が入ってしまいビルドに失敗するので注意

だいたいドライブ直下にすればいけます

二つ目はこちらを参考にしてください

これらをやってVS上でF5を押せば起動できます

あとは見慣れたプロジェクトブラウザが開くのでプロジェクトを作成してください

新規レベルからVREditor用のレベルが作成できるのでそれを使うといいと思います

f:id:shop_0761:20160330183618p:plain

であとはこのViveを繋いでVRボタンを押せば使えます

f:id:shop_0761:20160330183627p:plain

使ってみた感想

実際に目で見てVRのサイズ感で作れるのはいいと思いました。ただ多分部屋のせいなのですが、あまり操作しやすくない印象でした。思うように動かなかったり、編集に手間取ったりしました。 現状だとゼロからレベルデザインするというよりは仕上げ段階でここはもう少しずらしたほうがいいとか、見栄えを調整するといった使い方がいいのかなって感じです。 まだまだ開発段階なのでVR内で完結するのが楽しみです。