【Unity】マリオのような2Dゲームを作る〜敵キャラに触れたらダウン編〜

【Unity】プレイヤー作成

前回はプレイヤーのジャンプアニメーションを作成しました。
前回の記事はこちら⇨【Unity】マリオのような2Dゲームを作る〜ジャンプアニメーション編〜
大体のプレイヤーは敵に触れただけでもやられてしまうような体質を持っています。
今回はそんなどこにでもいるようなプレイヤーを作っていきます。

敵に触れたらダウンするまでの流れ

オブジェクトが判別できるようにタグを作る

敵に触れた時など特定のオブジェクトだけに反応するようなプログラムを作りたい時はタグを使用します。

<タグの作成手順>

  • ヒエラルキーウィンドウで敵キャラを選択
  • インスぺクターのTagをクリック(デフォルトではUntagged)
  • 一番下の Add Tagをクリック
  • Tagsの+をクリック
  • New TagNameで新しいタグの名前を作成しSaveをクリック(ここでは分かりやすくEnemyとします)
  • Enemyタグが作成できたのでUntaggedからEnemyをクリックしタグを変更する

作成したEnemyタグを使いプログラミングをする

今まで作ったコードに以下のコードを追加します。
※Update部分はそのまま載せてありますので今回追加したところはNewとコメント残してます。

public class PlayerController : MonoBehaviour
{

private string enemyTag = "Enemy";//EnemyタグをenemyTagとして使う
public float down_time;//シーンが切り替わるまでの時間設定
private bool down_flg = false;
private bool isDown = false;

// Start is called before the first frame update
void Start()
{
    down_time = 0;
}

// Update is called once per frame
void Update()
{
    if (!isDown)//New
    {
    isGround = ground.IsGround();
    isHead = head.IsGround();

    float ySpeed = -gravity;
    float xSpeed = 0.0f;
    float horizotalKey = Input.GetAxis("Horizontal");
    float verticalKey = Input.GetAxis("Vertical");

    if (isGround)
    {
        if (verticalKey > 0)
        {
            ySpeed = jumpSpeed;
            jumpPos = transform.position.y;
            isJump = true;
            jumpTime = 0.0f;
        }
        else
        {
            isJump = false;
        }
    }
    else if (isJump)
    {
        bool pushUpKey = verticalKey > 0;
        bool canHeight = jumpPos + jumpHeight > transform.position.y;
        bool canTime = jumpLimitTime > jumpTime;

        if (pushUpKey && canHeight && canTime && !isHead)
        { 
            ySpeed = jumpSpeed;
            jumpTime += Time.deltaTime;
        }
        else
        {
            isJump = false;
        }
    }

    if (horizotalKey > 0)
    {
        transform.localScale = new Vector3(1, 1, 1);
        anim.SetBool("run", true);
        xSpeed = speed;
    }
    else if (horizotalKey < 0)
    {
        transform.localScale = new Vector3(-1, 1, 1);
        anim.SetBool("run", true);
        xSpeed = -speed;
    }
    else
    {
        anim.SetBool("run", false);
        xSpeed = 0.0f;
    }

    anim.SetBool("jump", isJump);
    anim.SetBool("ground", isGround);
    rb.velocity = new Vector2(xSpeed, ySpeed);

    }
    else
    {
        rb.velocity = new Vector2(0, -gravity);
    }

    if (down_flg == true)//New
    {
        down_time = down_time + Time.deltaTime;
    }

}

private void OnCollisionEnter2D(Collision2D collision)//New
{
    if (collision.collider.tag == enemyTag)//Enemyタグのついたオブジェクトに反応
    {
        isDown = true;
        down_flg = true;
    }

}

}

この状態で敵に当たるとプレイヤーは動かせなくなりましたので、ダウン状態を作成できたと言えます・・・が、このままだとプレイヤーは動かせないままなのでもう1度元のシーンに戻すようにしたいです。次でその問題を解決します。

敵に当たったらシーンを戻す

シーンを戻すのは簡単で、コードでちょちょッと追加するだけです。
まず、コードの1〜3の部分がusing〜と書かれています。その下に
using UnityEngine.SceneManagement;と書きます。
※これを追加しないとシーンを戻すことができません。

次にUppdateの中に以下のコードを追加します。

if (down_time >= 1.5f)
{
SceneManager.LoadScene(“Stage1”);
}

これは設定したdown timeが1.5秒以上になったらStage1をロードするというものです。
Stage1といういのは僕が今作っている練習用のステージ名ですので、ロードしたいシーンの名前に合わせる必要があります。
この状態でわざと敵に当たってみましょう。

ちゃんと敵に当たってから自動で戻るようになりました。

作っていた時の感想

どうしても敵に当たった時にだけやられるように反応して欲しかったので、タグという存在を知った時はこれで思ったように作れる・・・と思ったのですがタグの使い方を調べるのが大変でした。
ゲームを作っていると投げ出したくなる瞬間がなん度も訪れますが、問題を解決した時の達成感がとても心地よいものです。

コメント

タイトルとURLをコピーしました