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

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

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

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

Unity

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

Q&A

解決済

Unity:ランキング入力時のリセットキー無効化

YA87
YA87

総合スコア6

C#

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

Unity

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

2回答

0グッド

0クリップ

270閲覧

投稿2023/01/31 08:21

前提

Unityで制作しているゲームに、こちらのサイトを参考にしてランキング機能をつけました。
https://blog.naichilab.com/entry/webgl-simple-ranking

ゲームオーバー時にゲームオーバーパネルが出現、そのときにRキー、Bキーで画面を切り替えるようにしています。
そのキー入力がランキング入力時にも反映されてしまうので名前にbやrが入っている人の場合、送信前に画面が切り替わってしまいます。
ランキングがシーン上にあるか検知してif分に追加する方法を探しているのですが、ランキングはゲームとは別のシーンなのでどう検知すればいいか分かりません。
検知方法、もしくはその他の方法があれば教えていただきたいです。

実現したいこと

ランキング入力中はリセットキー・リスタートキーを無効化したい。

発生している問題・エラーメッセージ

ランキング入力中に特定キーを入力すると、スコアが破棄されて画面が切り替わってしまう。

該当のソースコード

using System.Collections; using DG.Tweening; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { [SerializeField] private int countDownTime; [SerializeField] private Text countDownText, gameOverText, scoreText; [SerializeField] private GameObject gameOverPanel; void Start() { if (!countDownText.gameObject.activeSelf) { countDownText.gameObject.SetActive(true); } StartCoroutine(CountDownStart()); } private void Update() { //ここにランキングシーンの検知を追加したい。 if (gameOverPanel.activeSelf) { if (Input.GetKeyDown(KeyCode.B)) { SceneManager.LoadScene(0); Time.timeScale = 1; } else if (Input.GetKeyDown(KeyCode.R)) { SceneManager.LoadScene(1); Time.timeScale = 1; } } } IEnumerator CountDownStart() { while (countDownTime > 0) { countDownText.text = countDownTime.ToString(); yield return new WaitForSeconds(1f); countDownTime --; } countDownText.text = "START!"; yield return new WaitForSeconds(1f); countDownText.gameObject.SetActive(false); yield break; } public void GameOver() { scoreText.text = string.Format("SCORE:{0}", ScoreManager.score); gameOverPanel.SetActive(true); gameOverText.transform.DOShakePosition(1f, 100f, 30, 30, false, true) .SetUpdate(true); //ランキングの表示 naichilab.RankingLoader.Instance.SendScoreAndShowRanking(ScoreManager.score); Time.timeScale = 0; } }

試したこと

Active

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

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

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

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

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

0

自己解決

GameManager.csにstatic boolを作って、スコア送信ボタンか閉じるボタンが押されたときにtrueになるような処理を書いてif文の条件に追加しました。

投稿2023/01/31 13:46

YA87

総合スコア6

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

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

このような回答には修正を依頼しましょう。

0

手っ取り早くやるなら、boolを包んだScriptableObjectを使うと良い感じです。

参考記事:
https://unity.com/ja/how-to/architect-game-code-scriptable-objects

C#

1using System; 2using UnityEngine; 3 4[CreateAssetMenu] 5public class BoolVariable : ScriptableObject,ISerializationCallbackReceiver 6{ 7 [SerializeField] 8 private bool initialValue; // 初期値 9 10 [NonSerialized] 11 public bool Value; // ゲーム中に見る値 12 13 // ゲーム内で使う時に初期化 14 public void OnAfterDeserialize() 15 { 16 Value = initialValue; 17 } 18 19 public void OnBeforeSerialize() 20 { 21 } 22}

使い方

C# ランキング表示側クラス

1 [SerializeField] 2 private BoolVariable isRanking; // インスペクターでBoolVariableをセットする 3 4 // ランキング表示非表示時にValueを変える処理を作って適当に呼ぶ 5 private void OnRankingOpen() 6 { 7 isRanking.Value = true; 8 } 9 10 private void OnRankingClose() 11 { 12 isRanking.Value = false; 13 }

C# GameManager

1 [SerializeField] 2 private BoolVariable isRanking; // GameManagerにも同じBoolVariableをセットする。 3 4 private void Update() 5 { 6 // BoolVariableを見る 7 if (isRanking.Value == true) 8 { 9 // キー入力無効の処理を書く 10 } 11 12 if (gameOverPanel.activeSelf) 13 { 14 if (Input.GetKeyDown(KeyCode.B)) 15 { 16

ScritptableObjectはシーン関係なく参照できるので、このようなシーン間の値の共有ができます。
やってることはグローバル変数なので、やりすぎ使いすぎ注意です。

投稿2023/01/31 09:41

編集2023/01/31 09:58
UnchFullburst

総合スコア563

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

YA87

2023/01/31 13:48

結局自己解決しましたが、とても参考になりました。ありがとうございます。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

C#

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

Unity

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