Unity 2Dアクションの作り方【ジャンプ台】

make 2d action thumbnail

前回はコンティニューやステージクリア、メッセージ表示といったゲーム中のイベントを作成しました。今回はジャンプ台を作成していきます。最後までついて来て頂ければ↑のようなゲームを作る事ができます。

この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。

<今まで実装した物>

さて、ジャンプ台を作っていきたいところですが、実はもうほぼできています。

過去に作成した物を流用すればOKです。では過去に作ったものを見てみましょう。

クリックすると展開します
using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 public class Player : MonoBehaviour
 {
       #region//インスペクターで設定する
       [Header("移動速度")] public float speed;
       [Header("重力")] public float gravity;
       [Header("ジャンプ速度")] public float jumpSpeed;
       [Header("ジャンプする高さ")] public float jumpHeight;
       [Header("ジャンプする長さ")] public float jumpLimitTime;
       [Header("接地判定")] public GroundCheck ground;
       [Header("天井判定")] public GroundCheck head;
       [Header("ダッシュの速さ表現")] public AnimationCurve dashCurve;
       [Header("ジャンプの速さ表現")] public AnimationCurve jumpCurve;
       [Header("踏みつけ判定の高さの割合(%)")] public float stepOnRate;
       [Header("ジャンプする時に鳴らすSE")] public AudioClip jumpSE;
       [Header("やられた鳴らすSE")] public AudioClip downSE;
       [Header("コンティニュー時に鳴らすSE")] public AudioClip continueSE;
       #endregion

       #region//プライベート変数 
       private Animator anim = null;
       private Rigidbody2D rb = null;
       private CapsuleCollider2D capcol = null;
       private bool isGround = false;
       private bool isHead = false; 
       private bool isJump = false;
       private bool isRun = false;
       private bool isDown = false;
       private bool isOtherJump = false;
       private bool isClearMotion = false;
       private float jumpPos = 0.0f;
       private float otherJumpHeight = 0.0f;
       private float dashTime, jumpTime;
       private float beforeKey;
       private string enemyTag = "Enemy";
       private string moveFloorTag = "MoveFloor";
       private bool isContinue = false;
       private float continueTime, blinkTime;
       private SpriteRenderer sr = null;
       private MoveObject moveObj;
       #endregion

       void Start()
       {
            //コンポーネントのインスタンスを捕まえる
            anim = GetComponent<Animator>();
            rb = GetComponent<Rigidbody2D>();
            capcol = GetComponent<CapsuleCollider2D>();
            sr = GetComponent<SpriteRenderer>();
       }

       private void Update()
       {
            if (isContinue)
            {
                //明滅 ついている時に戻る
                if (blinkTime > 0.2f)
                {
                    sr.enabled = true;
                    blinkTime = 0.0f;
                }
                //明滅 消えているとき
                else if (blinkTime > 0.1f)
                {
                    sr.enabled = false;
                }
                //明滅 ついているとき
                else
                {
                    sr.enabled = true;
                }
                //1秒たったら明滅終わり
                if (continueTime > 1.0f)
                {
                    isContinue = false;
                    blinkTime = 0f;
                    continueTime = 0f;
                    sr.enabled = true;
                }
                else
                {
                    blinkTime += Time.deltaTime;
                    continueTime += Time.deltaTime;
                }
            }
       }

       void FixedUpdate()
       {
            if (!isDown && !GManager.instance.isGameOver && !GManager.instance.isStageClear)
            {
                //接地判定を得る
                isGround = ground.IsGround();
                isHead = head.IsGround(); 

                //各種座標軸の速度を求める
                float xSpeed = GetXSpeed();
                float ySpeed = GetYSpeed();

                //アニメーションを適用
                SetAnimation();

                //移動速度を設定
                Vector2 addVelocity = Vector2.zero;
                if (moveObj != null)
                {
                    addVelocity = moveObj.GetVelocity();
                }
                rb.velocity = new Vector2(xSpeed, ySpeed) + addVelocity;
            }
            else
            {
                if (!isClearMotion && GManager.instance.isStageClear)
                {
                    anim.Play("player_clear");
                    isClearMotion = true;
                }
                rb.velocity = new Vector2(0, -gravity);
            }
       }

       /// <summary> 
       /// Y成分で必要な計算をし、速度を返す。 
       /// </summary> 
       /// <returns>Y軸の速さ</returns> 
       private float GetYSpeed()
       {
            float verticalKey = Input.GetAxis("Vertical");
            float ySpeed = -gravity;

            //地面にいるとき
            if (isGround)
            {
                if (verticalKey > 0 && jumpTime < jumpLimitTime)
                {
                    ySpeed = jumpSpeed;
                    jumpPos = transform.position.y; //ジャンプした位置を記録する
                    isJump = true;
                    jumpTime = 0.0f;
                    GManager.instance.PlaySE(jumpSE);
                }
                else
                {
                    isJump = false;
                }
            }
            //何かを踏んだ際のジャンプ
            else if (isOtherJump)
            {
                if (jumpPos + otherJumpHeight > transform.position.y && jumpTime < jumpLimitTime && !isHead)
                {
                    ySpeed = jumpSpeed;
                    jumpTime += Time.deltaTime;
                }
                else
                {
                    isOtherJump = false;
                    jumpTime = 0.0f;
                }
            }
            //ジャンプ中
            else if (isJump)
            {
                //上ボタンを押されている。かつ、現在の高さがジャンプした位置から自分の決めた位置より下ならジャンプを継続する
                if (verticalKey > 0 && jumpPos + jumpHeight > transform.position.y && jumpTime < jumpLimitTime && !isHead)
                {
                    ySpeed = jumpSpeed;
                    jumpTime += Time.deltaTime;
                }
                else
                {
                    isJump = false;
                    jumpTime = 0.0f;
                }
            }
            if (isJump)
            {
                ySpeed *= jumpCurve.Evaluate(jumpTime);
            }
            return ySpeed;
       }

       /// <summary> 
       /// X成分で必要な計算をし、速度を返す。 
       /// </summary> 
       /// <returns>X軸の速さ</returns> 
       private float GetXSpeed()
       {
            float horizontalKey = Input.GetAxis("Horizontal");
            float xSpeed = 0.0f;
            if (horizontalKey > 0)
            {
                transform.localScale = new Vector3(1, 1, 1);
                isRun = true;
                dashTime += Time.deltaTime;
                xSpeed = speed;
            }
            else if (horizontalKey < 0)
            {
                transform.localScale = new Vector3(-1, 1, 1);
                isRun = true;
                dashTime += Time.deltaTime;
                xSpeed = -speed;
            }
            else
            {
                isRun = false;
                xSpeed = 0.0f;
                dashTime = 0.0f;
            }
            //前回の入力からダッシュの反転を判断して速度を変える
            if (horizontalKey > 0 && beforeKey < 0)
            {
                dashTime = 0.0f;
            }
            else if (horizontalKey < 0 && beforeKey > 0)
            {
                dashTime = 0.0f;
            }
            beforeKey = horizontalKey;
            xSpeed *= dashCurve.Evaluate(dashTime);
            beforeKey = horizontalKey;
            return xSpeed;
       }

       /// <summary> 
       /// アニメーションを設定する 
       /// </summary> 
       private void SetAnimation()
       {
            anim.SetBool("jump", isJump || isOtherJump);
            anim.SetBool("ground", isGround);
            anim.SetBool("run", isRun);
       }

       /// <summary> 
       /// ダウンアニメーションが終わっているかどうか 
       /// </summary> 
       /// <returns>終了しているかどうか</returns>  
       public bool IsDownAnimEnd()
       {
            if (isDown && anim != null)
            {
                AnimatorStateInfo currentState = anim.GetCurrentAnimatorStateInfo(0);
                if (currentState.IsName("player_down"))
                {
                    if (currentState.normalizedTime >= 1)
                    {
                        return true;
                    }
                }
            }
            return false;
       }

       /// <summary> 
       /// コンティニューする 
       /// </summary> 
       public void ContinuePlayer()
       {
            isDown = false;
            anim.Play("player_stand");
            isJump = false;
            isOtherJump = false;
            isRun = false;
            isContinue = true;
            GManager.instance.PlaySE(continueSE);
       }

       #region//接触判定 
       private void OnCollisionEnter2D(Collision2D collision)
       {
            if (!GManager.instance.isStageClear && !GManager.instance.isGameOver)
            {
                if (collision.collider.tag == enemyTag)
                {
                    //踏みつけ判定になる高さ
                    float stepOnHeight = (capcol.size.y * (stepOnRate / 100f));
                    //踏みつけ判定のワールド座標
                    float judgePos = transform.position.y - (capcol.size.y / 2f) + stepOnHeight;
                    foreach (ContactPoint2D p in collision.contacts)
                    {
                        if (p.point.y < judgePos)
                        {
                            ObjectCollision o = collision.gameObject.GetComponent<ObjectCollision>();
                            if (o != null)
                            {
                                otherJumpHeight = o.boundHeight;    //踏んづけたものから跳ねる高さを取得する
                                o.playerStepOn = true;        //踏んづけたものに対して踏んづけた事を通知する
                                jumpPos = transform.position.y; //ジャンプした位置を記録する
                                isOtherJump = true;
                                isJump = false;
                                jumpTime = 0.0f;
                            }
                            else
                            {
                                Debug.Log("ObjectCollisionが付いてないよ!");
                            }
                        }
                        else
                        {
                            anim.Play("player_down");
                            isDown = true;
                            GManager.instance.SubHeartNum();
                            GManager.instance.PlaySE(downSE);
                            break;
                        }
                    }
                }
                //動く床
                else if (collision.collider.tag == moveFloorTag)
                {
                    //踏みつけ判定になる高さ
                    float stepOnHeight = (capcol.size.y * (stepOnRate / 100f));
                    //踏みつけ判定のワールド座標
                    float judgePos = transform.position.y - (capcol.size.y / 2f) + stepOnHeight;

                    foreach (ContactPoint2D p in collision.contacts)
                    {
                        //動く床に乗っている
                        if (p.point.y < judgePos)
                        {
                            moveObj = collision.gameObject.GetComponent<MoveObject>();
                        }
                    }
                }
            }
       }

       private void OnCollisionExit2D(Collision2D collision)
       {
            if (collision.collider.tag == moveFloorTag)
            {
                //動く床から離れた
                moveObj = null;
            }
       }
       #endregion
 }

