竜太のテクニカルメモ

物理やへっぽこなゲーム作りについて易しく解説するよ

ユニティちゃんライセンス

このブログはユニティちゃんライセンス条項の元に提供されています

2Dアクションゲームを作る(5)

f:id:lagrangian:20210215162959p:plain
開発中のゲーム画面

前回でウィッチが自由に移動できるようになりました. ただし,そのままではデモモードのため,2キーでダメージアクション, 3キーで死ぬ,0キーで生き返るとなってしまい,そのままではゲームで使用することはできません. そこで今回はスクリプトの編集をしたいと思います.

Assetsフォルダ直下にMyScripsフォルダを作成する

まずこのウィッチを操作するスクリプトですが, [Assets]→[Wizard - 2D Character]→[Demo]の中の"SimplePlayerController.cs"になりますのでAssetsフォルダ直下に"MyScripts"フォルダを作成してそこに移動させます.通常ファイルの移動を勝手にすると,アプリケーションなどからパスが見えなくなってしまうなどの問題が起こってしまうのですが,Unityエディタで操作する場合は関連付け等が自動的に保持されますので,この心配は無用です.移動ができたら試しにPlayボタンを押してゲームを実行してみましょう. ファイルの移動が動作に全く影響を与えないことが分かります.

SimplePlayerContoroller.csの編集

"SimplePlayerController.cs"ファイルを移動したらダブルクリックしてvisual studioで開いてください.次のようなコードになっています:

using UnityEngine;

namespace ClearSky
{
    public class SimplePlayerController : MonoBehaviour
    {
        public float movePower = 10f;
        public float jumpPower = 15f; //Set Gravity Scale in Rigidbody2D Component to 5

        private Rigidbody2D rb;
        private Animator anim;
        Vector3 movement;
        private int direction = 1;
        bool isJumping = false;
        private bool alive = true;


        // Start is called before the first frame update
        void Start()
        {
            rb = GetComponent<Rigidbody2D>();
            anim = GetComponent<Animator>();
        }

        private void Update()
        {
            Restart();
            if (alive)
            {
                Hurt();
                Die();
                Attack();
                Jump();
                Run();

            }
        }
        private void OnTriggerEnter2D(Collider2D other)
        {
            anim.SetBool("isJump", false);
        }


        void Run()
        {
            Vector3 moveVelocity = Vector3.zero;
            anim.SetBool("isRun", false);


            if (Input.GetAxisRaw("Horizontal") < 0)
            {
                direction = -1;
                moveVelocity = Vector3.left;

                transform.localScale = new Vector3(direction, 1, 1);
                if (!anim.GetBool("isJump"))
                    anim.SetBool("isRun", true);

            }
            if (Input.GetAxisRaw("Horizontal") > 0)
            {
                direction = 1;
                moveVelocity = Vector3.right;

                transform.localScale = new Vector3(direction, 1, 1);
                if (!anim.GetBool("isJump"))
                    anim.SetBool("isRun", true);

            }
            transform.position += moveVelocity * movePower * Time.deltaTime;
        }
        void Jump()
        {
            if ((Input.GetButtonDown("Jump") || Input.GetAxisRaw("Vertical") > 0)
            && !anim.GetBool("isJump"))
            {
                isJumping = true;
                anim.SetBool("isJump", true);
            }
            if (!isJumping)
            {
                return;
            }

            rb.velocity = Vector2.zero;

            Vector2 jumpVelocity = new Vector2(0, jumpPower);
            rb.AddForce(jumpVelocity, ForceMode2D.Impulse);

            isJumping = false;
        }
        void Attack()
        {
            if (Input.GetKeyDown(KeyCode.Alpha1))
            {
                anim.SetTrigger("attack");
            }
        }
        void Hurt()
        {
            if (Input.GetKeyDown(KeyCode.Alpha2))
            {
                anim.SetTrigger("hurt");
                if (direction == 1)
                    rb.AddForce(new Vector2(-5f, 1f), ForceMode2D.Impulse);
                else
                    rb.AddForce(new Vector2(5f, 1f), ForceMode2D.Impulse);
            }
        }
        void Die()
        {
            if (Input.GetKeyDown(KeyCode.Alpha3))
            {
                anim.SetTrigger("die");
                alive = false;
            }
        }
        void Restart()
        {
            if (Input.GetKeyDown(KeyCode.Alpha0))
            {
                anim.SetTrigger("idle");
                alive = true;
            }
        }
    }
}

これを見るとUpdate()の中身は

        private void Update()
        {
            Restart();
            if (alive)
            {
                Hurt();
                Die();
                Attack();
                Jump();
                Run();

            }
        }

となっており,毎フレームごとに

  • 生き返り・・・Restart()
  • ダメージ・・・Hurt()
  • 死ぬ・・・Die()
  • 攻撃・・・Attack()
  • ジャンプ・・・Jump()
  • 走る・・・Run()

となっていますので,ここでHurt()とDie()を切ればそのアクションがなくなることが予想されます.実際メソッドHurt()とDie()を記述してある部分を見ると, Hurt()メソッド:

        void Hurt()
        {
            if (Input.GetKeyDown(KeyCode.Alpha2))
            {
                anim.SetTrigger("hurt");
                if (direction == 1)
                    rb.AddForce(new Vector2(-5f, 1f), ForceMode2D.Impulse);
                else
                    rb.AddForce(new Vector2(5f, 1f), ForceMode2D.Impulse);
            }
        }

Die()メソッド:

        void Die()
        {
            if (Input.GetKeyDown(KeyCode.Alpha3))
            {
                anim.SetTrigger("die");
                alive = false;
            }
        }

となっており,それぞれ2キー,3キーを押すことによってそれぞれのアクションが発動することが分かります.

今回,ゲームで使用するために,通常はHurt()とDie()は切っておき,敵にぶつかるなど特定の状況だけ発動するようにしたいので,次のようにします:

Hurt(),Die()の削除

まず,Updete()で次のようにHurt()とDie()行を削除します:

        private void Update()
        {
            Restart();
            if (alive)
            {
                Attack();
                Jump();
                Run();

            }
        }

これで取りあえず,Hurt()とDie()を切ることができました.

Hurt()とDie()のキー入力の条件文を切る

次に敵に当たった時は2キーを押さなくてもダメージを受けるようにしたいので,キー入力を受けてif文で発動する部分を直に発動するように変えましょう: まずHurt()は次のようにします:

        void Hurt()
        {
            anim.SetTrigger("hurt");
            if (direction == 1)
            {
                rb.AddForce(new Vector2(-5f, 1f), ForceMode2D.Impulse);
            }
            else
            {
                rb.AddForce(new Vector2(5f, 1f), ForceMode2D.Impulse);
            }
        }

Die()は次のようにします:

        void Die()
        {
            if (Input.GetKeyDown(KeyCode.Alpha3))
            {
                anim.SetTrigger("die");
                alive = false;
            }
        }

本当はスクリプトの編集はコメントアウトするなどして元のを取っておくのが望ましいのですが,今回は省略させていただきました.なお,今回の編集後も0キーを押すと生き返ってしまいますが,これはゲームの制作中便利な機能かもしれませんので念のため残しておくことにします.

この編集が終わったらCtrl + Sでスクリプトを保存してUnityに戻ってください. Playボタンを押すと確かに2キーと3キーでのアクションがなくなっていることが分かります.

次回はダメージ床を作りたいと思います.


ゲーム制作ランキング

にほんブログ村 ゲームブログ ゲーム制作へ
にほんブログ村