【UE4】鷺宮流結界術入門【AdventCalendar11日目_後編】
UE4のAdventCalendar11日目です。前編の続きです。
UE4.10で行ってます。
結界術とは
僕は少し前にサンデーで連載していた結界師という漫画が大好きです。あの結界術大好きです。(一時期ゴールデンで放送してました) 知らない方はアニメのOPのリンク貼っておくので見てみるとこれからやることのイメージ湧くと思います。
見るのが面倒な方へ簡単に説明すると、結界術とは妖を退治するときに使う異能の力のことです。動画で言う青色/緑色の透明な箱を出して、粉砕するやつ。
これ基本的に腕を下から上に振り上げたりするような動作が主なので、Leapと相性良さそうだと思いました。
実装したいこと
忘れそうなのでメモ程度に残すのでスルーしてください
- 敵の位置に透明な箱を出す サイズは敵が入るくらいの大きさ 出来れば足元に四角->立方体の順 この時手から線のようなエフェクト
- 敵と箱ごと小さく圧縮してある程度小さくなったら粉砕パーティクル
- 余裕があれば足場にできるようにしたい
- leapで方位、定礎、結、滅、解
- 敵は視線からのライントレースで位置把握
鷺宮流結界術
原作通りには行かないので鷺宮流ということにしてますw
まず、術の発動手順として、
- 方囲(ほうい) 標的指定
- 定礎(じょうそ) 位置指定
- 結(けつ) 成形・発動
- 滅(めつ)/解(かい) 滅却/解除
とそれぞれ発声しながら、右腕の動きと共に行ってます。 手元の公式ガイドブックにあったイメージ図も載せます。
細かい詳細設定を挟むとややこしくなるので、今回はこの"結"をメインに考えていきます。
実装方針としては
- 方囲と定礎はなかなか大変なので今回はまとめて処理
- 結で生成される箱は半透明。けど処理が重そうなので半透明に見えるように。
- 滅の時は盛大に爆散してほしい。(解は実装しない。)
と大きく3つに分けてみました。
またLeapの操作も簡単にしたいので、
- 手を下から上に振り上げる
- 手を右から左へ払う
の2種類で構成しました。
出来た動画はこちらから
こんなこともできます
方囲と定礎の実装
これはLineTraceを使いました。Actorの右手から射出してます。 LineTraceするz座標を無理やり一致させてます。さらに無理やり-1000倍してます。これで正面になおりましたw
次に問題になるのが、当たったActorをどうやって箱に入れるかです。 こうなってほしいわけです。
動画からスクショしました。
つまりは、LineTraceで衝突したActorに応じて、サイズを変えた箱を生成して、その中に衝突したActorを入れなければなりません。
ここで
Actorを箱に入れるのではなくて、箱を生成してそこにActorを入れよう!!
と思いついたのでやってみた。
ClearBoxBPとして作ります。 外部からこのCreateイベントを発行することで箱を生成します。
引数にSkeletalMeshを指定してます。それで差し替えに対応してます。
次にCubeのLocationを設定します。Cubeはただの立方体でサイズが1辺200cmです。これはPivotを下にずらしたかったのでBlenderの起動時に出るあの箱を持ってきてます。
Offsetを用いることで箱内部に余裕を持たせます。
残った箱のScaleですが、Cubeのもとのサイズ200cmから倍率を求めてます。ActorSizeはPublicにして外から変えられるようにしてます。 今回はMannequinしか使ってないので初期値(144, 37, 187)に設定して、そのまま使ってます。 またActorSizeのyが小さいためにscaleも小さくなりすぎるのでx,y同じ値を使ってます。(原作も正方形の面があるはず
続きです。 さっき使ったScaleのz値をMAXとしてTimelineで処理してます。で、手頃なところでSE鳴らしたかったのでこんな形になりました。
で、このイベントを発行するのはActor側(カノちゃん)でやります。
さっきのLinetraceの後です。 全部説明すると長くなりそうなので肝になるところだけ。 どうやってActorを識別するかというと、この方法を使ってます。
Actorのphysics matでSkeletalMeshを判別します。それをselectノードで分岐させてます。これなら後々拡張できそうです。
あとはskeletalMeshを差し替えるところで、HitしたActorのモデルを引数として渡した後、Destroyすることで箱に入ったように見せてます。
ClearBoxBPのマテリアル
これらを参考にしました。
もんしょの巣穴blog [UE4] とりとめのないマテリアルネタ色々
テッカテカにならないかなーと淡い期待を込めながら作ったのがこちらです。
ただもんしょさんの記事にもある通りざわざわします。けどとりあえず目をつぶります。半透明っぽければよいです。
滅の実装
基本はさっきと同じTimeline処理です。個人的なポイントとしては2つあります。
- AddRelativeLocationでz移動
- Boxes(SceneComponent)にCube(透明な箱のStaticMesh)とSkeletalMeshを入れる
です。Cubeを破壊するときに真ん中に収縮していく形にしたかったのですが、ピボットをさっきずらしてしまったのでうまくいきません。 イメージを用意しました。
Pivotの位置が違うのでこんな感じでずれてしまいます。
なら無理やりScaleが落ちるときにz方向に上昇させよう!という脳筋的解決策です。
もう一つのポイントに行く前に、まずはBPの続きをば
Boxesの中身だけDestroyしてます。するといい感じに消えてくれるしエラーも出ないしで幸せになれました。 つまりはTimelineノードは途中から中身のないもののスケールを変えてるんですね。
でここで使ってるパーティクルはInfinity Bladeから持ってきて、Textureをいじって色を揃えました。
leap側の実装
さっきまではすべて箱の話でここからはActorつまりカノちゃん側の処理です。
といっても、イベントディスパッチャー使って、手の位置とってLinetraceしてskeletalMesh差し替えてるくらいです。
手の移動イベントを持つLeapAnimBodyConnectorはこのLeapAnimBodyChildActorから拾えるので内部で作ったイベントディスパッチャーがバインドできます。
で、Leapで手の座標を取るのはこうやってみました。
こちらの記事の手の位置の取り方を見る前にこれを作ってしまった…。
なんか別のアプローチあったけど上手く行かなかったし、同じだと面白くないからこのまま行くことにした
— てんちょー (@shop_0761) November 30, 2015
で、GateとSetTimerを使って、今と1s前の手の位置を格納した変数を比較することで分岐してます。
Then0が手の上下、Then1が手の左右の移動を取るようにしてます。Then1の方はなんか反応が良くなかったので緩めにして、xyのどちらでもいいようにしてます。
これでさっきの動画みたいになるはずです。(ちょいちょい省いたところもあるけど
まとめ
先人たちは偉大でした。特にアセット買いまくってる人(褒め言葉)の記事にはお世話になりました。 思ったよりUE4のLeap記事が少ない印象だったのでネタかぶりしなくて助かりました。
これoculus touchで出来たら楽しそうだなと思ってます!!(touch欲しい
Gateの閉じ忘れと手の位置を変数に格納し忘れがちょいちょいあって唸ってたときもありました。
明日はkiruroboさんのモーキャプネタだそうです。最近は2段ジャンプとか作ったので個人的にトレンディなネタなので楽しみです。 (もうLeapはつらいから違うデバイスにしたい…)