Unityのアニメーション制御

モーションをフェードしながら再生している場合、再生が終了したかどうかの判定が難しい。

例えば、攻撃モーションが1.0f(終了)になったら歩きモーションに戻したいとする。
となると
if(this.AnimTime > 0.99f)
こんな風にしたいのだが・・・
アニメーションの再生時間を監視してみると

歩きモーション時間 n.7f

の時攻撃モーションへ移行しようとすると、アニメーションをブレンドしながら攻撃に移るためか、まず歩きが

0.7f→1.0f (%1.0f)

となった後に、攻撃モーションの時間が

0.3f→1.0f (0.3fは歩きの時間で既に進んでいる)

というように移動していく。
つまり、上のif(this.AnimTime > 0.99f)の判定に歩きの段階で入ってしまい、モーションがすぐに移行してしまう。

もう一つ、ループアニメーションでもないのにnormalizedTimeの値が増え続けるのはおかしいだろうと思いました。
レファレンスには
 AnimatorStateInfo.normalizedTime
 ステートの正規化された時間
 整数部分は、ステートのループ回数です。少数部分は現在のループでの位置を % (0-1) で示します。
http://docs.unity3d.com/jp/current/ScriptReference/AnimatorStateInfo-normalizedTime.html

とある。
これの文章からするとループしなければ整数部は増えなそうなのに・・なんでやねん!

で、結局たどり着いたのはイベントと、今まで使っていた方法である再生時間を自前で操作して制御する方法の二つ。

前者は自動で呼ばれるためとっても簡単
例えば終了時に設定しておけば勝手にしかるべき処理をする。

一方で後者はアニメーション時間をすべて把握している必要があり、扱いが困難(実際前作はこれだったけど死ぬほど面倒でした)
もしアニメーションの総時間をスクリプトから取得をしようにも、上記のブレンドのせいでなんの総時間が帰ってくるかまったく保障できない。
ただ一方で、長所もある。
前者はある1点にイベントを設置するのに対して、こちらはアニメーション再生時間を範囲で指定することができる。
たとえば走り出して少しの間(0.0f-0.2f)は移動速度が遅い、とか。

他にも平行してプレイヤーの行動を作り込んでます。

正直、簡単にゲームができちゃいそうな雰囲気がUnityの嫌いなところだったけど、作り込もうとすると途端にディープで好みなエンジンになった。
やっぱりプログラム書いてるときが一番楽しい。

テーマ : ゲーム - ジャンル : ゲーム

comments

comment form

管理者にだけ表示を許可する

trackback


この記事にトラックバックする(FC2ブログユーザー)

リンク
報告
20150405 新カテゴリ追加
月別アーカイブ