君がゲームを作る!Unityゲーム開発入門
第33回 横移動時に左右を反転させる

右移動時は右に、左移動時には左に振り返るよ

みなさん、こんにちは!

先日観光地で喜々として顔出しパネルで写真を撮ろうとしていたら、 小学生くらいの男の子が静かな眼差しこちらを見つめながら カメラの前を横切らないよう待ってくれていました。あらたまです。

さて今日は「君がゲームを作る!Unityゲーム開発入門」の第33回目です!

おさらい

前回 は、アニメーションの切り替えができるようにしましたね。

キーボードを押していないときは、立っているアニメショーンを

矢印キーを押しているときには、走っているアニメショーンをするようにしましたね。

ずっと右を向いたまま

ただしいまのままでは少し問題がありますね。

右矢印キーを押しているときは良いですが、、

左矢印キーを押しているときも忍者は右を向いたままで、 バックして走るような見た目になってしまっていますね。

今回は、これを改善していきましょう!

左を向かせる方法

まずは忍者に左を向かせる方法、つまりは忍者の左右を反転する方法を確認しておきましょう。

忍者を選択して、インスペクターウィンドウのScaleというところを確認してください。

この値は、第26回で 配置した忍者が大きすぎたので、0.3を設定したところですね。

ゲームオブジェクトの「拡大率」を設定している値です。いまは0.3倍の大きさで表示しているわけです。

ここにマイナスの値を入れてあげると、左右を反転させることができます。 試しに「-0.3」に変えてみましょう。

忍者に左を向かせることができました!

プログラミングする

Scaleにマイナスの値を入れたら反転する、この特性を生かしてプログラミングしていきます。

プロジェクトウィンドウで「Scripts」フォルダを選択し、 「CharaControl」ファイルを選択後インスペクターウィンドウで「Open」をクリックします。

太字の部分を追加してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharaControl : MonoBehaviour
{
    // ... 省略 ...

    // Start is called before the first frame update
    void Start()
    {
        // ... 省略 ...
    }

    // 1フレーム毎に呼び出される
    private void Update()
    {
        // ... 省略 ...
    }

    // 画面表示更新処理
    void FixedUpdate()
    {
        // 横矢印キーの押されている状況を取得
        float moveHorizontal = Input.GetAxis("Horizontal");

        if (moveHorizontal != 0)
        {
            // キャラクターの向き制御
            Vector2 lscale = gameObject.transform.localScale;
            if ((lscale.x > 0 && moveHorizontal < 0)
                || (lscale.x < 0 && moveHorizontal > 0))
            {
                lscale.x *= -1;
                gameObject.transform.localScale = lscale;
            }

            // アニメーション切り替え(走っている)
            animator.SetInteger("CharaState", 1);
        }
        else
        {
            // アニメーション切り替え(立っている)
            animator.SetInteger("CharaState", 0);
        }

        // AddForceメソッドに渡すために、Vector2型に変換
        Vector2 movement = new Vector2(moveHorizontal, 0);

        // AddForceメソッドでキャラクターのRigidbody2Dコンポーネントに力を加える
        rb2d.AddForce(movement * speed);
    }
}

追加した内容

まずはゲームオブジェクトからスケールの情報を取り出しています。

そしてif文で

  • スケールXが0より大きい(忍者が右を向いている)状態で左矢印キーが推されている
  • スケールXが0より小さい(忍者が左を向いている)状態で右矢印キーが推されている

のどちらかであることを判定しています。

そのどちらかの条件に当てはまる場合は忍者を振り向かせる必要がありますので、 スケールxに-1を掛け算することで、プラスとマイナスを反転させて(忍者を振り向かせて)いるわけですね。

テストプレイで動作確認をする

それでは、テストプレイをして変化を確認してみましょう!

▶ボタンを押して、プレイモードに入ります。

右矢印キーを押しているときは右を向いて走って、、

左矢印キーを押しているときは左を向いて走るようになりました!

今回はここまでです!

次回は、矢印キーを押してからアニメーションが開始されるまで時間差を改善したいと思います。

次回へ続く。

>> 続きの記事
【君がゲームを作る!Unityゲーム開発入門】第34回 アニメーションのタイムラグを解消する