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

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

ただいまの
回答率

90.52%

  • C#

    7080questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    3972questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

unityでポーズ画面を作りたいのですが

解決済

回答 1

投稿 編集

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

manmanJ

score 2

ポーズ画面をつくりたいのですが
ポーズ画面の項目が一瞬うつるだけになります

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class menu02 : MonoBehaviour
{

    [SerializeField] UnityEngine.UI.Text textbox01;
    [SerializeField] UnityEngine.UI.Text textbox02;
    [SerializeField] UnityEngine.UI.Text textbox03;
    [SerializeField] UnityEngine.UI.Image image01;
    [SerializeField] UnityEngine.UI.Image image02;
    public int Game_01 = 0;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        //入力判定のみ行う。実際の表示・非表示は別メソッドへ
        if (Input.GetButtonDown("メニュー"))
        {
            //非表示中なら表示、そうでない場合は非表示処理を呼ぶ
            if (textbox01.text == "")
            {
                Show();
            }
            else
            {
                Hide();
            }
        }
        if (Input.GetButtonDown("Jump"))
        {
            //問答無用で非表示
            Hide();
        }
    }

    //表示する処理
    private void Show()
    {
        textbox01.text = "メニュー";
        textbox01.enabled = true;
        textbox02.text = "メンバー";
        textbox02.enabled = true;
        textbox03.text = "閉じる";
        textbox03.enabled = true;
        image01.CrossFadeColor(targetColor: Color.red, duration: 0f, ignoreTimeScale: true, useAlpha: true);
        image01.enabled = true;
        image02.CrossFadeColor(targetColor: Color.yellow, duration: 0f, ignoreTimeScale: true, useAlpha: true);
        image02.enabled = true;
        image02.CrossFadeColor(targetColor: Color.red, duration: 1f, ignoreTimeScale: true, useAlpha: true);
    }

    //非表示にする処理
    private void Hide()
    {
        textbox01.text = "";
        textbox01.enabled = false;
        textbox02.text = "";
        textbox02.enabled = false;
        textbox03.text = "";
        textbox03.enabled = false;
        image01.CrossFadeAlpha(0, 0f, true);
        image01.enabled = false;
        image02.CrossFadeAlpha(0, 0f, true);
        image02.enabled = false;
    }
}


if文とfor文もまだ少し理解できてません。
このコードを簡素化か修正できたらおねがいします。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

if (Input.GetButtonDown("メニュー"))の使い方の問題だと思われます。

<現在の挙動>
初期値:Game_01 = 0
if (Game_01 < 1):条件満たす
image01.CrossFadeAlpha(0, duration, true);:消去される
if (Input.GetButtonDown("メニュー")):入力あった場合
Game_01 += 1;:カウント追加
if (Game_01 > 0):確実に条件満たす(おかしい)
image01.CrossFadeColor(~):表示される
if (Input.GetButtonDown("メニュー")) { Game_01 -= 1; }:入力があるので再度非表示になる(おかしい)
次フレーム:Game_01 = 0

コードの流れが分かりづらいので、もし私が直すとしたら下記のような感じにするかなと。
(Game_01も不要っぽかったので消してしまっています、必要なら追加・調整お願いします)

void Update()
{
    //入力判定のみ行う。実際の表示・非表示は別メソッドへ
    if (Input.GetButtonDown("メニュー"))
    {
        //非表示中なら表示、そうでない場合は非表示処理を呼ぶ
        if (textbox01.text == "") {
            Show();
        } else {
            Hide();
        }
    }
    if (Input.GetButtonDown("Jump"))
    {
        //問答無用で非表示
        Hide();
    }
}

//表示する処理
private void Show() {
    textbox01.text = "メニュー";
    textbox02.text = "メンバー";
    textbox03.text = "閉じる";
    image01.CrossFadeColor(targetColor: Color.red, duration: 0f, ignoreTimeScale: true, useAlpha: true);
    image02.CrossFadeColor(targetColor: Color.yellow, duration: 0f, ignoreTimeScale: true, useAlpha: true);
    image02.CrossFadeColor(targetColor: Color.red, duration: 1f, ignoreTimeScale: true, useAlpha: true);
}

//非表示にする処理
private void Hide() {
    textbox01.text = "";
    textbox02.text = "";
    textbox03.text = "";
    image01.CrossFadeAlpha(0, 0f, true);
    image02.CrossFadeAlpha(0, 0f, true);
}

