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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

解決済

1回答

856閲覧

UIのTextをセーブロードしたい

BRAK

総合スコア98

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

0クリップ

投稿2020/01/06 07:21

編集2020/01/08 05:25

実現したこと

unityのTextデータのセーブロード機能について
プレイヤーが死亡した際にカウントされるTextを作りました。
また、MainシーンでEnemyに衝突した際に死亡回数をセーブし、Title画面でロードボタンをクリックした際に死亡データを取得しMainシーンに今まで死んだ回数を表示させたいのですがうまくいきません。

今できていること
Enemyに衝突した際に死亡回数がカウントされるだけです。

発生しているエラー、問題
Textの死亡回数がロード時に反応しない。

スクリプトを誰につけているか
MainシーンではplayerにPlayerControllerとCountScript
空のオブジェクトにSaveManagerです。
Titleシーンでは空のオブジェクトにSaveManager
空のオブジェクトにCountScriptです。

該当のソースコード
C#言語(スクリプトは4つあり、参照しています)

//1つ目 PlayerController public Text deathCountText;//死亡テキストの名前 private void OnTriggerStay(Collider col) { if (col.gameObject.tag == "Enemy") { StartCoroutine(CountDelaySave());//1秒 } } IEnumerator CountDelaySave() { yield return new WaitForSeconds(1f); __//SaveManagerスクリプトを参照 __ GameObject.Find("SaveManager").GetComponent<SaveManager>().SaveCount(); }
//2つ目 SaveManager private int count; public void SaveCount() { PlayerPrefs.SetInt("Deaths", count); GameObject.Find("CountManager").GetComponent<CountScript>().SetDeathCount(); } public void LoadCount() { count = PlayerPrefs.GetInt("Deaths", count); GameObject.Find("CountManager").GetComponent<CountScript>().SetDeathCount(); }

 ```
//3つ目 CountScript
public Text deathCountText;

private int count; SaveManager saveManager; private void Start() { saveManager = GameObject.Find("SaveManager").GetComponent<SaveManager>(); saveManager.LoadCount(); //saveManager.count = 0;★★★ SetDeathCount(); } private void OnTriggerStay(Collider col) { if (col.gameObject.tag == "Enemy") { saveManager.count += 1; SetDeathCount(); Invoke("SetSaveCount", 1f); } } void SetSaveCount() { SaveManager saveManager = GameObject.Find("SaveManager").GetComponent<SaveManager>(); saveManager.SaveCount(); } public void SetDeathCount() { deathCountText.text = "爆破回数: " +saveManager.count.ToString(); }

//4つ目 ToMain(ボタンを押したらTitleからMainへ行く)
public void OnLoadCliked()
{Debug.Log("データ獲得");
GameObject.Find("SaveManager").GetComponent<SaveManager>().LoadData();

Debug.Log("5秒待つ"); StartCoroutine(WaitTime()); } IEnumerator WaitTime() { yield return new WaitForSeconds(5f); SceneManager.LoadScene("Main"); }
**試してみたこと** たくさん試しすぎてよくわからない状況です。 3週間前に色々試していたのですが断念してこのサイトを見つけたので今回質問させていただきました。 ごちゃごちゃしていて申し訳ありませんが、よろしくお願いします。

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

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

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

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

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

y_waiwai

2020/01/06 07:25

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
BRAK

2020/01/06 07:35

編集しました。
guest

回答1

0

ベストアンサー

private int count;
というのがいくつか見えますが、クラスが変われば同じ名前をつけても別のものとして扱われます

saveManager.LoadCount() では、saveManager.countが変わるだけで、
SetDeathCountを呼び出している(名前不明).countの値はかわらず、
(名前不明).SetDeathCount()で書き換えても当然値が変わりません

簡単なのはこんな感じで、saveManager.countを参照する方法でしょうか

deathCountText.text = "爆破回数: " + saveManager.count.ToString();

投稿2020/01/06 08:17

izmktr

総合スコア2856

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

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

BRAK

2020/01/06 12:45

スクリプトの名前が切れていたので修正しました
BRAK

2020/01/06 12:47

これを参考にsaveManagerの方を pubulic int countに直して参照できるレベルに下げました。 しかし、うまくいきません。 どこに何を書き加えればよいか教えていただけると助かります。 よろしくお願いします。
izmktr

2020/01/07 01:13

うまくいかないと言われてもどのようにうまくいかないのかわかりません とりあえず、SaveManager以外にはcountが必要ないと思うので消してSaveManagerに集中しましょう
BRAK

2020/01/08 05:22

今、やってみたところ、無事カウントを引き継ぐことができました。 が、カウントの数字が1つずつ上がることもあれば、3つや4つ一気に上がることがあるのですがどういう原理で上がってしまうのでしょうか。当たり判定で3つや4つ触れてしまっているということですか よろしくお願いします。
BRAK

2020/01/08 05:30

CountScriptのcountのところをManager.countに変更しました。 星がついている部分はTitleのStart(初めから)ボタンでMainシーンに引き継ぐところに挿入すればいいですよね。
fiveHundred

2020/01/08 05:33

> OnTriggerStay はトリガーが 他の Collider に触れ続けている間 ほとんど 毎フレーム呼び出されます。 (引用元:https://docs.unity3d.com/ja/2017.4/ScriptReference/Collider.OnTriggerStay.html) 上記のように、OnTriggerStay()は触れている間に何度も呼び出される関数です。 一度だけ呼ばれるようにしたいのであれば、OnTriggerEnter()を使うのがよろしいかと。
BRAK

2020/01/08 06:36 編集

この前Enterでも一気に数が増えたのでStayに変えていました。今試してみたところ当たり方が斜め上からか斜め下からだと判定が複数になる感じでした。 あと、当たった瞬間にプレイヤーのコライダーや操作するためのplayerControllerのみを不能にしています。 死亡するときのアニメーションを実行するために不能にしています。
BRAK

2020/01/08 06:32

それと、やはり初めからのボタンを押してもカウントが引き継がれてしまうのですが、どうすればいいですか?
BRAK

2020/01/08 06:34

4つ目のスクリプト public void OnMainClicked() { SceneManager.LoadScene("Main"); saveManager.LoadCount(); saveManager.count = 0; GameObject.Find("CountManager").GetComponent<CountScript>().SetDeathCount(); } に変えたのですがカウントが0になりません。
izmktr

2020/01/08 06:36

根本的な原因は、死亡カウントが生存→死亡のときだけでなく、死亡→死亡のときにも増えていることです つまり、bool aliveという変数を用意し、alive==trueのときのみ、alive=false とした上で処理を入れましょう
izmktr

2020/01/08 06:38

数値を変えたのなら、SaveCountも必ず呼び出しましょう
BRAK

2020/01/08 06:42

まず4つ目のスクリプトからの話で ボタンを押したときにSaveCountの中に0を記録するってことですね。
BRAK

2020/01/08 06:47

bool aliveという変数を用意し、alive==trueのときのみ、alive=false はCountScriptに入れるということですね。 やってみます。 ありがとうございます。
BRAK

2020/01/08 06:55

今やってみたところ4つ目のスクリプトにSaveManagerの方にpublic void SaveZeroCount() { count = 0; PlayerPrefs.SetInt("Deaths", count); GameObject.Find("CountManager").GetComponent<CountScript>().SetDeathCount(); } の新しい関数を作ってStartボタンに代入することで成功しました。 ありがとうございます。
BRAK

2020/01/08 07:03

bool aliveのところで CountScriptの private void OnTriggerEnter(Collider col) { if (col.gameObject.tag == "Enemy" && alive == true) { alive = false; saveManager.count += 1; SetDeathCount(); Invoke("SetSaveCount", 1f); } } && alive == trueを追加したことで無事うまく動きました。
BRAK

2020/01/08 07:14

それともう一つ質問でプレイヤーが死亡した後Titleシーンに戻るのですが、その際にTitle画面に死亡カウントTextがないためエラーが出てしまうのですが、ヒエラルキー上に表示しなければゲーム再生時などに支障をきたすことになりますか?
izmktr

2020/01/08 07:21

エラーが出るのならエラーメッセージを書きましょう おそらくnullアクセスだと思いますが、ifなり、?.なりで回避すればいいです
BRAK

2020/01/08 07:23

nullエラーです。 NullReferenceException: Object reference not set to an instance of an object.です
BRAK

2020/01/08 07:25

if (deathCountText!= null) { deathCountText.text = "爆破回数: " +saveManager.count.ToString(); } こんな感じですかね
BRAK

2020/01/08 07:27

無事できました。 ありがとうございます。 ?のやり方でやったことがないので調べてやってみます。
BRAK

2020/01/08 07:49

_ = deathCountText.text != null ? deathCountText.text = "爆破回数: " + saveManager.count.ToString() : null; こんな感じですか? これだとMainシーンに行ったときにnullエラーが再び出てしまいますが。。
BRAK

2020/01/08 08:00

今改めてみたところNullReferenceException: Object reference not set to an instance of an object. CountScript.SetDeathCount () (at Assets/Script/Player/CountScript.cs:63) SaveManager.SaveCount () (at Assets/Script/Manager/SaveManager.cs:61) SaveManager.Start () (at Assets/Script/Manager/SaveManager.cs:17) ロードやスタートボタンを押した後にMainシーンにもエラーが出たのですが、この場合はどうすればいいですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問