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

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

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

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

Q&A

解決済

1回答

1251閲覧

[Unity]PlayerPrefsで記録した現在の時刻(String型)とゲームの得点(Int型)を、シーンをまたいでCanvasのなかのテキストボックスに表示させたいです。

defour

総合スコア21

C#

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

0グッド

0クリップ

投稿2020/02/02 22:52

編集2020/02/06 13:44


上の写真のように、履歴へのボタンを押した時、押した時の現在時刻と左上の29と書いてあるスコアを記録して、下の写真のようなリザルト画面に表示させたいです。
イメージ説明
表示させたい場所は、Node(1)の中のTextで
「現在時刻: 2020年2月3日08:08 得点: 29」といった具合にしたいです。
コードでは、FinishGameRecordメソッドを作りそれを、OnToHistroyButtonメソッドをアタッチした履歴ボタンの中に書いています。

回答してくださった方のおかげで、下の画像のようにPlayerPrefsでデータを保存してシーンを移動することができました。
![イメージ説明

現在のスクリプトが以下になります。

public class ResultManager : MonoBehaviour { int resultGetScore_Num = SampleManager.getScore_Num(); string resultGetNowTime = SampleManager.getNowTime(); [SerializeField] GameObject nodePrefab; [SerializeField] GameObject node; [SerializeField] GameObject canvas; public Text timeText; // Start is called before the first frame update void Start() { //node = Instantiate(nodePrefab); //node.transform.SetParent(canvas.transform, false); timeText.text = PlayerPrefs.GetString("NOW", "") + " 得点:"; // + PlayerPrefs.GetInt("SCORE",""); } // Update is called once per frame void Update() { } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; using UnityEngine.SceneManagement; public class SampleManager : MonoBehaviour { [SerializeField] GameObject monsterViewPrefab; [SerializeField] GameObject monster; bool isThereMonster; //monster存在フラグ。待機時間を設ける為にフラグを持つ [SerializeField] GameObject canvas; [SerializeField] GameObject leftTimeText; [SerializeField] GameObject menuView; //[SerializeField] GameObject finalScoreText; public float leftTime = 20; //現在時刻代入用の変数 public static string nowTime; //private DateTime lastDateTime; void Start() { audioSource = gameObject.GetComponent<AudioSource>(); SpawnMonster(); RefreshpScoreText(); leftTimeText.GetComponent<Text>().text = ((int)leftTime).ToString(); // スコアのロード //score_num = PlayerPrefs.GetInt("SCORE", 0); } // 削除時の処理 /*void OnDestroy() { // スコアを保存 PlayerPrefs.SetInt("SCORE", score_num); PlayerPrefs.Save(); }*/ public void SpawnMonster() { monster = Instantiate(monsterViewPrefab); monster.transform.SetParent(canvas.transform, false); isThereMonster = true; if (isThereMonster == true) { Debug.Log("Success"); } //return monster.GetComponent<MonsterView>(); } void Update() { // monsterがさっきまで存在していたが今は無い場合、3秒後に生成 if (isThereMonster && monster == null) { isThereMonster = false; Invoke("SpawnMonster", 1.5f); } //1秒に1ずつ減らしていく leftTime -= Time.deltaTime; //マイナスは表示しない if (leftTime < 0) leftTime = 0; //GetComponent<Text>().text = "残り時間:" + ((int)leftTime).ToString(); if (leftTime <= 0) { menuView.SetActive(true); GameObject obj = GameObject.Find("SampleImage(Clone)"); Destroy(obj); //FinishGameRecord(); //inalScoreText.SetActive(true); } leftTimeText.GetComponent<Text>().text = "残り時間:" + ((int)leftTime).ToString(); //現在時刻をStringで取得して代入 nowTime = System.DateTime.Now.ToString(); } public AudioClip clearSE; private AudioSource audioSource; public GameObject scoreObject; public static int score_num = 0; public void FinishGameRecord() { //System.DateTime now = System.DateTime.Now; //PlayerPrefs.SetString("key", now.ToBinary().ToString()); //NOWというキーでnowTimeの文字列をセーブ PlayerPrefs.SetString("NOW", nowTime); //PlayerPrefs.SetString("Key_Time", lastDateTime.ToBinary().ToString()); //PlayerPrefs.Save(); PlayerPrefs.SetInt("SCORE", score_num); PlayerPrefs.Save(); } public static int getScore_Num() { return score_num; } public static string getNowTime() { return nowTime; } public void OnToHistroyButton() { SceneManager.LoadScene("Histroy"); FinishGameRecord(); //Debug.Log(lastDateTime); Debug.Log(score_num); Debug.Log(nowTime); } public void GetMole() { score_num += 1; RefreshpScoreText(); TouchSound(); } void RefreshpScoreText() { Text scoreText = scoreObject.GetComponent<Text>(); scoreText.text = string.Format("Score:{0}", score_num); } void TouchSound() { audioSource.PlayOneShot(clearSE); } /*public void OnTap() { audioSource.PlayOneShot(clearSE); score += 10; Debug.Log("MonsterをTap"); Destroy(this.gameObject); //Invoke("SpawnLead",3.0f); }*/ }

今困っていることは、PlayerPrefsで記録した現在の時刻(String型)とゲーム得点(Int型)それぞれが型が異なるため、「timeText.text = PlayerPrefs.GetString("NOW", "") + " 得点:";」のコードのように、ここまでは、表示できますが、その続きの「 + PlayerPrefs.GetInt("SCORE","");」で保存したScoreを表示できないです。

今できていないことは、PlayerPrefsでSetIntで保存したInt型のScoreをString型と混じった状態で表示させることです。

どなたか、ご教示していただければ幸いです。

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

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

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

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

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

sakura_hana

2020/02/03 00:43

問題点はどこですか? また、自分で調べたことも記載してください。(「unity 変数 シーン間」とかでググると出ると思いますが)
defour

2020/02/06 10:21

返信が遅れてしまい申し訳ありませんでした。 ググってみて、シーン間でゲーム終了時の時間を保存して、履歴シーンのテキストに表示させることができました。 ただし、時間は表示できましたが、Int型のScoreを表示させることができていません。 timeText.text = PlayerPrefs.GetString("NOW", "") + " 得点:" ;//+ PlayerPrefs.GetInt("SCORE",""); このようにコードを書いていますが、写真のように、時間と得点まで表示できています。 「PlayerPrefs.GetInt("SCORE","")」の部分がInt型なのでString型にする必要があると思いますが、やり方がわからないです。
guest

回答1

0

ベストアンサー

いくつか方法がありますが、とりあえずシングルトンを作ればいいと思います

class Global{ static Global ins = null; int score = 0; Global Instance{ get{if (ins == null) ins = new Global(); return ins;} } } Global.Instance.score = 0;

シーンを切り替えても残り続けるので、シーンを超えて渡したい値はこのクラスに格納します

投稿2020/02/03 06:41

izmktr

総合スコア2856

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

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

defour

2020/02/06 13:45

返信が遅れました。 教えていただいたやり方とは異なりますが、 シーンを超えて、値を格納することができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問