🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

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

Q&A

解決済

1回答

719閲覧

アイテム(ジェム)がシーン変えると増える(GetInt)

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2019/12/22 18:51

現状

タイトルシーンとキャラ選択シーンの両方にラベルを表示していてそのためにGetIntをつかっている
タイトルとキャラ選択交互に移動するとアイテム表示が増える

実現したいこと

シーン変えてもアイテム数を変わらなくしたい

試したこと

Save()してみたけどだめだった

コード

タイトルシーン

unity

1 2 3public class TitleController : MonoBehaviour 4{ 5 public Text highScoreLabel; 6 public Text GemLabel; 7 static int totalgem; 8 9 // Start is called before the first frame update 10 public void Start() 11 { 12 PlayerPrefs.GetInt("Gem"); 13 //ハイスコアを表示 14 highScoreLabel.text = "High Score : " + PlayerPrefs.GetInt("HighScore"); 15 totalgem += PlayerPrefs.GetInt("Gem"); 16 GemLabel.text = "Gem : " + totalgem; 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 if (Input.GetButtonDown("Fire1")) 23 { 24 Invoke("StGame", 1f); 25 } 26 } 27 28 void StGame() 29 { 30 //ゲームシーン読み込み 31 SceneManager.LoadScene("GameScene"); 32 } 33}

キャラ選択シーン

unity

1 2public class CharaController : MonoBehaviour 3{ 4 public Text GemLabel; 5 6 7 // Start is called before the first frame update 8 public void Start() 9 { 10 GemLabel.text = "Gem : " + PlayerPrefs.GetInt("Gem"); 11 } 12 13 // Update is called once per frame 14 void Update() 15 { 16 17 } 18}

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

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

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

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

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

guest

回答1

0

ベストアンサー

static int totalgem;
こちらが static なのが原因だと思われます。
タイトルシーンに入るたびに PlayerPrefs.GetInt("Gem"); が加算されていますので、Gemを100持ってるユーザーがタイトルに行ったり来たりするたびにGemが100増えてしまっているように見えてしまいます
実際のデータはGem = 100のはずなので表示する際のミスという事になります。
今回はGemデータはPlayerPrefsから取得できるのでtotalGemからstaticを外すだけで正しく動作すると思われます

投稿2019/12/23 02:56

編集2019/12/23 02:57
MMashiro

総合スコア2380

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

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

退会済みユーザー

退会済みユーザー

2019/12/23 03:21

staticが付いていないとゲーム画面でゲットしたジェムが0だとタイトルに戻ったときにジェムが0に戻ってしまうんです。
退会済みユーザー

退会済みユーザー

2019/12/23 03:36

これでゲーム画面でジェムを所得しています public class GameController : MonoBehaviour { public Text scoreLabel; //ゲームステート enum State { Ready,Play,GameOver } State state; int score; int gem; public ShipController ship; public GameObject walls; public Text StateLabel; public GameObject appe; public Text GemLabel; public GameObject shotsp; // Start is called before the first frame update void Start() { //開始時にRedayステート開始 Ready(); } // Update is called once per frame void LateUpdate() { //ステートごとにイベント監視 switch (state) { case State.Ready://タッチしたらゲームスタート if (Input.GetButtonDown("Fire1")) GameStart(); break; case State.Play://シップが破壊されたらゲームオーバー if (ship.IsDead()) GameOver(); break; case State.GameOver://タッチしたらシーンをリロード if (Input.GetButtonDown("Fire1")) { Invoke("Reload", 1f); } break; } } void Update() { } void Ready() { state = State.Ready; //オブジェクトを無効にする ship.SetSteerActive(false); walls.SetActive(false); appe.SetActive(false); shotsp.SetActive(false); //ラベル更新 scoreLabel.text = "Score : " + 0; StateLabel.gameObject.SetActive(true); StateLabel.text = "READY"; GemLabel.text = "Gem : " + 0; } void GameStart() { state = State.Play; //オブジェクトを有効にする ship.SetSteerActive(true); walls.SetActive(true); appe.SetActive(true); shotsp.SetActive(true); //最初の入力だけをゲームコントローラーから渡す ship.Flap(); //ラベル更新 StateLabel.gameObject.SetActive(false); StateLabel.text = ""; } void GameOver() { state = State.GameOver; //シーン中のscrollObjectコンポーネントを探し出す ScrollObject[] scrollObjects = GameObject.FindObjectsOfType<ScrollObject>(); //シーン中のscrollObjectコンポーネント無効にする foreach (ScrollObject so in scrollObjects) so.enabled = false; //オブジェクト無効 appe.SetActive(false); shotsp.SetActive(false); //ラベル更新 StateLabel.gameObject.SetActive(true); StateLabel.text = "GAMEOVER"; //ハイスコアを更新 if (PlayerPrefs.GetInt("HighScore") < score) { PlayerPrefs.SetInt("HighScore", score); } PlayerPrefs.SetInt("Gem", gem); } void Reload() { //タイトルシーンを読み込み SceneManager.LoadScene("Title"); } public void IncreaseScore() { score++; //スコア更新 scoreLabel.text = "Score : " + score; } public void IncreaseGem() { gem++; GemLabel.text = "Gem : " + gem; ; } }
MMashiro

2019/12/23 03:40 編集

Gemの管理の仕方があまりよろしくないように思います。 自身の所持する全てのGemをTotalGemとしてPlayerPrefsに定義し、 ゲームオーバー時に今回のゲームでゲットしたGemをTotalGemに加算してPlayerPrefsに保存、 タイトル画面ではPlayerPrefsからTotalGemを取得 という流れの方がよさそうです
退会済みユーザー

退会済みユーザー

2019/12/23 03:46

ゲームコントローラーのほうでtotalgemを作るということでしょうか。
MMashiro

2019/12/23 03:48

いえ、そうではありません私が記述したように 自分が所持している全てのGemをTotalGemという名前で保存するようにしてくださいという事です PlayerPrefs.SetInt("TotalGem", {自身の持つ全てのGem});
退会済みユーザー

退会済みユーザー

2019/12/23 04:16

考え方は分かりやすかったのですが書き方がわからなくて書いてみたのですがうまくいかなかったです。 タイトル public Text highScoreLabel; public Text GemLabel; static int totalgem; // Start is called before the first frame update public void Start() { //ハイスコアを表示 highScoreLabel.text = "High Score : " + PlayerPrefs.GetInt("HighScore"); GemLabel.text = "Gem : " + PlayerPrefs.GetInt("TotalGem"); PlayerPrefs.SetInt("TotalGem", totalgem); } キャラシーン // Start is called before the first frame update public void Start() { GemLabel.text = "Gem : " + PlayerPrefs.GetInt("TotalGem"); ゲーム //ハイスコアを更新 if (PlayerPrefs.GetInt("HighScore") < score) { PlayerPrefs.SetInt("HighScore", score); } PlayerPrefs.GetInt("Gem"); PlayerPrefs.SetInt("TotalGem", gem + PlayerPrefs.GetInt("TotalGem"));
MMashiro

2019/12/23 04:22

タイトル画面での static int totalGem 変数は不要になります タイトルではデータの取得のみを行うため PlayerPrefs.SetInt("TotalGem", totalgem); 上記も不要です ゲームシーンでの PlayerPrefs.GetInt("Gem"); ですが、こちらも不要です。 このゲーム中に取得したGemの数を PlayerPrefs.SetInt("TotalGem", gem + PlayerPrefs.GetInt("TotalGem")); のgemに入れてみてください ざっと流れは下記の通りです - タイトルシーン TotalGemをPlayerPrefsから取得して表示 (Setは行いません) - ゲームシーン 今回の1ゲーム中に取得できたGemをどこかの変数で保持しておき(ここではGetGemとかにしておきます) PlayerPrefsのTotalGemに対して加算を行い、設定します 基本は上記の流れで問題なく動作すると思われます
退会済みユーザー

退会済みユーザー

2019/12/23 04:35

言われた通りしてみるとできたと思います! 長い時間いただいてありがとうございました!めっちゃすっきりしました! また機会があればよろしくお願いします。 ゲームシーン PlayerPrefs.SetInt("TotalGem", gem + PlayerPrefs.GetInt("TotalGem")); タイトルシーン GemLabel.text = "Gem : " + PlayerPrefs.GetInt("TotalGem"); ガチャシーン GemLabel.text = "Gem : " + PlayerPrefs.GetInt("TotalGem");
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問