テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Unity5 MecanimのStateMachineBehaviourと戯れる

Unity5で唯でさえややこしいMecanim(アニメーション管理システム)に新しくStateMachineBehaviourが追加されました。

f:id:tsubaki_t1:20150501020124p:plain

この機能はMecanimのステート管理機能の各ステートに振る舞いを設定できる機能です。各ステート毎に振るまいを設定することで、コンポーネント側から現在のステートを確認するといった事をせず動かせるようになります。

目次

使い方

StateMachineBehaviourを継承したクラスを用意し、AddBehaviourボタンを使って振る舞いを登録するだけです。StateMachineBehaviourでは幾つかのコールバックがあります。

  • OnStateEnter:ステートに入った時に呼ばれる
  • OnStateUpdate:毎フレーム呼ばれる
  • OnStateExit:ステートから抜ける時に呼ばれる
  • OnStateMove:オブジェクトの座標を動かす物はココで呼ぶ
  • OnStateIK:IKを使う処理はココで呼ぶ

使って遊んでみる

実際に使って簡単なゲームを作成してみました。

プレイヤーは左のガイコツ(魔王)で、右の白い奴が後ろを向いている間に近づくといった感じの内容です。要するに「だるまさんがころんだ」です。

f:id:tsubaki_t1:20150501020152g:plain

下準備

 まずキャラクターを管理するAnimatorControllerのベースとなるものを用意します。魔王と白いやつの2種類です。アニメーションが散らばるのが嫌ですし作るのは空のアニメーションなので、Animatorに入れちゃいます。

UnityのAnimatorControllerにAnimationClipを内蔵する - テラシュールブログ

f:id:tsubaki_t1:20150501022011p:plain

ステートはこんな感じになります。上が移動する魔王氏、下が白いやつのステートです。

正直、ステート作るよりPlayやFadeでブレンドさせた方が良い気がしますが、今回はお試しです。

f:id:tsubaki_t1:20150501022244p:plain

f:id:tsubaki_t1:20150501022402p:plain

振る舞いの登録

WalkとIdleをキー入力で切り替える振る舞いを作ります。振る舞いを追加したいステーを選択してAddBehaviourボタンをクリック・スクリプト名を設定すると、自動的にスクリプトがAssets直下辺りに作られます。

f:id:tsubaki_t1:20150501023225p:plain

とりあえず「ステート選択時はキャラクターを歩かせる」振る舞いと、「指定のボタンを押している間は指定のBoolパラメータをenableにする」振る舞いを作成します。ちなみにanimator.GetComponentでアニメータを持つオブジェクトへのアクセスが可能なので、ステート間の共通変数保たせたりパラメータ弄ったり色々出来ます。

gist.github.com

BooleanSwitchByKeyは魔王用のIdleとWalkのステートに設定しておきます。また、キー判定はSpaceKey、変更する値はIsWalk(bool)としておきます。

Walkは歩く振る舞いなのでWalkステートに設定します。

f:id:tsubaki_t1:20150501024541p:plain

ついでに、視界チェックを行います。視界チェックは単純に「見られてる時に動いたら死ぬ」なので「白いやつのステートがLookの時に魔王のWalkステートが入ったら死ぬ」とします。実装は「”対象のAnimatorの持つState名がLookの場合、DeadTriggerを入れる”振る舞いをWalkに入れる」ような感じです。

ここで面倒くさいのが、StateMachineBehaviourはシーンにあるオブジェクトへの参照をエディタ側で設定できない事です*1。なので、スクリプト側で参照先を取得します。

gist.github.com

上がWalkステート、下がIdleステートについてる振る舞いです。

f:id:tsubaki_t1:20150501024822p:plain

f:id:tsubaki_t1:20150501024839p:plain

白いやつの挙動は、正直面倒くさいので3秒毎にステートがスィッチするようにします。要するにHasExitTimeでサクッとします。

f:id:tsubaki_t1:20150501025058p:plain

ですが実際は「数秒経ったら振り返る」といった感じの振る舞いを設定するのが良いかもしれませんゲーム的には。

gist.github.com

 そういえば「GameObject.Find("Canvas/Enemy");」ってできたんですね。知りませんでした。

アニメーションの設定

後は作成したAnimatorControllerの「歩く」「アイドル」「死ぬ」「振り向く」にアニメーションを割り当てます。上でやっていたようなAnimatorのセットアップを繰り替えすのは馬鹿らしいので、1個作ってAnimatorOverrideControllerでアニメーションを差し替えるようにします。

作成するにはProjectブラウザ>Create>AnimatorOverrideController を選択します。後は該当のAnimator Controllerに含まれるClip一覧が表示されるので、上書きしたいクリップを登録していきます。

f:id:tsubaki_t1:20150501025805g:plain

ちなみにレイヤー分けてステートだけ使う…みたいなのもOKだと思います。ただ、ステートマシンとして使うなら正直もっと良いアセットがあるんじゃないかなと思います。ケースバイケースで。

*1:Animatorは再利用される可能性があるため