Mecanimを試してみた


image

>>Unityプレーヤーで見る

以前はアニメーション制御にAnimationコンポーネントで作ってみたけど、今回Mecanimを学んでみた。
見た目で状態遷移が分かるのでとてもいいですね。
たまに状態遷移が表示されなくなるのはなんなんだろ。。。(?)

Mecanimの仕組みについてはUnity公式のこちらの動画を見てもらえるとだいたい理解できる。(50分くらいある!)
ソースファイルなんかもYoutubeの説明の蘭にあるのであとで詳しく見てみよう。

上記の僕の方でもっとシンプルに作ったものはこちら
>> Unityファイルダウンロード

mecanim_status

今回は、移動(十字キー or wsza)、ジャンプ(Space)、おじぎ(Return)の実装。
まばたきもするんだけど、こちらは違うレイヤーを作ってアニメーションをBlend:Additiveとして実装してみたけど、どういったやりかたがいいんだろ。。。?

こんだけのものを作ってもソースファイルがこれしかない!
これもMecanimのおかげですね。
まだまだ分からない設定項目や機能もあるけど追々憶えていきたいな。

[unityjavascript]
#pragma strict

@script RequireComponent(Animator)
@script RequireComponent(Collider)

/**
* キャラクターのコントローラー。
*/
public class Character extends MonoBehaviour {
/**
* 移動・回転のスピード。
*/
static private var MOVE_SPEED:float = 5;
static private var ROT_SPEED:float = 200;
static private var JUMP_POWER:float = 1000;

/**
* 遷移の状態。
*/
static private var STATUS_IDLE:int = Animator.StringToHash(‘Base Layer.Idoling’);

/**
* Animator.
*/
private var animator:Animator;

/**
* 遷移状態。
*/
private var statusIdoling:int = Character.STATUS_IDLE;

/**
* 地面にいるかどうか。
*/
private var groundFlag:boolean = true;

/**
* Awake.
*/
public function Awake():void {
this.animator = this.GetComponent(Animator);
}

/**
* Update.
*/
public function Update():void {
var vValue = Input.GetAxis(‘Vertical’);
var hValue = Input.GetAxis(‘Horizontal’);

this.transform.Translate(Vector3.forward * vValue * Character.MOVE_SPEED * Time.deltaTime);
this.transform.Rotate(Vector3.up * hValue * Character.ROT_SPEED * Time.deltaTime);

// 着地時は回転をなくす
if (this.groundFlag) {
this.rigidbody.angularVelocity = Vector3.zero;
}

// アクション
if (this.groundFlag) {
// ジャンプ
if (Input.GetButtonDown(‘Jump’)) {
this.rigidbody.AddForce(this.transform.up * JUMP_POWER, ForceMode.Impulse);
this.animator.SetBool(‘Jump’, true);
this.animator.SetBool(‘Bow’, false);
}
// お辞儀
else if (Input.GetKeyDown(KeyCode.Return) && !this.animator.GetCurrentAnimatorStateInfo(0).IsName(‘Jump’)) {
this.animator.SetBool(‘Bow’, true);
}
}

// 瞬き
if (Random.Range(0.0, 1.0) < 0.01) {
this.animator.SetTrigger(‘Blink’);
}

// 移動・傾きの値設定
this.animator.SetFloat(‘Speed’, vValue);
this.animator.SetFloat(‘Roll’, hValue / 2 + 0.5);

// 転がりを防ぐ
this.transform.eulerAngles.x = 0;
this.transform.eulerAngles.z = 0;
}

/**
* 地面についているかどうか。
*/
public function IsGrounded():boolean {
return this.groundFlag;
}

/**
* 衝突イベント。
*/
public function OnCollisionEnter(collision:Collision):void {
this.animator.SetBool(‘Jump’, false);
this.groundFlag = true;

}

public function OnCollisionStay(collision:Collision):void {
this.groundFlag = true;
}

public function OnCollisionExit(collision:Collision):void {
this.groundFlag = false;
}
}
[/unityjavascript]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です