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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

490閲覧

ゲームの『つづきから』ボタンを押したら前回のプレイしていたステージから始めるような導入したいです。

Abc_.c

総合スコア18

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/06/05 02:50

マリオのような3Dアクションゲームを作りたいです。ステージがいくつかあり、それぞれ、シーン別にStage1、Stage2のような名前をつけて管理しています。スタート画面を作り続きからという項目を設けて、アプリを一回落としても続きからを押せば前回プレイしていた、ステージからスタートできるような仕組みを作りたいです。その機能を模索し、つづきからボタンに以下のコードをアタッチしたのですが、続きからボタンを押す前に勝手にシーンに移動をしてしまいます。どうすれば続きからボタンを押したあとに続きから始める事が可能になりますか?以下続きからボタンに記述したコードです。```ここに言語を入力
コード

using

1using System.Collections.Generic; 2using UnityEngine; 3 4public class ContinuneButton : MonoBehaviour 5{ 6 void Start () 7 { 8 } 9 public void OnClickStartButton() 10 { 11 Invoke(nameof(OnApplicationPause),0.5f); 12 } 13 14 void OnApplicationPause (bool isPause) 15 { 16 DontDestroyOnLoad(gameObject); 17 Application.LoadLevel( PlayerPrefs.GetInt("SceneNo", 1)); 18 if( isPause ) 19 { 20 PlayerPrefs.SetInt("SceneNo", Application.loadedLevel); 21 // ?. 22 PlayerPrefs.Save(); 23 } 24 25 } 26}

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

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

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

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

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

guest

回答1

0

ベストアンサー

OnApplicationPause()は、一時停止時とその解除時に自動で実行される関数です(参考)。
そのため、OnApplicationPause()が自動で呼び出されてシーン切り替えが起こったのでしょう。

今回の場合、そもそも「シーン切り替えを行う処理」と「セーブを行う処理」を同じタイミングで行うこと自体おかしいです。
「シーン切り替えを行う処理」を別の関数にし、それをクリック時に呼び出せばよいかと思います。

投稿2022/06/05 03:21

fiveHundred

総合スコア9803

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

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

Abc_.c

2022/06/05 09:17 編集

ご回答ありがとうございます! https://teratail.com/questions/2doq0xz51t5iqj の質問にてコメント頂いたためこちらに書かせていただきました 上の質問とURLの質問は関連性があります。ただ上記のコードを試してもうまくいかずそもそも根本的にPlayerPrefsについて理解しておらず違った角度にて別の質問をさせていただきました
fiveHundred

2022/06/05 10:06

これはPlayerPrefsの使い方の問題ではなく、ロジックの考え方の問題だと思います。 意図を察するに、 - 『ボタンを押下した』ときに『ロードしてシーンを切り替える』 - 『一時停止した』ときに『セーブを行う』 ということだと思いますが、タイミングや処理は全く異なるのに、同じOnApplicationPause()にこの2つの処理を書いているのが問題だということです。 そんなことをしてしまったせいで、「一時停止したなどでOnApplicationPause()が実行されたときにセーブ処理の前にロード処理が行われる」というめちゃくちゃなコードになっています。 また、もう1つの質問についても、GoalCall()はセーブ処理のみを行うべきであって、ロード処理は行う必要はありません。 タイトル画面などでロードする際に処理すればいいだけのことです。 「PlayerPrefsのロードやセーブは同じ関数内でしか使えない」というわけではありません。 PlayerPrefsは同じアプリ内であれば、違う関数やスクリプトでも同じキーで取得できます。 むしろ、前述の通りセーブするタイミングとロードするタイミングが異なるので、その点を理解していれば自然と別々になるはずです。
Abc_.c

2022/06/05 13:15 編集

PlayerPrefsを使って以下のコードの情報をセーブするには具体的にどのように書けば良いのでしょうか?PlayerPrefsについての記事などを色々漁ったのですがみても使い方がイマイチ理解できないんです。 セーブとロードは別でやるということがわかりました。ロードはスタート画面に続きからボタンを設置してあるのでそちらで処理をすれば良いのですよね? void GoalCall()//次のステージへ繊維 { goalCall.SetActive(false); int index = SceneManager.GetActiveScene().buildIndex;//現在のシーンのbuild数を呼び出す。 index++;//現在ステージのインデックスに+1する。 SceneManager.LoadScene(index);//+1したインデックス番号のステージを呼び出す。 } }
fiveHundred

2022/06/06 02:03

index++;//現在ステージのインデックスに+1する。 と SceneManager.LoadScene(index);//+1したインデックス番号のステージを呼び出す。 の間にセーブする処理を入れればいいです。
Abc_.c

2022/06/06 04:26 編集

以下にセーブ処理を追記したものを書いたのですが、以下のような記述で問題ないですか? void GoalCall()//次のステージへ繊維 { goalCall.SetActive(false); int index = SceneManager.GetActiveScene().buildIndex;//現在のシーンのbuild数を呼び出す。 index++;//現在ステージのインデックスに+1する。 PlayerPrefs.SetInt("key1", index); PlayerPrefs.Save (); SceneManager.LoadScene(index);//+1したインデックス番号のステージを呼び出す。 }
fiveHundred

2022/06/06 04:30

少なくとも私の認識の上ではこれで問題は無いです。
Abc_.c

2022/06/06 07:09 編集

ありがとうございます。以下『続きからボタン』にアタッチしているスクリプトにロードをするコードを以下に書きましたがそれも書き方的に問題はないですか?エラーなく、適当にステージをプレイし、一回ゲームを消して、再度ゲームプレイし、続きからボタンを押したところ問題なく前回のクリアデータが保存されており、続きのステージからプレイできました using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class ContinuneButton : MonoBehaviour { void Start () { } public void OnClickStartButton() { Invoke(nameof(LoadData),0.5f); } public void LoadData() { int num = PlayerPrefs.GetInt ("key1"); string character = num.ToString(); SceneManager.LoadScene("Stage" + character);//+1したインデックス番号のステージを呼び出す。 } }
fiveHundred

2022/06/06 07:29

正常だと思うのであれば、問題ありません。
Abc_.c

2022/06/06 11:33

セーブロードの件長くなりましたがありがとうございました! もう一つの質問は内容がほぼ被ってますのでそちらの方は削除しておきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問