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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2380閲覧

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

manmanJ

総合スコア19

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/07/23 06:41

編集2018/07/24 09:34

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

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文もまだ少し理解できてません。
このコードを簡素化か修正できたらおねがいします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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も不要っぽかったので消してしまっています、必要なら追加・調整お願いします)

C#

1void Update() 2{ 3 //入力判定のみ行う。実際の表示・非表示は別メソッドへ 4 if (Input.GetButtonDown("メニュー")) 5 { 6 //非表示中なら表示、そうでない場合は非表示処理を呼ぶ 7 if (textbox01.text == "") { 8 Show(); 9 } else { 10 Hide(); 11 } 12 } 13 if (Input.GetButtonDown("Jump")) 14 { 15 //問答無用で非表示 16 Hide(); 17 } 18} 19 20//表示する処理 21private void Show() { 22 textbox01.text = "メニュー"; 23 textbox02.text = "メンバー"; 24 textbox03.text = "閉じる"; 25 image01.CrossFadeColor(targetColor: Color.red, duration: 0f, ignoreTimeScale: true, useAlpha: true); 26 image02.CrossFadeColor(targetColor: Color.yellow, duration: 0f, ignoreTimeScale: true, useAlpha: true); 27 image02.CrossFadeColor(targetColor: Color.red, duration: 1f, ignoreTimeScale: true, useAlpha: true); 28} 29 30//非表示にする処理 31private void Hide() { 32 textbox01.text = ""; 33 textbox02.text = ""; 34 textbox03.text = ""; 35 image01.CrossFadeAlpha(0, 0f, true); 36 image02.CrossFadeAlpha(0, 0f, true); 37}

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

投稿2018/07/23 09:19

編集2018/07/24 08:31
sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manmanJ

2018/07/23 15:15

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

2018/07/24 08:12 編集

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

2018/07/24 08:37 編集

やりたいことの確認をさせてください。 「"メニュー"ボタンを押した時、ポーズ画面が非表示なら表示する」 「"メニュー"ボタンを押した時、ポーズ画面が表示中なら非表示にする」 「"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
manmanJ

2018/07/24 09:33 編集

ありがとうございます。 private void Show() { textbox01.text = "メニュー"; textbox01.enabled = true; true、falseを入れることで問題なく動作できるようになりました! メニューからメンバーやスキルなどを選択することでメニュー中に新しくスキルメニューなどを 作るつもりでGame_01 = 0を作っていたのですが、必要はないですか? あとtextbox01.text = "";などはまだ初心者なので 覚えるためとこれからメニューからメニューの時に変更するかもとゆうことなのでよろしくお願いします
sakura_hana

2018/07/24 09:53

>Game_01 = 0を作っていたのですが、必要はないですか? 何が最適かは「どんな風に画面が表示非表示されるのか」によるので一概には言えません。 「スキルメニューが開く時、ポーズ画面は閉じる」とかなら必要無いでしょうし、「現在どの画面が開いているかによって同じボタンでも機能が変わる」とかだと必要かもしれません。 そもそもintなのかboolなのか、変数を何個作るのか、なども考える必要があると思います。 (「nowWindow = 1」のように「1つの変数で今開いている画面を示す(0〜4のどれかが入る)」という方法もあれば、「isPauseWindow = true; isSkillWindow = false;」のように「複数のbool変数でそれぞれの表示状態を示す」という方法もあります) あくまで私の回答は例でしかないので、お好きに変えてください。 スクリプトの意味を理解しつつ、どう書いたら効率的か・分かりやすいかを考えながらトライ&エラーを続けると上達が早いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問