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

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

ただいまの
回答率

89.05%

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

解決済

回答 1

投稿 編集

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

defour

score 21


上の写真のように、履歴へのボタンを押した時、押した時の現在時刻と左上の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型と混じった状態で表示させることです。

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • sakura_hana

    2020/02/03 09:43

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

    キャンセル

  • defour

    2020/02/06 19:21

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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/06 22:45

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

    キャンセル

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

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

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

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