yuta_san0629
@yuta_san0629 (蜜柑 猫)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Unityボタンがクリックできない

Unityのボタンがクリックできません。

超初心者であり、原因の究明のやり方がわからないため、ここで質問します。すいません。
ちなみに、Unity ボタン 反応しないでググっては見たのですが刺さる物はありませんでした。

YouTubeで初心者向けにテトリスの作り方と言った内容のものです
https://youtu.be/IbHhV_-8VxQ?si=FiJBMUtspZ8CHpOl

バージョンはUnity2022.3.6f1です
ちなみに、参考動画の使っていたバージョンは2020.3.12f1です

変わらないだろうと思い使ってしまいました。

ただ、最後の最後(2:00:00当たりから)
ゲームオーバー画面となり、リトライボタンを押す。という最後の最後ができず困っております。
scriptもUnityにもエラーが出ず、何が原因なのかがわからない状態です。
何が言いたいのと言えば

『リトライボタンが押せない』

です。

おかしな点として今現状いえるのは
動画では、↓のように[GameManager] > [Restart()]と選択できるのですが

スクリーンショット 2024-05-30 234512.png

スクリーンショット 2024-05-30 234350.png

↑僕の画面では[newBehaviourScript] > [Restart()]となっており、結果画面は出るもののボタンが反応しません。

何が原因なのかわからないためスクショを張ります

ヒエラルキー
スクリーンショット 2024-05-31 000606.png

Canvas
スクリーンショット 2024-05-31 014340.png

GameOverPanel
スクリーンショット 2024-05-31 014554.png

GameOverText
スクリーンショット 2024-05-31 014911.png

RetryButton
スクリーンショット 2024-05-31 015031.png

Text(TMP)
スクリーンショット 2024-05-31 015104.png

情報が多くてすいません。

あとGameManagerのscriptです。
一番下にRestartの変数?関数?です

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//シーン遷移のライブラリ

public class NewBehaviourScript : MonoBehaviour
{
    //変数の作成//
   

    Spawner spawner;//スポナー
    Block activeBlock; //生成されたブロック格納
    

    [SerializeField]
    private float dropInterval = 0.25f;//次にブロックが落ちるまでのインターバル時間
    float nextdropTimer;//次にブロックが落ちるまでの時間


    //変数の作成//
    //ボードスクリプトを格納

    Board board;


    //変数の作成//
    //入力受付タイマ―(3種類)

    float nextKeyDownTimer, nextKeyLeftRightTimer, nextKeyRotateTimer;


    //入力インターバル(3種類)

    [SerializeField]
    private float nextKeyDownInterval, nextKeyLeftRightInterval, nextKeyRotateInterval;


    //変数の作成//
    //パネルの格納

    [SerializeField]
    private GameObject gameOverPanel;


    //ゲームオーバー判定

    bool gameOver;


    //スポナーオブジェクトをスポナー変数に格納するコードの記述

    private void Start()
    {
        spawner = GameObject.FindObjectOfType<Spawner>();


        //ボードを変数に格納する

        board = GameObject.FindObjectOfType<Board>();



        spawner. transform.position = Rounding.Round(spawner.transform.position);


        //タイマーの初期設定

        nextKeyDownTimer = Time.time + nextKeyDownInterval;
        nextKeyLeftRightTimer = Time.time + nextKeyLeftRightInterval;
        nextKeyRotateTimer = Time.time + nextKeyRotateInterval;


        //スポナークラスからブロック生成関数を読んで変数に格納する
        if (!activeBlock) 
        {
            activeBlock = spawner.SpawnBlock();
        }


        //ゲームオーバーパネルの非表示設定
        if(gameOverPanel.activeInHierarchy)
        {
            gameOverPanel.SetActive(false);
        }



    }



    private void Update()
    {
        if (gameOver)
        {
            return;
        }



        PlayerInput();



    }



    //関数の作成//
    //キーの入力を検知してブロックを動かす関数
    //ボードの底に着いた時に次のブロックを生成する関数

