てんちょーの技術日誌

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

【UE4】カノ神拳【AdventCalendar13日目】

AdventCalendar13日目です。

qiita.com

カノ神拳とは

前の記事を書いてる時に発見したこのあたり

それとこの前ぼけーっと眺めてたAnswerHabのこの質問が鍵になった気がします。

モデルの四肢切断について - UE4 AnswerHub

なんて物騒な…と思ったけどこれ北斗の拳っぽいことできるんじゃねっと思って作ったのがこちら。

youtu.be

アフレコ募集中です(カノちゃんのボイス改造していれたけどしっくりこなかった

ポイント

肝となる部分はこのTransform(Modify)Boneノードだけです。

f:id:shop_0761:20151207002335p:plain

これAnimBPのAnimGraphで使うノードで、設定できるものはこちら。

f:id:shop_0761:20151207002417p:plain

単純に言えば、弄りたいBoneを選択して、各プロパティの○○Mode ->Replace Existingにすれば入力ピンで設定したものが反映されます。

あとはこんな感じで使ってあげてください。(不要なピンは消せます)

f:id:shop_0761:20151207003516p:plain

以上です!!簡単!!

実装したこと

ここからは以下に北斗の拳っぽく見えるか調整したり、さっきのノードをどうやって使ってるかを書いておきます。(余談です

今回は後々のことも考えて色々拡張できるように考えた(つもり)です。 (Scaleのことしか考えてなかったけど

まず主要になりそうなボーン19個を全てさっきと同じようにつくりました。

f:id:shop_0761:20151207003719p:plain

で、これらの変数をセットする関数がこちら。

f:id:shop_0761:20151207003901p:plain

芸術はスパゲッティだ!!

今回はこれ以上ボーンが増えないだろうと高をくくって作ってます。なのでこれもありっちゃありかなと思いました。

で、説明する前に用意した変数について説明しておきます。

ThirdPersonCharacter内部

  • DesiredScales(Vector配列) 目標のScale値を格納しておきます。
  • TargetBoneNumber(Int配列) Boneに擬似的に番号を振ってます。これでSwitchしたいからです。なのでHeadScale_14とかって変数名にしてます。14がこのBone番号です。
  • Scales(Vector配列) これがAnimBPに参照される空の配列。DesiredScalesのLengthに応じて初期化して使います。

上2つはPublicにしてあります。で、手入力です。(連想配列的な機能が欲しかった… 手入力なのでエラー対策頑張りました。それは後ほど。

で先ほどのスパゲッティを拡大すると

f:id:shop_0761:20151207004644p:plain

普通です。

そしてThirdPersonCharacterの中身へ

とりあえずの全景

f:id:shop_0761:20151207005046p:plain

右側のふつくしい感じのところはSequenceでそれぞれ5種類のボーンに対して各々Timeline+マクロで処理してます。 Timelineを使ってるのは北斗の拳って、なんか腕とか頭とか微妙なラグがあって各部位が膨れ上がる印象だったので別々にしたほうがいいかなって思ったからです。

大事なのはそのマクロの方ですね。

f:id:shop_0761:20151207005311p:plain

引数のAlphaはTimelineノードから、Indexは手入力です!! なので適切かどうか一応検知できるようにしてます。(Javaっぽいエラーメッセージにしてみた。

なんでマクロにしたかっていうと早速これで見たローカル変数のやつ取り入れたかったからです。

unrealengine.hatenablog.com

結果的に言えば出来ませんでした(多分できそう というよりこの設計がそもそもアウトな気もする

個人的な見解としては今回のマクロの仕様上、Timelineノードでそれぞれのalpha値とボーン固有のindexが絡んできてるせいでローカル変数使っても…って感じになりました。 (同じマクロ使い回しがalpha値のせいでできない)

ただいい勉強になったので、ぜひ使っていきたいところです。

あとはめげずにいい感じにアニメーションを組み合わせたり、アニメーションモンタージュのセクション名で分岐したりしてます。

多分今回BPで一番気を回したエラー処理をば

f:id:shop_0761:20151207010431p:plain

大きく分けて3つです。

f:id:shop_0761:20151207010522p:plain

最初Scalesも手動で設定するようにしてたのでさすがにまずいと思って初期化

f:id:shop_0761:20151207010637p:plain

手入力なので起こりうるミスのひとつかなと思ったもの

f:id:shop_0761:20151207010750p:plain

これが地味いい仕事します。というのもVector変数を作ると初期値(0,0,0)なのでうっかりしてるとエディタが落ちます。(2回くらい落ちた

Scaleを0にしようとすると死ぬっぽいので作りました。 コメントの英語はやっつけで書いたので文法的にあってるか分かりません。

ForEachLoopWithBreakにしてるのは始めは0を含む時点でBreakしようと思ったんですが、いくつか0があるときにそれとなく個数が分かったほうがいいなと思って直した時の なごりです。意味はありません。

このノード使ってる時に思ったことは不正な処理をした時にBreakする意味でBreak使いたい時に、

  • 問題なく全てのノード実行 (completed)
  • breakしちゃった (broke)

の検出できたらいいなとは思いました。今回はリベンジと言わんばかりにLocal変数でやりました。

おまけ

mixamoで片っ端からモーションをダウンロードしてきたのですが、その中にあった一風変わったモーションを紹介します。 やり方はこちら。

shop-0761.hatenablog.com

1つ目

最初見た時なんだかわからなかったんですけど、これbeing_carriedってモーションで誘拐されてるように見えるのは俺だけ? こんなのどこで使うんだろ…

2つ目

convulsingです。痙攣です。こわいこわい…

3つ目

administering_cprとreceiving_cprです。CPRとは

心肺蘇生法(しんぱいそせいほう、CardioPulmonary Resuscitation; CPR)は、呼吸が止まり、心臓も動いていないと見られる人の救命へのチャンスを維持するために行う循環の補助方法である。 心臓マッサージを主に行い、熟練者は呼吸の補助方法である人工呼吸も行う。 Wikipedia

だそうです。なんと限定的な…

こんな感じで特殊なモーションが眠ってます。もちろん普通のモーションもあります。歩いたり走ったりとか。 なので興味があれば見に行ってみるといいと思います。

そしてここで言っておきたいのが、

全部無表情なんですよ!!

自分でモーフターゲットを仕込もうと思ってまずは まばたき だ!とやってみると上まぶただけがびろ~んって伸びた感じにしかならず辛かったです。 もう少し勉強すればいけるかもしれませんが、本家に作って欲しいわけですよ。

なのでメールしました。 すると

とのこと。楽しみです。頑張って欲しいです。(僕はシモダさんも入れて欲しいと言ってたの聞きましたよ

2015/12/13/10:48 追記 らりほまさんのご指摘によりモーフターゲット発見しました。すいません。(単にImport時にチェック入れてなかっただけ

ただ現状なぜかカノちゃんだけモーフターゲットの頂点数が異様に少ないので調査中です。

2015/12/13/16:41 追記 らりほまさんに教えていただいた方法がこちらです。参考にしてください。

2015/12/13/19:21 追記 何故か自分の環境では上手く行かなかったので、らりほまさんのコメントを参考にお試しください。

こんな感じになるかと思います。

f:id:shop_0761:20151213192304p:plain

まとめ

明日はEpicのシモダさんの"UE4のデバッグ機能いろいろ紹介するよ!マスターしてバリバリ開発しよう!"です。

僕はこの件楽しみにしてますよシモダさん…

2015/12/23 追記 書いていただきました! ぜひこちらも qiita.com