アニメーション

アニメーション


資料:
<レガシーのアニメーション機能>

<ショートカット>
ctrl+6 アニメーションウインドウ表示

アニメーションの実現方法


2パターンある
  • アニメーションファイル(.Animation)を用意して適時、必要なときにコードから再生する(レガシー)
  • コードでtransform.TranslateやPosition、rigidbody.AddForce、Time.deltaTime等を利用して数式的にアニメーションさせる

前者はunityツール上でFLASH等に近い制作工程を行う。後者はコーディングがメイン。colliderも一緒にアニメーションする事に留意

レイヤー

アニメーションのレイヤーはディフォルトでは0
数字を重ねるごとに上位レイヤーとして扱われる

例。
animation["shoot"].layer = 1;

この場合ディフォルト状態の他のアニメーションよりshootは上位となり
animation.CrossFade("shoot");させた際、優先してブレンドされる


アニメーションのデータ更新タイミング


Update()
  ↓
アニメーションデータ更新(各ボーンのTransform更新)
  ↓
LastUpdate()

たとえばキャラクターの頭部を3D空間の特定位置に向かせたい場合
LookAt()関数を仕込むのはLastUpdate()内が適切

フレームレートと値

ユニティ内での再生フレームレートはサンプリング変動制なので同フレームの挙動を見比べた場合、
オーサリングソフト側で設定した値と常に同じぴったりの値で動くとは限らない。
アニメーションが特定の地点に到達したか通知される必要がある場合、リファレンスではアニメーションイベントの使用が推奨されている


サンプル1

DungeonEaterのサンプルデータを利用してアニメーションに関連する機能を確認するサンプル

階層構造とコンポーネント、publicメンバーの設定は以下の画像を参照

swordAnim.jpg

using UnityEngine;
using System.Collections;

public class AnimTest2 : MonoBehaviour
{
  
   bool swordUp = false;
   public GameObject sword;    //剣のオブジェクトを割当てる
   
   // Use this for initialization
   void Start ()
   {
       sword.renderer.enabled = false;    //手に持たせた剣を非表示
       
       Transform mixTransform = transform.Find ("root/hip/mune");
       animation ["up_sword"].layer = 1;
       animation ["up_sword"].AddMixingTransform (mixTransform);            
       
       animation ["run"].speed = 2.0f;
       animation.Play ("idle");
       //アニメーションのベースとなる待機状態のモーション これに対してクロスフェードをかけてモーション状態を遷移させる
       
       //イベントの追加
       AnimationEvent ev = new AnimationEvent ();
       ev.time = 0.0f;
       ev.functionName = "StepSound";
       ev.floatParameter = 1.0f;
       animation ["run"].clip.AddEvent (ev);
       //イベントをアニメーションクリップに追加するとそのイベントが起動した際SendMessageとしてfunctionNameの関数が起動される
       //この場合タイムラインの0フレーム目でSendMessage("StepSound",1.0f); が起動する 
       
       AnimationEvent ev2 = new AnimationEvent ();
       ev2.time = animation ["run"].clip.length / 2;
       ev2.functionName = "StepSound";
       ev2.floatParameter = 1.0f;
       animation ["run"].clip.AddEvent (ev2);
       //この場合runクリップのタイムライン半分の位置でSendMessage("StepSound",1.0f); が起動する 
       //考え方的にはアニメーションクリップにイベント関数を紐付する感覚に近い
   }
   
   // Update is called once per frame
   void Update ()
   {
       float x = Input.GetAxis ("Horizontal");
       if (Mathf.Abs (x) > 0.2) {
           animation.CrossFade ("run", 0.5f);    //走るモーション状態へ0.5フレームかけて遷移する
       } else {
           animation.CrossFade ("idle", 0.5f);    //元の待機状態に戻る
       }
       
       if (Input.GetButtonDown ("Fire1")) {
           swordUp = !swordUp;
       }
       
       if (swordUp) {
           animation.CrossFadeQueued ("up_sword", 0.5f, QueueMode.CompleteOthers);
           //通常のクロスフェードと若干異なり最初から再生される
           //CrossFade()側を使うとloopの場合、フレームがStopしてもクリアされず進んだ状態で記憶されている
           sword.renderer.enabled = true;        //手に持たせた剣を表示
       } else {
           animation.Stop ("up_sword");
           sword.renderer.enabled = false;
       }
   }
   
   void StepSound ()
   {
       print ("step");
   }
}

メニュー



  • 最終更新:2014-06-13 10:45:55

このWIKIを編集するにはパスワード入力が必要です

認証パスワード