0
0

More than 1 year has passed since last update.

【テトリス作成⑨】ゲームオーバーの実装について深掘る

Last updated at Posted at 2022-11-18

こちらを元に解説しています。
https://qiita.com/hanatan079/items/3675855784e14acda119

★★★★★随時更新★★★★★
2022.11.22追記
2022.12.3追記
2022.12/9追記
★★★★★★★★★★★★★★★

(ライブラリ)
   【シーン移動】

using UnityEngine.SceneManagement;

(変数)
   【パネル格納】

    [SerializeField]
    private GameObject gameOverPanel;

   【ゲームオーバー判定】

    bool gameOver;    

   【ゲームオーバーパネルの非表示設定(スタート)】

        ①if (gameOverPanel.②activeInHierarchy)
        {
            ③gameOverPanel.SetActive(false);
        }

①ゲームオーバーパネルが現在表示されているのか
②Hierarchyで表示されているか
falseならgameOverPanelを非表示にする
パネルが表示 されているなら、gameOverPanelオブジェクトを非表示にする

(関数)
   【ゲームオーバーになったらパネルを表示する】

           void GameOver()
    {
        activeBlock.MoveUp();
        if (!gameOverPanel.activeInHierarchy)
        {
            gameOverPanel.SetActive(true);
        }
        gameOver = true;
    }

 ①activeBlockを一段上にあげる
 ②ゲームオーバーパネルの非表示設定と反対の実装
   !否定→非表示だったら表示する

   【シーンを再読み込みする(ボタン読み込み)】

    public void Replay()
    {
       ① SceneManager.LoadScene(0);
    }

①File > BildSetteing のサンプルシーンが0番目になっている
   サンプルシーンを表示したい為0を入れる

【ゲームオーバーの時はプレイヤーの受付をしないようにする(アップデート)】

        if ①(gameOver)
        {
            return;
        }

①ゲームオーバーになったらパネルを表示する関数の受け取り

【線を超えたかどうか(Board.cs)】

    ①public bool OverLimit(Block block)
    {
        ②foreach (Transform item in block.transform)
        {
            ③if (item.transform.position.y >= heigt - header)
            {
               ④ return true;
            }
        }
        return false;
    }

①他から呼び出し可能なオーバーリミット関数
②ブロックがボードの枠からはみ出ていないかの確認
③線を超えたかどうか
   heigt - header現在表示されているブロック
   よりyが高い=ボードからはみ出ていることになる
④超えた場合

【OverLimitを呼び出し(GameManeger.cs)】

(見本)
        //下に動かす
        else if (Input.GetKey(KeyCode.S) && (Time.time > nextKeyDownTimer) || (Time.time > nextdropTimer))
        {
            activeBlock.MoveDown();

            nextKeyDownTimer = Time.time + nextKeyDownInterval;
            nextdropTimer = Time.time + dropInterval;

            if (!board.CheckPosition(activeBlock))
            {
                //⑨OverLimitを呼び出し
                if (board.OverLimit(activeBlock))
                {
                    GameOver();
                }
                else
                {
                //底についた時の処理
                BottomBoard();
                }
            }
        }

解説

//追記
                ①if (board.OverLimit(activeBlock))
                {
                   ② GameOver();
                }
                else
                {
                ③
                }

①activeBlockが底についているのかの判定
②true =はみ出ている。その為GameOverにしたい
③GameOverでない場合、底についた時の処理をする

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0