C#で状態を変更する
Menicamで設定したアニメーションの状態を、C#のプログラムコードから編集していきます。
キャラクターのアニメーション処理はキャラクタークラス内で行いたいので、CharactorManager.csに処理を記述していくことにします。CharactorManager.csを開き、以下のようにプロパティを追記します。
public class CharactorManager : MonoBehaviour {
// ジャンプしているかどうか
private bool _isJumping;
// 左向きかどうか
private bool _isLeftMove;
// 停止しているかどうか
private bool _isStop;
// アニメーション制御用のAnimatorクラス
private Animator _animator;
変数名になんとなく見覚えがあると思います。後で分かりますが今回追加したこれらの変数(_animatorをのぞく)はMenicamで追加したプロパティに対応します。
続いて、クラス生成時に一度だけ呼ばれるStartメソッドに初期化処理を追記します。
void Start () {
this._animator = this.GetComponent<Animator>();
this._isLeftMove = true;
this._isJumping = false;
this._isStop = true;
}
一定間隔で呼び出されるUpdateメソッドにも追記します。
void Update () {
// 自分の速度を取得
var v = this.rigidbody2D.velocity;
// 縦方向の速度によってフラグを調整
// 0.1ずつずらしてあるのは誤差対応のため
if (v.x < -0.1f)
{
this._isLeftMove = true;
this._isStop = false;
}
else if (v.x > 0.1f)
{
this._isLeftMove = false;
this._isStop = false;
}
else
{
this._isStop = true;
}
// Animatorのパラメーターを変更
this._animator.SetBool("isJump", this._isJumping);
this._animator.SetBool("isStop", this._isStop);
this._animator.SetBool("isLeftMove", this._isLeftMove);
}
CharactorManager.csの編集を終了します。
GameManager.csにも変更が必要なのでGameManager.csを開き、Updateメソッドを以下のように書き換えます。
void Update () {
// 左右のキーで左右に移動
float horizontal = Input.GetAxis("Horizontal");
// キー入力がありジャンプ中でない場合は左右に移動
if (horizontal != 0.0f && this._charactorScript.isJumping == false)
{
this._moveCharactor(Vector2.right * 10f * horizontal);
}
// スペースキーでジャンプ
// ジャンプ中はスペースキーが押されてもさらに上昇しない
if (Input.GetKeyDown("space") && this._charactorScript.isJumping == false)
{
this._moveCharactor(Vector2.up * 400f);
}
}
ジャンプ中に方向キーを押しても力を加えないように変更を加えたのと、前回の解説でスペースキーでキャラクターの向きを変えるようにした修正を削除しました。
実行してみる
この状態でゲームを実行すると、ジャンプのアニメーションがおかしいことに気が付きます。これはジャンプのアニメーションが最後のコマに達した後、また最初にループしてしまっているのが原因です。
歩くアニメーションはそれでよいのですが、ジャンプの場合は最後のコマでそのまま停止しておいてほしいのです。
ループの停止
アニメーションのループを停止するために、Projectウィンドウのjump_leftのアニメーションファイルをダブルクリックして開きます。
InspectorウィンドウのLoop Timeのチェックを外します。
jump_rightも同様にLoop Timeのチェックを解除します。
これでキャラクターが正常にジャンプのアニメーションを行うようになりました。
まとめ
Unityの2Dゲーム開発機能のアニメーション処理を用いてキャラクターを動かす際にアニメーションできるようになりました。アニメーションを入れることでグッとゲームらしさが出てきたと思います。
次回は、飛び乗れる床などを配置してキャラクターが画面を走り回れるようにします。

