【Unity】前シーンのプレイヤーの位置を保存しておく方法
おはようございます。おーみんです。
フィールドから戦闘シーンに移る際、2度目以降はなぜかトランジション(渦巻みたいな描写)が正常に動かなかったんだけど、なんとか修正できた。
— うるとらおーみん (@Ooooooomin_365) September 21, 2019
結局設計から見直したw#unity#unity3d pic.twitter.com/COYxMMT1g5
元々はDontDestroyOnLoad使って前のシーンの情報丸ごと保存してたけど、考えてみればプレイヤーの位置のみstaticで保存しておけば良い話だったw
— うるとらおーみん (@Ooooooomin_365) September 21, 2019
おかげでフェードインのオブジェクトも初期化されて最初のように使えるし、余計な保存データも省けるし、良い感じ!
プレイヤーの位置を保存する
FFやドラクエなどのRPGではよくある、というか必ずある「フィールド→戦闘→フィールド」というシーン遷移ですが、戦闘シーンからフィールドに戻る際にそのままシーン遷移のプログラムを書いてしまうとプレイヤーの位置が初期位置に戻っちゃうんですよね~。
一応2通りのやり方がありまして、1つは以前ブログでも書いたDontDestroyOnLoadを使って前のシーン情報を丸ごと保存する方法です。
【Unity】シーン遷移の際に、シーンの状態を保持しておく超簡単な方法。 - おーみんだよ。
しかしながらこれでは色々と問題があるんですよね。。。
シーンを丸ごと保存しておくわけなので、当然処理は重くなるし上記のツイートみたいにトランジション処理で余計なエラーが発生したり。。。
ということで、今回は2つ目のやり方であるstatic変数を用いてプレイヤーの位置を保存する方法を書いていこうと思います。
サンプルコード
static変数を用いて作ったサンプルコードは以下になります。
13行目はゲームの一番最初のプレイヤーの初期位置になります。
34行目ではプレイヤーが敵とエンカウントした際に現在位置を保存しています。
※27行目~41行目のEncount関数に関しては以下の記事で解説していますので是非参考にしていただけると幸いです。
【Unity】RPGでの敵とのランダムエンカウントプログラムを作ってみた! - おーみんブログ
するとプレイヤーの位置が最初の13行目で定義した値から敵とエンカウントした場所に置き換わるんですね~(static変数なので)。
戦闘が終わって、再度フィールドに戻ったときにStart関数が読み込まれますが、その時に18行目の"Player.transform.positon = PlayerLocation;"によって以前保存された場所にプレイヤーが置かれるという感じです。
最後に
以上で前シーンのプレイヤーの位置を保存しておく方法でした。
方法は2通りありますが、個人的には今回書いたstatic変数を用いる方をおすすめします。
他にもやり方がありましたら是非教えてください。
では!
※RPGに関する記事は他にも色々あげていますのでぜひ興味のある方は読んでいただけると嬉しいです!