C++幼女先輩

プログラミング成分多め

何番煎じか UnitychanをUnreal 4.14で読み込む。 アニメーションステートマシン作成

はじめに

何番煎じか不明だが UnityChanモデルの読み込み 触った感じ 4.14になっても ほとんど変わってないので 本当に何番煎じか・・

前回は UnityChanが操作できるが Tポーズなので 今回は 待機モーション、ジャンプ等を作る

最低限のアニメーション設定(待機、Jump)

Unitychanのボーン情報を使ったアニメーションBluePrintの作成

f:id:murasame-labo:20161204155120p:plain

名前を BP_AnimUnitychanにしました

ThirdPersonCharacterのAnimationを 先程のBlueprintに設定 f:id:murasame-labo:20161204155226p:plain

BP_AnimUnitychanをダブルクリックし AnimGraphを開き New StateMacheneで ステートマシンを新規に作り FinalAnimationPoseに繋ぎ ステートマシンの結果が反映されるようにする f:id:murasame-labo:20161204155717p:plain

待機モーション ステートマシーン作成

ステートマシンをダブルクリックする New StateJuを選び Idleと名前をつける

Idleステートをダブルクリックし Idleを実装する

Play xx で再生するアニメーションを選ぶ 無難なのは unitychan_WAIT00 なのでとりあえずそれを。

実行すると今までTポーズだったのが 待機モーションになっている

もちろん 歩きもジャンプも実装されてないので常に待機モーション。 時々Tポーズが一瞬出るのが気になるが とりあえず待機は完成 f:id:murasame-labo:20161204162816p:plain

ジャンプ

StateMacheneにジャンプを追加 f:id:murasame-labo:20161204162707p:plain JumpStart、JumpLoop、JumpEnd の3つのステートを作成し 図のように繋ぎます この矢印の方向にしか ステートはかわらないので、矢印重要!

矢印の上の記号は、遷移するための条件を指定するもので、あとで設定します

そして JumpStart、Loop、End にアニメーションを設定したいのですが問題発生 UnityChanは その3つが分離されてないので、分離しなければなりません

CreateAnimComposite

アニメーションの部分再生を使います

コンテンツブラウザのUnityChan_Skelton右クリックし、Create->AnimationComposite できたAnimationCompositeを Unitychan_Jump00B_Start にリネーム ダブルクリックする (アニメーションモンタージュでも出来そうだが、どちら使うのがいいのかな?)

右下のAssetBrowserから unitychan_JUMP00Bを選ぶ

f:id:murasame-labo:20161204162715p:plain

タイムラインをクリックすると Detailsが出るので、StartTime EndTimeを入れる 例えばわたしは Start0.3 End0.7にしてみた f:id:murasame-labo:20161204223358p:plain

本当は ジャンプ前のしゃがみモーションや、着地時のしゃがみモーションがついているので、それも再生行いたいが 少し処理が必要になるので、後日ということで

同じく Loopは Start0.7 End0.71、 Endは Start1.0 End1.85に

f:id:murasame-labo:20161204170021p:plainf:id:murasame-labo:20161204170025p:plain

Jumpステートマシンにアニメーション設定

ステートマシンより JumpStart、JumpLoop、JumpEndをダブルクリックし、アニムグラフを表示 それぞれにCompositeを設定する 補間では出てこなかったのでその場合はAssetBrowserから引っ張ってくると良い

f:id:murasame-labo:20161204181731p:plain

ステートマシン 条件追加

このまま実行しても IdleからJumpに遷移しないため 条件追加していきます

色々なやり方あると思いますが、今回はAnimationのTickで、空中かどうかでみます おそらく、ジャンプではなく落下も考えると ジャンプボタン押したかの判定で行うようになるかもしれません

アニメーションブループリントの Variablesに bool型のIsInAir変数を作る。デフォルト値はfalseで

BluePrint作成。アニメーションブループリントのEventGraphiで、キャラが空中の場合上記フラグを立てる

f:id:murasame-labo:20161204180821p:plain

ステートマシンの、IdleからJumpStartへの遷移をダブルクリックし、 IsInAirフラグが立てば遷移するようにする

f:id:murasame-labo:20161204181101p:plain

StartからLoop、EndからIdleには、アニメーション終了したら遷移するよう 以下のBluePrintを使う f:id:murasame-labo:20161204182250p:plain

LoopからEndはとりあえず IsInAirがFalseになった時にしておこう・・・ f:id:murasame-labo:20161204183439p:plain

実行するとジャンプするが、StartとEndが繰り返されるので、StartとEndは Loopを外す

とりあえずは出来た

歩き/走り

待機モーション ピクピク対応

待機モーションが一瞬Tポーズ出るので 上記と同じように AnimationCompositを使い Wait00の頭を抜いて再生する。 例えば StartTime0.1 EndTime2.95

Idleステートマシンのモーションにそれを設定すると ピクピクがなくなる

やること

ブレンドスペース1Dを使う。 ブレンドスペース1Dは、1つのパラメータにより アニメーションを合成できる 2Dだと2つのパラメータで合成。3D以降は予定されているが未実装

今回は Speedパラメータを使い、Idle->walk->run を合成する

とりあえず慣例にしたがい Idleステートマシンを Idle/Runにリネーム

Spped

Speedパラメータを設定

アニメーションブループリントのVariableにて float型のSpeed変数作成 EventGraphにて Velocityの大きさを渡す

f:id:murasame-labo:20161204225040p:plain

BlendSpace1D

ボーンを選び Create->BlendSpace1D を選択 例えば unitychan_BS1Dという名前にした

これをダブルクリックするとBlendSpaceが開かれる 左上の DisplayEditorVerti をチェックし 画面中央右の X Axis Labelに Speedを。 Rangeは グレーマンにみならって 0-375にした Speed0に Wait0 (AnimationCompositeやMontageは指定できなかったのでTポーズが出る・・) Maxに Run、間にWalkを入る あとで画面動かしながら 確認しよう

f:id:murasame-labo:20161204231251p:plain

ステートマシンに反映

Idle/Run ステートのピンを 先程作った BlendSpaceに変更する またSpeedパラメータを渡す

f:id:murasame-labo:20161204231659p:plain

実行するとそれっぽい動作をするはず

問題点

Wait0ポーズの開始時のTポーズが出てしまう (BlendSpaceに AnimationCompositeもMontageも指定できなかった) ジャンプ着地時に動いたら滑ったようになる