見出し画像

大きなバグ修正

こちらの更新は久々になります。11月入ってから長い間詰まっていた箇所が大方片付いたのでまとめて報告していきたいと思います。

バグ一覧

引っかかり状態で再ジャンプできない事がある

公開中のバージョンでもかなりの頻度で起きていたバグです。操作性に支障が生まれていたので絶対に直す必要がありました。

明確に原因が特定できた訳ではないのですが、ジャンプする際の条件が原因だと推測→該当する箇所の書き換えでバグは起こらなくなっています。

//修正前
void Update()
   {
       //ジャンプ動作
       if (Input.GetKeyDown(KeyCode.Space) && this.rigid2D.velocity.y == 0)
       {
           this.animator.SetTrigger("JumpTrigger");
           this.rigid2D.AddForce(transform.up * this.jump);
           //ジャンプ効果音再生
           sound01.PlayOneShot(sound01.clip);
       }

この中の"this.rigid2D.velocity.y == 0"ですね。これは無限にジャンプを防止するための条件なのですが、ここの条件を別に作っていた地面判定を利用したものに変更しました。

これ『Unityの教科書』から写したコードで処理自体は問題無いはずなのですが、僅かでもy軸に力がかかっていたらジャンプできないので「足場などにひっかかる」アクションと相性が良くなかったのかもしれません。

//修正後
void Update()
   {

       GroundCheck();

   }

void FixedUpdate()
   {  
       //ジャンプ処理
       if(Input.GetKeyDown(KeyCode.Space) && goJump)
       {
           this.animator.SetTrigger("Jump");
           rigid2D.velocity = new Vector2(rigid2D.velocity.x, 0);
           this.rigid2D.AddForce(transform.up * this.jump);
           sound01.PlayOneShot(sound01.clip);//効果音

       }

private void GroundCheck()
   {

       //Debug.Log(isGroundEnter + " " + isGroundStay +" "+ isGroundExit);
       //着地判定
       if (isGroundEnter || isGroundStay)
       {
           isGround = true;
           goJump = true;

       }
       else if (isGroundExit)
       {
           isGround = false;
           goJump = false;

       }
       //着地しているかのフラグをリセット
       isGroundEnter = false;
       isGroundStay = false;
       isGroundExit = false;

   }

   //地面判定
   void OnTriggerStay2D(Collider2D collision)
   {
       if(collision.tag == groundTag)
       {
           //Debug.Log("地面に触れています");
           isGroundStay = true;
       }

   }

   //地面判定
   void OnTriggerExit2D(Collider2D collision)
   {
       if (collision.tag == groundTag)
       {
           //Debug.Log("地面から出ました");
           isGroundExit = true;
       }

   }

   void OnTriggerEnter2D(Collider2D collision)
   {

       //地面判定
       if (collision.tag == groundTag)
       {
           //Debug.Log("地面に触れました");
           isGroundEnter = true;
       }

修正後。見た目が異常に増えましたがジャンプの処理自体は後半の条件が変わっただけです。GroundCheck()で地面に触れているか判断して、その際"goJump"でジャンプできるか否か判断させています。

地面判定はこちらのブログより

ジャンプの条件はこちらのブログを参考にさせて頂きました。


待機アニメーションが再生されない

これ上記の問題を探っている際の仮説として"アニメーションの移行が上手くいってないからでは?"と弄りだした事で起きた問題なのですが、関係ありませんでした。

これも教科書から写したコードが原因。ちゃんと読もうね。

    void FixedUpdate()
    {
        //プレイヤーの速度に合わせてアニメーション速度の変更
        if(this.rigid2D.velocity.y == 0)
        {
           this.animator.speed = speedx / 2.0f;
        } else
        {
           this.animator.speed = 1.0f;
        }
    }

原因となった箇所。本来なら入力を止めてプレイヤーが減速し始めた段階でアニメーションの再生速度を"移動速度÷2"にしてくれるもの。プレイヤーが動いていない時に再生したい待機アニメーションはこの処理の想定外ということだと思います。

今回はこのプログラムそのものを取り除きました。本当は待機アニメーション以外はこの処理をしたかったのですが致し方ありません。

アニメーションの自体はこんな感じに。ちゃんと動いてます。

これはこちらの動画を参考にさせて頂きました。

日本語資料も探したのですが上手く理解できなかったり…

Unityはゲームエンジンの中だと日本語人口ある方ですが、やっぱり英語でググるのは大切ですね。英語圏の方が情報に溢れてます。


何もない地面で止まってしまう、二重三重にスコアがカウントされる

メガビット、シブヤピクセルでの展示でも度々起こっていた問題です。両方当たり判定が原因でした。

スコアのバグ

これは旧verの複数ある当たり判定に同時にアイテムが触れることで二重三重に衝突判定が出ていたようです。文章だと分かりにくいので画像をば。

当たり判定_解説

これを回避するためにColliderを1つのPolygonColliderにまとめました。

アタリ判定比較

スコアの重複は解決です。しかし、これを直したことで何もない地面で止まってしまう問題が起こってしまいました。

何もない地面で止まってしまう問題

原因はTilemapのCollider。どうやら隣接するマス同士が僅かにずれている箇所があり、見えないズレに引っかかってしまう模様。ほぼ推測ですね…

これはTilemapにCompositeCollider2Dを追加することで解決しました。1マス1マスにわざわざ判定を持たせなければ良い、という話です。

画像4

Rigidbodyが付いたことにより地面の判定がTriggerで取れなくなったので、Collisionで取れるように修正します。

追記:変更の必要はありませんでした。CompositeCollider2D適用後は無茶苦茶判定が細い線になっているため判定が消えたと勘違いしたようです。

画像5

Composite Colliderに関してはこちらを参考にさせて頂きました。


今後の進展について

年内に2つ目のワールドの制作、そろそろゲームの背景、コンセプトだったりを作っていこうと思っています。余裕があればいい加減音楽の方も手を出しておきたいです。

リリースの方は来年(いつかは未定)って形になりそう。最低限夏までには出したいですが…色々抱え込みがちな人間なので就職活動入ってくると見通しが効かないんですよねー…

とりあえず主な報告はここまで。

バグを修正したバージョンも近日中にunityroomの方に上げる予定です。出来次第、Twitterでお知らせします。

では

この記事が気に入ったらサポートをしてみませんか?