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

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

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

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

Unity

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

Q&A

解決済

2回答

1182閲覧

リトライ機能を実装したい

tomioo

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2022/08/13 01:45

前提

https://gamedevacademy.org/create-a-fast-paced-math-game-in-unity-part-1/
Unityの勉強の一環としてコチラのサイトを参考にゲームを制作しています。

実現したいこと

このサイト通りに作るとリトライができないのでリトライ機能を実装したいです。

発生している問題・エラーメッセージ

Win() または Lose() でテキストを表示した後に SwitchScene() でシーンをリロードしたいのですが、シーンの読み込みがうまくいかず、フリーズしたみたいになってしまいます。

該当のソースコード

C#

1using System.Net.Mime; 2using System.Diagnostics.Contracts; 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6using UnityEngine.SceneManagement; 7 8public class GameManager : MonoBehaviour 9{ 10 public Problem[] problems; 11 public int curProblem; 12 public float timePerProblem; 13 14 public float remainingTime; 15 16 public PlayerController Player; 17 18 public static GameManager instance; 19 20 void SwitchScene() 21 { 22 SceneManager.LoadScene (SceneManager.GetActiveScene().name); 23 } 24 25 void Awake() 26 { 27 instance = this; 28 } 29 30 void Win() 31 { 32 Time.timeScale = 0.0f; 33 UI.instance.SetEndText(true); 34 SwitchScene(); 35 } 36 37 void Lose() 38 { 39 Time.timeScale = 0.0f; 40 UI.instance.SetEndText(false); 41 SwitchScene(); 42 } 43 44 void SetProblem(int problem) 45 { 46 curProblem = problem; 47 remainingTime = timePerProblem; 48 UI.instance.SetProblemText(problems[curProblem]); 49 } 50 51 void CorrectAnswer() 52 { 53 if(problems.Length - 1 == curProblem) 54 { 55 Win(); 56 }else 57 { 58 SetProblem(curProblem + 1); 59 } 60 } 61 62 void IncorrectAnswer() 63 { 64 Player.Stun(); 65 } 66 67 public void OnPlayerEnterTube(int tube) 68 { 69 if(tube == problems[curProblem].correctTube) 70 { 71 CorrectAnswer(); 72 }else 73 { 74 IncorrectAnswer(); 75 } 76 } 77 78 void Update() 79 { 80 remainingTime -= Time.deltaTime; 81 82 if(remainingTime <= 0.0f) 83 { 84 Lose(); 85 } 86 } 87 88 void Start() 89 { 90 SetProblem(0); 91 } 92} 93

試したこと

タイトル画面を作成してシーンの遷移を行ったところ、遷移自体は成功しました。2回目にシーンをロードしたときにうまくいきませんでした。

補足情報

Unity 2021.3.2f1

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

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

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

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

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

guest

回答2

0

ベストアンサー

シーンだけ戻してもゲームを実行したことによって変更された部分はそのままだったはずなので、その変更部分を全部初期状態(ゲーム開始前の状態)に戻す必要があると思います。
参考サイトは学習用なのでそういった部分は一切配慮していないように思えますね。

投稿2022/08/13 01:56

RiaFeed

総合スコア2701

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

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

tomioo

2022/08/13 03:35

ゲーム開始前の状態に戻すというのは具体的にどういったことをすればいいのでしょうか?initialize?とか調べたんですけどよく分かりません。
RiaFeed

2022/08/13 07:25 編集

ゲーム内で動くオブジェクトの位置や変数の初期状態等を確認してリトライすべくシーンを戻す時にスクリプトで確認した値に書き換えて下さい。 オブジェクトの位置や変数の内容等をあらかじめ別の変数等に記録しておいてリトライする前に記録しておいた値にスクリプトで書き換えてもいいかもしれません。
tomioo

2022/08/13 08:32

シングルトンなinstanceで変数を設定しているが、staticであるから変数の内容が保持されているということで合っていますでしょうか。また、この場合に変数の内容を初期化する方法もご教授していただけると幸いです。
RiaFeed

2022/08/15 03:39 編集

Time.timeScale = 1.0f;
tomioo

2022/08/15 05:25

時間を止めていたことに気がづきました。本当にありがとうございました!!
guest

0

リトライする、ということは、特定の処理をやり直す、ってことになります。
ってことで、あなたのリトライしたい処理を、無限ループにしてやり直せるようにしてみましょう

投稿2022/08/13 13:56

y_waiwai

総合スコア87747

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

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

退会済みユーザー

退会済みユーザー

2022/08/14 23:13

点数乞食はやめましょう。回答でないことを回答欄に書くのはやめましょう。
Sigma1630

2022/08/15 06:50

まともな回答できないなら引っ込んでてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問