    void PlayerInput()
    {
        if (Input.GetKey(KeyCode.D) && (Time.time > nextKeyLeftRightTimer)
            || Input.GetKeyDown(KeyCode.D))
        {
            activeBlock.MoveRight();//右に動かす


            nextKeyLeftRightTimer = Time.time + nextKeyLeftRightInterval;

            if (!board.CheckPosition(activeBlock))
            {
                activeBlock.MoveLeft();
            }

        }
        else if (Input.GetKey(KeyCode.A) && (Time.time > nextKeyLeftRightTimer)
            || Input.GetKeyDown(KeyCode.A))
        {
            activeBlock.MoveLeft();//左に動かす


            nextKeyLeftRightTimer = Time.time + nextKeyLeftRightInterval;

            if (!board.CheckPosition(activeBlock))
            {
                activeBlock.MoveRight();
            }
        }
        else if(Input.GetKey(KeyCode.E) && (Time.time > nextKeyRotateTimer))
        {
            activeBlock.RotateRight();
            nextKeyRotateTimer = Time.time + nextKeyRotateInterval;

            if (!board.CheckPosition(activeBlock))
            {
                activeBlock.RotateLeft();
            }

        }
        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))
            {
                if (board.OverLimit(activeBlock))
                {
                    GameOver();
                }
                else
                {
                    //底に着いた時の処理
                    BottomBoard();
                }

            }
        }

    }


    void BottomBoard()
    {
        activeBlock.MoveUp();
        board.SaveBlockIngrid(activeBlock);

        activeBlock = spawner.SpawnBlock();

        nextKeyDownTimer = Time.time;
        nextKeyLeftRightTimer = Time.time;
        nextKeyRotateTimer = Time.time;

        board.ClearAllRows();//埋まっていれば削除する


    }



    //関数の作成//
    //ゲームオーバーになったらパネルを表示する

    void GameOver()
    {
        activeBlock.MoveUp();

        //ゲームオーバーパネルの非表示設定
        if (!gameOverPanel.activeInHierarchy)
        {
            gameOverPanel.SetActive(true);
        }


        gameOver = true;


    }



    //シーンを再読み込みする(ボタン押下で呼ぶ)

    public void Restart()
    {
        SceneManager.LoadScene(0);
    }



}

物凄い量になって申し訳ないです。

0

3Answer

回答ではないですが、タグに "入門" のような語句をつけると検索に引っかからないので、一般的な名称のタグをつけてください。検索のノイズとなり、タグをフォローしている有識者の目に触れる機会を失います。

初心者タグも、正直意味がないのであまりつけなくていいと思います。わざわざ初心者+自分の知識の範疇のタグで検索する人って、おそらく殆ど居ないのではないかと思われます。初心者と書いてあるからといって回答内容が変わる訳ではないですし、正しいタグ付けをして、解決に必要な情報がきちんと質問文に記載されていれば、自然と回答はつきやすくなります。

名称未定-1.jpg

名称未定-2.jpg

1Like

Comments

  1. @yuta_san0629

    Questioner

    ありがとうございます!
    今後の参考にします

私も作ったボタンが反応しなくて困り果てることがよくあります。
ただの勘ですが、「GameOverText」オブジェクトがボタンと被って反応を邪魔しているんじゃないかと思います。以下のサイトの「第二位 ボタンの上に覆いかぶさるUIはないか?」を参考にしてみてください。

1Like

Comments

  1. @yuta_san0629

    Questioner

    コメントありがとうございます。
    実はこれ一度試そうとしたんですけど、第1位 RaycastTargetがOFFではないか?の部分で、EventSystemにカーソルを合わせると詳細情報が出てくる画面のやり方が分らず、またどう調べていいのか、どう聞いたらよいのかも分からず結局試さずじまいでした。
    今、2位以降全てを試したのですが全く効果無しと言った感じです

↑僕の画面では[newBehaviourScript] > [Restart()]となっており

この部分は、C#Scriptのクラス名が反映されていると思います。
つまり、今回は5行目の
public class NewBehaviourScript : MonoBehaviour{
のNewBehaviourの部分をGameManagerに変更すると、お手本のサイトと同じになると思います!

1Like

Comments

  1. あとは、ボタンが反応しない件については、Debug.logを使って、ボタンが押された時に何かを出力するようにし、どこが原因か特定するのが良いですよ!

Your answer might help someone💌