質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

bool値を返すだけなのに処理が異なる

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 192

Rpt297

score 6

いつも大変お世話になっております。
落ちモノパズルを作成していています。
以下のプログラムはミノ回転時に縦、横の壁を貫通しないように座標を戻す処理とその座標にミノがある場合は逆回転させて元に戻す処理(回転させない)を行おうとしています。
壁を貫通しない処理はできているのですが、回転させない処理を入れるとなぜか壁を貫通するようになってしまいます。
回転させないの内容は各ブロックの現在の座標位置にミノがある場合はfalseを、ない場合はtrueを返すだけなので、何かの値を変えるという処理は行っていません。なぜこのような現象が起こるのか教えていただけると幸いです。

試したこと
処理順番を縦方向の防止、横方向、回転させないにすると壁は貫通しないが、ミノを貫通するので動いてない。
//回転させない を消せば壁は貫通しない→回転させないのせいでおかしくなったと予想。
//回転させない の中の処理をコメントアウトしても壁は貫通する。

        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.RotateAround(transform.TransformPoint(rote_Pos), new Vector3(0, 0, 1), 90);


            //縦方向の防止
            if (!SideCheck())
            {
                transform.position += new Vector3(0, 1, 0);
            }

            //回転させない
            if (!Table_Check())
            {
                transform.RotateAround(transform.TransformPoint(rote_Pos), new Vector3(0, 0, 1), -90);
            }

      //横方向
            if (!SideCheck() && Vel_Check())
            {
                transform.position += new Vector3(1, 0, 0);

                if (!SideCheck() && Vel_Check())
                {
                    transform.position += new Vector3(1, 0, 0);
                }
            }

            if (!SideCheck() && !Vel_Check())
            {
                transform.position += new Vector3(-1, 0, 0);

                if (!SideCheck() && !Vel_Check())
                {
                    transform.position += new Vector3(-1, 0, 0);
                }
            }

    }

    bool SideCheck()
    {
        foreach(Transform mino_Pos in transform)
        {
            //配列に正しく格納させるためにRoundToIntで四捨五入
            int mino_X = Mathf.RoundToInt(mino_Pos.transform.position.x);
            int mino_Y = Mathf.RoundToInt(mino_Pos.transform.position.y);

            Vector2 mino_Vet = new Vector2(mino_X, mino_Y);

            if (CheckInside(mino_Vet) == false)
            {
                return false;
            }
        }

        return true;
    }

    //true : 配列は空  false : 配列に何かが格納されている を返す
    bool Table_Check()
    {
        foreach (Transform mino_Pos in transform)
        {
            int mino_X = Mathf.RoundToInt(mino_Pos.transform.position.x);
            int mino_Y = Mathf.RoundToInt(mino_Pos.transform.position.y);

            if (mino_Table[mino_Y, mino_X] != null)
            {
                return false;
            }

        }

        return true;
    }

    //ミノの現在位置をCheck true:内側  false:外側
    bool CheckInside(Vector2 now_Pos)
    {
        return now_Pos.x > -1 && 
                  now_Pos.x < 10 && 
                     now_Pos.y > -1;
    }

    //true : 左回転   false : 右回転
    bool Vel_Check()
    {
        foreach(Transform mino_Pos in transform)
        {
            Vector2 cuurent_Pos = mino_Pos.position;
            if (!Vel(cuurent_Pos)==false)
            {
                return false;
            }
        }
        return true;
    }
    //左右の判定 true : 右 false : 左
    bool Vel(Vector2 now_Pos)
    {
        return now_Pos.x > 1;
    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • bboydaisuke

    2020/07/05 05:52 編集

    よくわからないですけど、

    //回転させない を消せば壁は貫通しない→回転させないのせいでおかしくなったと予想。
    //回転させない の中の処理をコメントアウトしても壁は貫通する。

    というのは、

    if (!Table_Check())
    {
    transform.RotateAround(transform.TransformPoint(rote_Pos), new Vector3(0, 0, 1), -90);
    }

    の部分を削除したら「壁は貫通しない」けど、この部分をコメントアウトすると「壁を貫通する」と、コメントアウトと削除で異なる動きをする、ということですか?

    キャンセル

  • Rpt297

    2020/07/05 09:37

    if (!Table_Check())
    {
     transform.RotateAround(transform.TransformPoint(rote_Pos), new Vector3(0, 0, 1), -90);
    }
    だと壁を貫通したので、中の処理が悪さをしてると思い、
    if (!Table_Check())
    {
     //transform.RotateAround(transform.TransformPoint(rote_Pos), new Vector3(0, 0, 1), -90);
    }
    このように処理内容をコメントアウトしたのにも関わらず壁を貫通したということです。
    なのでTable_Checkメソッドはbool値を返すだけなのになぜ壁を貫通するようになってしまったのかということが知りたいです。
    if (!Table_Check())
    {
     transform.RotateAround(transform.TransformPoint(rote_Pos), new Vector3(0, 0, 1), -90);
    }
    を全部消すと壁は貫通しないので上記の処理だけが悪さをしてる思ったということです。
    わかりにくい文章で申し訳ございません。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る