using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 public class ObjectCollision : MonoBehaviour
 {
     [Header("これを踏んだ時のプレイヤーが跳ねる高さ")] public float boundHeight;

     /// <summary>
     /// このオブジェクトをプレイヤーが踏んだかどうか
     /// </summary>
     [HideInInspector] public bool playerStepOn;
 }

これらを工夫したらジャンプ台を作成する事ができそうです。

<ジャンプ台のアニメーション>

スクリプトを弄る前に動きを見るために絵をまずは用意したいと思います。とりあえず、今回も下書きで適当に描いてみましょうか

jump stepper
jumpstepper2

まぁ、下書きなので適当で置いておいて、とりあえずこの2コマのアニメーションでジャンプ台が動くのを表現します。

通常状態のアニメーションと

jump step animation 1

ジャンプ台が作動した時のアニメーションを作成します。

jump step animation 2

アニメーションの作り方を忘れてしまった方は↓の記事を参考にしてください。

で、Triggerにonのパラメータを追加し

jump step animator

通常状態→ジャンプ状態 のところはonが入ったら遷移、Transition Durationを0に

ジャンプ状態→通常状態 のところはHas Exit Timeにチェック、Exit Timeを1にTransition Durationを0に設定します。

アニメーションの制御のやり方を忘れてしまった方は↓の記事を参考にしてください。