なお、質問内のコードのインデントが外れて非常に見にくいです。コード部分は「```」で囲んでください。
こちらもご確認ください。→質問するときのヒント|teratail(テラテイル)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/24 00:15

    質問を変更しました
    回答ありがとうございます!

    キャンセル

  • 2018/07/24 17:11 編集

    if (Input.GetButtonDown("Jump"))
    if (Input.GetButtonDown("メニュー"))
    この両方でメニューを閉じたいのですが
    書いてもらった
    if (Input.GetButtonDown("Jump"))
    {
    //問答無用で非表示
    Hide();
    }
    の後に
    if (Input.GetButtonDown("メニュー"))
    でいいですか?
    あと最後のshowとhideの文の必要性がわからないのですが
    どうゆう役割があるのでしょう?
    と質問の消し方はできるのですか?

    キャンセル

  • 2018/07/24 17:36 編集

    やりたいことの確認をさせてください。
    「"メニュー"ボタンを押した時、ポーズ画面が非表示なら表示する」
    「"メニュー"ボタンを押した時、ポーズ画面が表示中なら非表示にする」
    「"Jump"ボタンを押した時、ポーズ画面を非表示にする」
    でいいですか?
    もしそうなら新たにif (Input.GetButtonDown("メニュー"))を追加する必要はありません。
    既存のif (Input.GetButtonDown("メニュー"))の中にあるif文でポーズ画面の表示状態を判定、表示非表示の命令を出しているためです。

    ---

    >showとhideの文の必要性がわからない
    とりあえず回答のスクリプトを編集しました。これで全文になりますので(コピペ元に誤字等無ければ)そのまま動くと思います。

    「void 〜 () { }」となっている領域は「メソッド」と言います。(StartとUpdateもメソッドです)
    詳しい話は下記を確認ください。
    https://qiita.com/kenta71/items/3629ae1fa47eba9a38d7

    超ざっくり言うと、「Show();」と書いてある行に差し掛かったら、「private void Show() { }」の中身が実行され、その後同じ場所に戻ってきます。
    つまり

    if (textbox01.text == "") {
    Show();
    }

    ↑と↓は同じ意味のプログラムです。

    if (textbox01.text == "") {
    textbox01.text = "メニュー";
    textbox02.text = "メンバー";
    textbox03.text = "閉じる";
    image01.CrossFadeColor(targetColor: Color.red, duration: 0f, ignoreTimeScale: true, useAlpha: true);
    image02.CrossFadeColor(targetColor: Color.yellow, duration: 0f, ignoreTimeScale: true, useAlpha: true);
    image02.CrossFadeColor(targetColor: Color.red, duration: 1f, ignoreTimeScale: true, useAlpha: true);
    }

    if文の中にぞろぞろと長い行を書くと見通しが悪くなってしまったり、同じ内容を別の場所に何度も繰り返して書くと後で修正が大変です。
    なのでプログラムでは適宜メソッドを分けておくのが推奨されています。
    今回は非表示にする処理(Hide)を2箇所で呼び出す為にメソッド化。
    ついでに見通しを良くする為に表示する処理(Show)もメソッド化しました。

    ---

    質問の削除は以下をご覧ください。
    https://teratail.com/help#delete-question

    キャンセル

  • 2018/07/24 18:18 編集

    ありがとうございます。

    private void Show()
    {
    textbox01.text = "メニュー";
    textbox01.enabled = true;

    true、falseを入れることで問題なく動作できるようになりました!

    メニューからメンバーやスキルなどを選択することでメニュー中に新しくスキルメニューなどを
    作るつもりでGame_01 = 0を作っていたのですが、必要はないですか?

    あとtextbox01.text = "";などはまだ初心者なので
    覚えるためとこれからメニューからメニューの時に変更するかもとゆうことなのでよろしくお願いします

    キャンセル

  • 2018/07/24 18:53

    >Game_01 = 0を作っていたのですが、必要はないですか?
    何が最適かは「どんな風に画面が表示非表示されるのか」によるので一概には言えません。
    「スキルメニューが開く時、ポーズ画面は閉じる」とかなら必要無いでしょうし、「現在どの画面が開いているかによって同じボタンでも機能が変わる」とかだと必要かもしれません。

    そもそもintなのかboolなのか、変数を何個作るのか、なども考える必要があると思います。
    (「nowWindow = 1」のように「1つの変数で今開いている画面を示す(0〜4のどれかが入る)」という方法もあれば、「isPauseWindow = true; isSkillWindow = false;」のように「複数のbool変数でそれぞれの表示状態を示す」という方法もあります)

    あくまで私の回答は例でしかないので、お好きに変えてください。
    スクリプトの意味を理解しつつ、どう書いたら効率的か・分かりやすいかを考えながらトライ&エラーを続けると上達が早いかと思います。

    キャンセル

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

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

関連した質問

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

  • C#

    7080questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    3972questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。