スーパーマリオのようなステージを作っているのですが、一定のところまで進んだら、死んでも途中からリスタートさせるいい方法はありませんか。
今のところ、同じステージでプレイヤーの初期位置だけを変更したシーンを量産し、プレイヤーが死んだ位置によって呼び出すシーンを変える、ということくらいしか思いつきません。
シーンを無駄に増やしているあたり、あまりスマートと言えないように思います。
何か良い方法はありませんか。
あと、どうやってその方法に行き着いたのか、その考え方も教えていただけるとうれしいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
Scene量産はおすすめしません。メンテナンス性が悪いです…。
(例えば、あとからステージの形を大きく変えようとかなったとき、悲しくなりますよね)
やり直しのときにSceneを再読み込みしているのであれば
ゲーム開始時(ステージ開始時)に、過去にチェックポイントを通過しているかどうかが分かれば良さそうです。
色々やり方はありますが、手軽なのはstatic
な変数を作ってScene遷移しても失われないようにチェックポイント情報を記憶しておくことでしょうか。
かんたんなサンプルがあると分かりやすいかなと思ったので書いてみました。
いきなりゲームに組み込むのではなく、テストSceneを作ってテストしてみると良いでしょう。
下記サンプルは、Rigidbody2DをアタッチしたキャラをADで左右に動かすサンプルです。
Spaceキーを押すと現在位置をチェックポイントとして記憶し、右クリックでSceneをリロードします。
好きな位置でチェックポイントを記憶し、リロードしてみると開始位置がチェックポイントの位置になっていることが確認できると思います。
cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5 6public class TestPlayer : MonoBehaviour { 7 8 static Vector3 latestCheckPoint = new Vector3(); // Vector3型はNullにならないので、初期値はVector3.zero 9 Rigidbody2D rb; 10 11 // Start is called before the first frame update 12 void Start() { 13 rb = GetComponent<Rigidbody2D>(); 14 15 // 記憶したチェックポイントがあればプレイヤーの初期位置はそこにする 16 if (latestCheckPoint != Vector3.zero) { 17 transform.position = latestCheckPoint; 18 } 19 } 20 21 // Update is called once per frame 22 void Update() { 23 // 簡易移動処理 24 float x = Input.GetAxisRaw("Horizontal"); 25 rb.velocity = new Vector2(x, rb.velocity.y); 26 27 if (Input.GetKeyDown(KeyCode.Space)) { 28 latestCheckPoint = transform.position; // 現在位置を記憶 29 Debug.Log("CheckPoint : " + transform.position); 30 } else if (Input.GetMouseButtonDown(1)) { 31 SceneManager.LoadScene(SceneManager.GetActiveScene().name); // Scene再読み込み 32 } 33 } 34} 35
必ずしもこのやり方のみが正解なわけではありません。考えようによってはもっと色々できると思います。(そもそもSceneの再読み込みをしないでコンティニューするゲームもありますよね)
今回のようなstaticの場合、明示的に初期化しなおさないとバグが起こり得るので注意が必要です。
また座標直接記憶しているので、実際のゲームにそのまま入れ込むのは危険かもしれません。この例だと(0,0,0)にチェックポイントがあると動作しませんしね。
あくまで上記のコードはサンプル例として、考え方の方向性の1つとして参考にしていただければと思います。
投稿2021/06/15 05:41
総合スコア3302
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/06/15 07:42
2021/06/15 08:23
退会済みユーザー
2021/06/16 07:54