【UE4】カノ神拳【AdventCalendar13日目】
AdventCalendar13日目です。
カノ神拳とは
前の記事を書いてる時に発見したこのあたり
@shop_0761 カノカノのギガントピストル!! pic.twitter.com/gNWhmz5Kux
— てんちょー (@shop_0761) November 26, 2015
それとこの前ぼけーっと眺めてたAnswerHabのこの質問が鍵になった気がします。
なんて物騒な…と思ったけどこれ北斗の拳っぽいことできるんじゃねっと思って作ったのがこちら。
アフレコ募集中です(カノちゃんのボイス改造していれたけどしっくりこなかった
ポイント
肝となる部分はこのTransform(Modify)Boneノードだけです。
これAnimBPのAnimGraphで使うノードで、設定できるものはこちら。
単純に言えば、弄りたいBoneを選択して、各プロパティの○○Mode ->Replace Existingにすれば入力ピンで設定したものが反映されます。
あとはこんな感じで使ってあげてください。(不要なピンは消せます)
以上です!!簡単!!
実装したこと
ここからは以下に北斗の拳っぽく見えるか調整したり、さっきのノードをどうやって使ってるかを書いておきます。(余談です
今回は後々のことも考えて色々拡張できるように考えた(つもり)です。 (Scaleのことしか考えてなかったけど
まず主要になりそうなボーン19個を全てさっきと同じようにつくりました。
で、これらの変数をセットする関数がこちら。
芸術はスパゲッティだ!!
今回はこれ以上ボーンが増えないだろうと高をくくって作ってます。なのでこれもありっちゃありかなと思いました。
で、説明する前に用意した変数について説明しておきます。
ThirdPersonCharacter内部
- DesiredScales(Vector配列) 目標のScale値を格納しておきます。
- TargetBoneNumber(Int配列) Boneに擬似的に番号を振ってます。これでSwitchしたいからです。なのでHeadScale_14とかって変数名にしてます。14がこのBone番号です。
- Scales(Vector配列) これがAnimBPに参照される空の配列。DesiredScalesのLengthに応じて初期化して使います。
上2つはPublicにしてあります。で、手入力です。(連想配列的な機能が欲しかった… 手入力なのでエラー対策頑張りました。それは後ほど。
で先ほどのスパゲッティを拡大すると
普通です。
そしてThirdPersonCharacterの中身へ
とりあえずの全景
右側のふつくしい感じのところはSequenceでそれぞれ5種類のボーンに対して各々Timeline+マクロで処理してます。 Timelineを使ってるのは北斗の拳って、なんか腕とか頭とか微妙なラグがあって各部位が膨れ上がる印象だったので別々にしたほうがいいかなって思ったからです。
大事なのはそのマクロの方ですね。
引数のAlphaはTimelineノードから、Indexは手入力です!! なので適切かどうか一応検知できるようにしてます。(Javaっぽいエラーメッセージにしてみた。
なんでマクロにしたかっていうと早速これで見たローカル変数のやつ取り入れたかったからです。
結果的に言えば出来ませんでした(多分できそう というよりこの設計がそもそもアウトな気もする
個人的な見解としては今回のマクロの仕様上、Timelineノードでそれぞれのalpha値とボーン固有のindexが絡んできてるせいでローカル変数使っても…って感じになりました。 (同じマクロ使い回しがalpha値のせいでできない)
ただいい勉強になったので、ぜひ使っていきたいところです。
あとはめげずにいい感じにアニメーションを組み合わせたり、アニメーションモンタージュのセクション名で分岐したりしてます。
多分今回BPで一番気を回したエラー処理をば
大きく分けて3つです。
最初Scalesも手動で設定するようにしてたのでさすがにまずいと思って初期化
手入力なので起こりうるミスのひとつかなと思ったもの
これが地味いい仕事します。というのもVector変数を作ると初期値(0,0,0)なのでうっかりしてるとエディタが落ちます。(2回くらい落ちた
Scaleを0にしようとすると死ぬっぽいので作りました。 コメントの英語はやっつけで書いたので文法的にあってるか分かりません。
ForEachLoopWithBreakにしてるのは始めは0を含む時点でBreakしようと思ったんですが、いくつか0があるときにそれとなく個数が分かったほうがいいなと思って直した時の なごりです。意味はありません。
このノード使ってる時に思ったことは不正な処理をした時にBreakする意味でBreak使いたい時に、
- 問題なく全てのノード実行 (completed)
- breakしちゃった (broke)
の検出できたらいいなとは思いました。今回はリベンジと言わんばかりにLocal変数でやりました。
おまけ
mixamoで片っ端からモーションをダウンロードしてきたのですが、その中にあった一風変わったモーションを紹介します。 やり方はこちら。
1つ目
最初見た時なんだかわからなかったんですけど、これbeing_carriedってモーションで誘拐されてるように見えるのは俺だけ? こんなのどこで使うんだろ…
2つ目
convulsingです。痙攣です。こわいこわい…
3つ目
administering_cprとreceiving_cprです。CPRとは
心肺蘇生法(しんぱいそせいほう、CardioPulmonary Resuscitation; CPR)は、呼吸が止まり、心臓も動いていないと見られる人の救命へのチャンスを維持するために行う循環の補助方法である。 心臓マッサージを主に行い、熟練者は呼吸の補助方法である人工呼吸も行う。 Wikipedia
だそうです。なんと限定的な…
こんな感じで特殊なモーションが眠ってます。もちろん普通のモーションもあります。歩いたり走ったりとか。 なので興味があれば見に行ってみるといいと思います。
そしてここで言っておきたいのが、
全部無表情なんですよ!!
自分でモーフターゲットを仕込もうと思ってまずは まばたき だ!とやってみると上まぶただけがびろ~んって伸びた感じにしかならず辛かったです。 もう少し勉強すればいけるかもしれませんが、本家に作って欲しいわけですよ。
なのでメールしました。 すると
中野シスターズのモーフとかについて質問してみたら、制作リソース的に厳しいけど頑張って出していきたいそうです
— てんちょー (@shop_0761) October 29, 2015
とのこと。楽しみです。頑張って欲しいです。(僕はシモダさんも入れて欲しいと言ってたの聞きましたよ
2015/12/13/10:48 追記 らりほまさんのご指摘によりモーフターゲット発見しました。すいません。(単にImport時にチェック入れてなかっただけ
ただ現状なぜかカノちゃんだけモーフターゲットの頂点数が異様に少ないので調査中です。
2015/12/13/16:41 追記 らりほまさんに教えていただいた方法がこちらです。参考にしてください。
@rarihoma おおさすがです!
不要なオブジェクトってのはエラー出てたあたりのやつですか?
— てんちょー (@shop_0761) December 13, 2015
@rarihoma 確かに顔ふたつありましたw
めっちゃ助かりました!
今さっき外出しちゃったので帰ったら試してみます!
— てんちょー (@shop_0761) December 13, 2015
2015/12/13/19:21 追記 何故か自分の環境では上手く行かなかったので、らりほまさんのコメントを参考にお試しください。
こんな感じになるかと思います。
まとめ
明日はEpicのシモダさんの"UE4のデバッグ機能いろいろ紹介するよ!マスターしてバリバリ開発しよう!"です。
僕はこの件楽しみにしてますよシモダさん…
シモダさんがグレイマンでこっち向いてくれるBPを近々公開してくれるとのことです #DCEXPO
— てんちょー (@shop_0761) October 25, 2015
2015/12/23 追記 書いていただきました! ぜひこちらも qiita.com