Unityで着地している時だけジャンプができるようにする方法/OnTriggerEnter2D、OnTriggerExit2Dメソッドの使い方

IT

トリガーを判定に使ってフラグを管理し、フラグがTrueの時だけなんかする、という処理の実装です。
ここでは「接地してる間はジャンプできる」という処理を実装します。

スポンサーリンク

成果物

j2
ぴょんぴょんさせます。

OnTriggerEnter2D、OnTriggerExit2Dの使い方

トリガーと他のオブジェクトが接触した時にイベントを起こす(2D)
OnTriggerEnter2D(Collider2D 名前){処理}

トリガーと他のオブジェクトが離れた時にイベントを起こす(2D)
OnTriggerExit2D(Collider2D 名前){処理}

※判定するには接触するオブジェクトどちらかにRigidbody2Dが必要

jp1
ジャンプさせるスクリプトを少し変更し、KeycodeをSpaceにしてスペースキーでジャンプするようにしておきます。速度とかも少し変更。
j1
さて現状、ジャンプさせると押し続ける限りどこまでも行ってしまうので、
jp2
コライダーをもいっこ作って位置とサイズを調節し、
jp3
足元にこんな感じで当たり判定が来るようにします。
jp4
このコライダーは「触れている」ことを判定したい = 普通のコライダーのように他のものを弾きたくないので、トリガーにする(OnTrigger)をONにしておきます。
OnTriggerがONになったコライダーは、他のコライダーと衝突しなくなります。
jp5
トリガーを作った上で、トリガーに他のコライダーが侵入したことを検知するにはOnTriggerEnter2D、トリガーが他のコライダーから離れたことを検知するにはOnTriggerExit2Dメソッドを使用して、それぞれbool値の変数をtrueまたはfalseにしています。()の中にはCollider2D 何か名前を入力します。名前はとりあえずなんでもいいですし、EnterとExitで別でもいいです。
jp7
変数がtrue = トリガーと他のオブジェクトのコライダーが接している = 地面に着地している場合を条件に加え、条件を満たす場合のみジャンプを許可します。
j2
あとはオブジェクト自身の重さ、重力地、ジャンプ力、当たり判定のサイズなどを調節していきます。
まだだいぶ不自然な感じですが、とりあえず目的は達成できてる時点のコードが下記。
//Unity C#
    //設置してるかどうか
    public bool foot;

    void FixedUpdate()
    {

            //初期化
            this.GetComponent().velocity = new Vector2(0, 0);
            //左
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                this.GetComponent<Rigidbody2D>().velocity = new Vector2(-20, 0);
            }
            //右
            if (Input.GetKey(KeyCode.RightArrow))
            {
                this.GetComponent<Rigidbody2D>().velocity = new Vector2(20, 0);
            }
            //上(&&で複数条件)
            if (Input.GetKey(KeyCode.Space) && foot)
            {
                this.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 2.5f), ForceMode2D.Impulse);
            }
            //下
            if (Input.GetKey(KeyCode.DownArrow))
            {
                this.GetComponent<Rigidbody2D>().velocity = new Vector2(0, -20);
            }
    }
   //トリガーと他のオブジェクトが接触
    void OnTriggerEnter2D(Collider2D t)
    {
        foot = true;
    }

   //トリガーと他のオブジェクトが離れた
    void OnTriggerExit2D(Collider2D t)
    {
        foot = false;
    }
an3
↑からさらに待機処理仕込んだりして色々試行錯誤し、一回完成としたのがこちらです。
オブジェクトの質量1、重力スケール80にしてます。
Curve Animationという機能も便利そうなんですが、一回実装は先送りにしました。
//Unity C#
(略)
  //上
    if (Input.GetKey(KeyCode.Space) && foot)
     {         
        StartCoroutine("JumpAnimation"); 
     }
(略)
    void OnTriggerExit2D(Collider2D tt)
    {
        //トリガーから離れた時点ではfootフラグをOFFにしない
    }

    IEnumerator JumpAnimation()
    {
        int i = 0;
        //6回繰り返し
        while(i < 6)
        {
            this.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 60), ForceMode2D.Impulse);
            //少し時間を置く
            yield return new WaitForSeconds(0.05f);
            i++;    
        }
        //ループが終わったらフラグをOFFにする
        foot = false;
        //少し下に加速
        this.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, -100), ForceMode2D.Impulse);

    }

完成品はこちら

やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。

コメント