アニメーションチームはUnity5.0のために新しい機能を実装しています。今回は新しいアニメーションシステムについて軽く見てみましょう。

State Machine Behaviours

Unity5.0ではステートにStateMachineBehaviour(を継承した)スクリプトをアタッチする出来るようになりました。そして、ステートの再生中に以下のコールバックを得ることが出来ます。

  • OnStateEnter
  • OnStateUpdate
  • OnStateExit
  • OnStateMove
  • OnStateIK

あなたの好きなようにいくらでもStateMachineBehaviourをステートにアタッチすることが出来ます。なのでステートにIKを追加したり、ロジックを追加したり、StateMachineBehaviourスクリプトはドラッグで簡単にアタッチすることが出来ます。

 基本的にあなたのゲームにはアニメーションの有無にかかわらず、ステートマシンのロジックが必須になります。これでやっとロジックを組み立てるのが簡単になります。

mecUnity5-1

他の機能について素晴らしいことは、このような処理を大量にもつ必要がなくなったことです。(私は以下のようなコードがあなたのコードに大量にあるのを確信しています。)

if(animator.GetCurrentAnimatorStateInfo(0).isName("Idle") )
DoStuff()

Unity5.0からは代わりにStateMachineBehaviourを使うようにしましょう!

 

State Machine Transitions

ステートマシンは段々と複雑に成長してきています。なのでStateMachineTransitionをステートマシンロジックの上で高い抽象化レベルを提供するコンセプトを紹介しましょう。

Unity5ではステートマシンにEntryとExitのノードが追加されました。これはStateMachineTransitionの間に使用されるものです。

Entry: ステートマシンが遷移するとアニメーションシステムはEntryノードを評価して条件を満たしているステートへ向かいます。

 

Exit: Exitノードへと向かった時アニメーションシステムはステートマシンから離れ、適切なステートマシンへと遷移します。

 

これによりステートマシンとステートの遷移の組み合わせが可能です: ステート -> ステート、ステート -> ステートマシン …

mecUnity5-2 さらに、私達はアニメーターパラメーターやレイヤーなどのツールのUIを改良しています。

Asset Creation API

Unity5.0ではアニメーションに関するアセットをエディタスクリプトを使って作成することが出来ます。ステートマシン、ステート、アニメーションコントローラー、レイヤー、ブレンドツリー、等々…

これらには2つのAPIがあります。それはUnityによってアセットが管理されるハイレベルなAPIと、手動でアセットを管理して、外部参照を実行できるローレベルなAPIです。

もちろん、両方のAPIについてドキュメントがあります。そしてAPIの簡潔なサンプルをこのブログエントリーの最後に記述しています。

Direct Blend Trees

私達はブレンドツリーに子のモーションにアニメーターパラメーターのウェイトを直接マッピングできる新しいタイプを追加しました。

mecUnity5-3

これはブレンドシェイプや加算アニメーションの作業を行う時にとても便利です。

Root Motion Authoring (in generic mode)

Unity5.0ではオブジェクトをアニメーション化し、アニメーターのルートモーション(すなわちデルタアニメーション)への変換を可能にします。translation/rotationのアニメーションを作成する時、AnimationClipのインスペクターで”Generate Root Motion Curve”にチェックを入れるとトップレベルのtransformに対してのシンプルなアニメーションが作成できます。

 

さらにあなたのゲーム開発が楽になるよう多くの改良・修正を行っています:

  • アニメーションのプレビューカメラを改良しました。Unity5.0ではパン、オービット、スケール等シーンビューのような操作を行えます。
  • ランタイムでパラメータへのアクセス(name, default value, etc…)
  • ルートポジション、IKポジション、etc… のギズモ
  • リターゲティングエンジンの改良
  • ランタイムでの最適化
  • 多くの多くのバグフィックス

皆さんがこれを読んでどう思ったか私達に教えてくれませんか!

アニメーションチーム

 Asset Creation API sample Code

// アニメーターコントローラーの作成
var controller = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath ("Assets/Mecanim/StateMachineTransitions.controller");

// パラメーターの追加
controller.AddParameter(“TransitionNow”, UnityEditor.Animations.AnimatorControllerParameterType.Trigger);
controller.AddParameter(“Reset”, UnityEditor.Animations.AnimatorControllerParameterType.Trigger);
controller.AddParameter(“GotoB1″, UnityEditor.Animations.AnimatorControllerParameterType.Trigger);
controller.AddParameter(“GotoC”, UnityEditor.Animations.AnimatorControllerParameterType.Trigger);

// ステートマシンの追加
var rootStateMachine = controller.layers[0].stateMachine;
var stateMachineA = rootStateMachine.AddStateMachine(“smA”);
var stateMachineB = rootStateMachine.AddStateMachine(“smB”);
var stateMachineC = stateMachineB.AddStateMachine(“smC”);

// ステートの追加
var stateA1 = stateMachineA.AddState(“stateA1″);
var stateB1 = stateMachineB.AddState(“stateB1″);
var stateB2 = stateMachineB.AddState(“stateB2″);
stateMachineC.AddState(“stateC1″);
var stateC2 = stateMachineC.AddState(“stateC2″); // don’t add an entry transition, should entry to state by default

// トランジションの追加
var exitTransition = stateA1.AddExitTransition();
exitTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “TransitionNow”);
exitTransition.duration = 0;

var resetTransition = stateMachineA.AddAnyStateTransition(stateA1);
resetTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “Reset”);
resetTransition.duration = 0;

var transitionB1 = stateMachineB.AddEntryTransition(stateB1);
transitionB1.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “GotoB1″);
stateMachineB.AddEntryTransition(stateB2);
stateMachineC.defaultState = stateC2;
var exitTransitionC2 = stateC2.AddExitTransition();
exitTransitionC2.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “TransitionNow”);
exitTransitionC2.duration = 0;

var stateMachineTransition = rootStateMachine.AddStateMachineTransition(stateMachineA, stateMachineC);
stateMachineTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, “GotoC”);
rootStateMachine.AddStateMachineTransition(stateMachineA, stateMachineB);

本記事はunity3d.comの記事「Shiny new animation features in Unity 5.0」を翻訳したものです。