はい、とりあえずアニメーションはできました。

スポンサーリンク

<ジャンプ台を踏んだ時の制御を作成>

では、ジャンプ台を踏んだ時の処理を追加していきましょう。でもその前に、ジャンプ台はジャンプ台と認識させなければいけないのでタグをつけましょう。

jump step tag

自分はJumpStepというタグを作って設定しました。

敵を踏んだ時に作ったものは高さを変える事ができましたが、速さは変えられなかったので速さを変えるパラメーターを追加します。で、踏んだ場合の制御を書いたジャンプ台のスクリプトを用意します。

クリックすると展開します
using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 public class ObjectCollision : MonoBehaviour
 {
     [Header("これを踏んだ時のプレイヤーが跳ねる高さ")] public float boundHeight;
     [Header("これを踏んだ時のプレイヤーが跳ねる速さ")] public float jumpSpeed;
     /// <summary>
     /// このオブジェクトをプレイヤーが踏んだかどうか
     /// </summary>
     [HideInInspector] public bool playerStepOn;
 }
using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 public class JumpObject : MonoBehaviour
 {
     private ObjectCollision oc;
     private Animator anim;

     // Start is called before the first frame update
     void Start()
     {
          oc = GetComponent<ObjectCollision>();
          anim = GetComponent<Animator>();
          if(oc == null || anim == null)
          {
              Debug.Log("ジャンプ台の設定が足りていません");
              Destroy(this);
          }
     }

     // Update is called once per frame
     void Update()
     {
          if (oc.playerStepOn)
          {
              anim.SetTrigger("on");
              oc.playerStepOn = false;
          }
     }
 }

これら2つのスクリプトをジャンプ台にくっつけ、BoxCollider2DとAnimatorもセットしましょう。

jump step inspector

こんな感じです。

次はプレイヤー側がジャンプ台を踏んだことを認識し、跳べるようにします。

using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 public class Player : MonoBehaviour
 {
     #region//インスペクターで設定する
     [Header("移動速度")] public float speed;
     [Header("重力")] public float gravity;
     [Header("ジャンプ速度")] public float jumpSpeed;
     [Header("ジャンプする高さ")] public float jumpHeight;
     [Header("ジャンプする長さ")] public float jumpLimitTime;
     [Header("接地判定")] public GroundCheck ground;
     [Header("天井判定")] public GroundCheck head;
     [Header("ダッシュの速さ表現")] public AnimationCurve dashCurve;
     [Header("ジャンプの速さ表現")] public AnimationCurve jumpCurve;
     [Header("踏みつけ判定の高さの割合(%)")] public float stepOnRate;
     [Header("ジャンプする時に鳴らすSE")] public AudioClip jumpSE;
     [Header("やられた鳴らすSE")] public AudioClip downSE;
     [Header("コンティニュー時に鳴らすSE")] public AudioClip continueSE;
     #endregion

     #region//プライベート変数  
     private Animator anim = null;
     private Rigidbody2D rb = null;
     private CapsuleCollider2D capcol = null;
     private bool isGround = false;
     private bool isHead = false; 
     private bool isJump = false;
     private bool isRun = false;
     private bool isDown = false;
     private bool isOtherJump = false;
     private bool isClearMotion = false;
     private float jumpPos = 0.0f;
     private float otherJumpHeight = 0.0f;
     private float otherJumpSpeed = 0.0f; //New
     private float dashTime, jumpTime;
     private float beforeKey;
     private string enemyTag = "Enemy";
     private string moveFloorTag = "MoveFloor";
     private string jumpStepTag = "JumpStep";//New
     private bool isContinue = false;
     private float continueTime, blinkTime;
     private SpriteRenderer sr = null;
     private MoveObject moveObj;
     #endregion

     void Start()
     {
          //コンポーネントのインスタンスを捕まえる
          anim = GetComponent<Animator>();
          rb = GetComponent<Rigidbody2D>();
          capcol = GetComponent<CapsuleCollider2D>();
          sr = GetComponent<SpriteRenderer>();
     }

     private void Update()
     {
          if (isContinue)
          {
              //明滅 ついている時に戻る
              if (blinkTime > 0.2f)
              {
                  sr.enabled = true;
                  blinkTime = 0.0f;
              }
              //明滅 消えているとき
              else if (blinkTime > 0.1f)
              {
                  sr.enabled = false;
              }
              //明滅 ついているとき
              else
              {
                  sr.enabled = true;
              }

              //1秒たったら明滅終わり
              if (continueTime > 1.0f)
              {
                  isContinue = false;
                  blinkTime = 0f;
                  continueTime = 0f;
                  sr.enabled = true;
              }
              else
              {
                  blinkTime += Time.deltaTime;
                  continueTime += Time.deltaTime;
              }
          }
     }

     void FixedUpdate()
     {
          if (!isDown && !GManager.instance.isGameOver && !GManager.instance.isStageClear)
          {
              //接地判定を得る
              isGround = ground.IsGround();
              isHead = head.IsGround(); 

              //各種座標軸の速度を求める
              float xSpeed = GetXSpeed();
              float ySpeed = GetYSpeed();

              //アニメーションを適用
              SetAnimation();

              //移動速度を設定
              Vector2 addVelocity = Vector2.zero;
              if (moveObj != null)
              {
                  addVelocity = moveObj.GetVelocity();
              }
              rb.velocity = new Vector2(xSpeed, ySpeed) + addVelocity;
          }
          else
          {
              if (!isClearMotion && GManager.instance.isStageClear)
              {
                  anim.Play("player_clear");
                  isClearMotion = true;
              }
              rb.velocity = new Vector2(0, -gravity);
          }
     }

     /// <summary>  
     /// Y成分で必要な計算をし、速度を返す。  
     /// </summary>  
     /// <returns>Y軸の速さ</returns>  
     private float GetYSpeed()
     {
          float verticalKey = Input.GetAxis("Vertical");
          float ySpeed = -gravity;

          //地面にいるとき
          if (isGround)
          {
              if (verticalKey > 0 && jumpTime < jumpLimitTime)
              {
                  ySpeed = jumpSpeed;
                  jumpPos = transform.position.y; //ジャンプした位置を記録する
                  isJump = true;
                  jumpTime = 0.0f;
                  GManager.instance.PlaySE(jumpSE);
              }
              else
              {
                  isJump = false;
                  isOtherJump = false; //New
              }
          }
          //何かを踏んだ際のジャンプ
          else if (isOtherJump)
          {
              if (jumpPos + otherJumpHeight > transform.position.y && jumpTime < jumpLimitTime && !isHead)
              {
                  ySpeed = otherJumpSpeed; //New
                  jumpTime += Time.deltaTime;
              }
              else
              {
                  isOtherJump = false;
                  jumpTime = 0.0f;
              }
          }
          //ジャンプ中
          else if (isJump)
          {
              //上ボタンを押されている。かつ、現在の高さがジャンプした位置から自分の決めた位置より下ならジャンプを継続する
              if (verticalKey > 0 && jumpPos + jumpHeight > transform.position.y && jumpTime < jumpLimitTime && !isHead)
              {
                  ySpeed = jumpSpeed;
                  jumpTime += Time.deltaTime;
              }
              else
              {
                  isJump = false;
                  jumpTime = 0.0f;
              }
          }
          if (isJump)
          {
              ySpeed *= jumpCurve.Evaluate(jumpTime);
          }
          return ySpeed;
     }

     /// <summary>  
     /// X成分で必要な計算をし、速度を返す。  
     /// </summary>  
     /// <returns>X軸の速さ</returns>  
     private float GetXSpeed()
     {
          float horizontalKey = Input.GetAxis("Horizontal");
          float xSpeed = 0.0f;
          if (horizontalKey > 0)
          {
              transform.localScale = new Vector3(1, 1, 1);
              isRun = true;
              dashTime += Time.deltaTime;
              xSpeed = speed;
          }
          else if (horizontalKey < 0)
          {
              transform.localScale = new Vector3(-1, 1, 1);
              isRun = true;
              dashTime += Time.deltaTime;
              xSpeed = -speed;
          }
          else
          {
              isRun = false;
              xSpeed = 0.0f;
              dashTime = 0.0f;
          }

          //前回の入力からダッシュの反転を判断して速度を変える
          if (horizontalKey > 0 && beforeKey < 0)
          {
              dashTime = 0.0f;
          }
          else if (horizontalKey < 0 && beforeKey > 0)
          {
              dashTime = 0.0f;
          }

          beforeKey = horizontalKey;
          xSpeed *= dashCurve.Evaluate(dashTime);
          beforeKey = horizontalKey;
          return xSpeed;
     }

     /// <summary>  
     /// アニメーションを設定する  
     /// </summary>  
     private void SetAnimation()
     {
          anim.SetBool("jump", isJump || isOtherJump);
          anim.SetBool("ground", isGround);
          anim.SetBool("run", isRun);
     }

     /// <summary>  
     /// ダウンアニメーションが終わっているかどうか  
     /// </summary>  
     /// <returns>終了しているかどうか</returns>
     public bool IsDownAnimEnd()
     {
          if (isDown && anim != null)
          {
              AnimatorStateInfo currentState = anim.GetCurrentAnimatorStateInfo(0);
              if (currentState.IsName("player_down"))
              {
                  if (currentState.normalizedTime >= 1)
                  {
                      return true;
                  }
              }
          }
          return false;
     }

     /// <summary>  
     /// コンティニューする  
     /// </summary>  
     public void ContinuePlayer()
     {
          isDown = false;
          anim.Play("player_stand");
          isJump = false;
          isOtherJump = false;
          isRun = false;
          isContinue = true;
          GManager.instance.PlaySE(continueSE);
     }

     #region//接触判定  
     private void OnCollisionEnter2D(Collision2D collision)
     {
          if (!GManager.instance.isStageClear && !GManager.instance.isGameOver)
          {
              //敵
              if (collision.collider.tag == enemyTag)
              {
                  //踏みつけ判定になる高さ
                  float stepOnHeight = (capcol.size.y * (stepOnRate / 100f));
                  //踏みつけ判定のワールド座標
                  float judgePos = transform.position.y - (capcol.size.y / 2f) + stepOnHeight;

                  foreach (ContactPoint2D p in collision.contacts)
                  {
                      if (p.point.y < judgePos)
                      {
                          ObjectCollision o = collision.gameObject.GetComponent<ObjectCollision>();
                          if (o != null)
                          {
                              jumpPos = transform.position.y; //ジャンプした位置を記録する
                              otherJumpHeight = o.boundHeight;    //踏んづけたものから跳ねる高さを取得する
                              otherJumpSpeed = o.jumpSpeed;       //踏んづけたものから跳ねる速さを取得する New
                              o.playerStepOn = true;        //踏んづけたものに対して踏んづけた事を通知する
                              isOtherJump = true;
                              isJump = false;
                              jumpTime = 0.0f;
                          }
                          else
                          {
                              Debug.Log("ObjectCollisionが付いてないよ!");
                          }
                      }
                      else
                      {
                          anim.Play("player_down");
                          isDown = true;
                          GManager.instance.SubHeartNum();
                          GManager.instance.PlaySE(downSE);
                          break;
                      }
                  }
              }
              else if (collision.collider.tag == jumpStepTag)
              {
                  //踏みつけ判定になる高さ
                  float stepOnHeight = (capcol.size.y * (stepOnRate / 100f));
                  //踏みつけ判定のワールド座標
                  float judgePos = transform.position.y - (capcol.size.y / 2f) + stepOnHeight;

                  foreach (ContactPoint2D p in collision.contacts)
                  {
                      if (p.point.y < judgePos)
                      {
                          ObjectCollision o = collision.gameObject.GetComponent<ObjectCollision>();
                          if (o != null)
                          {
                              jumpPos = transform.position.y; //ジャンプした位置を記録する
                              otherJumpHeight = o.boundHeight;    //踏んづけたものから跳ねる高さを取得する
                              otherJumpSpeed = o.jumpSpeed;       //踏んづけたものから跳ねる速さを取得する New
                              o.playerStepOn = true;        //踏んづけたものに対して踏んづけた事を通知する
                              isOtherJump = true;
                              isJump = false;
                              jumpTime = 0.0f;
                          }
                          else
                          {
                              Debug.Log("ObjectCollisionが付いてないよ!");
                          }
                      }
                  }
              }
              //動く床
              else if (collision.collider.tag == moveFloorTag)
              {
                  //踏みつけ判定になる高さ
                  float stepOnHeight = (capcol.size.y * (stepOnRate / 100f));
                  //踏みつけ判定のワールド座標
                  float judgePos = transform.position.y - (capcol.size.y / 2f) + stepOnHeight;
     
                  foreach (ContactPoint2D p in collision.contacts)
                 {
                     //動く床に乗っている
                     if (p.point.y < judgePos)
                     {
                         moveObj = collision.gameObject.GetComponent<MoveObject>();
                     }
                 }
             }
         }
     }

     private void OnCollisionExit2D(Collision2D collision)
     {
          if (collision.collider.tag == moveFloorTag)
          {
              //動く床から離れた
              moveObj = null;
          }
     }
     #endregion
 }
jump step

はい、完成しました。

ジャンプ台が跳べる高さや飛ぶ速さなどはインスペクターで調整してください。

また、敵についていたスクリプトをいじったので、敵のインスペクターも変更するのを忘れないでください。

敵を何体も置いてしまっている人は敵をプレハブ化して元を変更したら全部に変更が行き届くようにしましょう。

何かうまくいかない事があった場合は↓の記事を参考にしてみてください

最低限↓の動画の要件を満たしていない質問は受けかねるので、ご理解ください。

デバッグのやり方【Unity初心者入門講座】【ゲームの作り方】#31

また、筆者も間違えることはありますので、何か間違っている点などありましたら、動画コメント欄にでも書いていただけるとありがたいです。



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