Battle シーンから Main シーンへの遷移処理も実装できました。
最後に
Main シーンへ遷移した際にプレイヤーキャラの位置と方向を、エンカウント時の状態に設定する処理を実装します。
すべてのゲームオブジェクトはシーンの遷移とともに破棄されます。
そのため、
ゲームオブジェクトにアタッチされているスクリプト内の変数などの情報も失われてしまいます。
ただし、
DontDestroyOnLoad メソッドにて引数で指定されているゲームオブジェクトは、
シーンの遷移によっても破棄されないゲームオブジェクトになります。
この機能を利用して、
シングルトンクラスである GameData クラスに Main シーンでエンカウントしたときのプレイヤーキャラの位置情報と向き情報を保持するようにします。
具体的には、EncountManager クラス内のエンカウント処理の中に、この保持の処理を追加します。TODO 機能が役立つでしょう。
GameData クラスは DontDestroyOnLoad メソッドが有効であるため、
シーン遷移を行っても破壊されないゲームオブジェクトです。
このゲームオブジェクトにアタッチされている
GameData クラス内に Main シーンでのプレイヤーキャラの情報を保持しておければ、
その情報を使って、新しい Main シーンを読み込んだ際に、
GameData クラスに保持しているエンカウントした位置と方向の情報を使うことで、
以前の Main シーン内の
プレイヤーキャラの位置と方向を再現することが出来ます。
プレイヤーキャラの位置と方向の情報の設定については PlayerController クラスに処理を実装することで、位置と方向を修正することが出来ます。
処理の流れをまとめてみましょう。
1.EncountManager クラスの JudgeRandomEncount メソッド内においてエンカウントが発生する
2.このメソッド内で GameData クラスに新しく用意するメソッドを実行する処理を追加して、プレイヤーキャラの位置と向いている方向の情報を引数で渡す
3.GameData クラス内にプレイヤーキャラの位置と向いている方向の情報が届くので、それを新しく用意する変数に代入する
GameData クラスがアタッチされている GameData ゲームオブジェクトはシーン遷移しても破棄されないゲームオブジェクトなので、これら変数はシーン遷移しても保持される情報になる
4.Battle シーンへ遷移する
5.Battle シーンから再度 Main シーンへ遷移する。この Main シーンは新しい Main シーンなので、プレイヤーキャラの位置や方向は初期位置になる
6.PlayerController クラスの Start メソッドに新しく処理を追加し、もしも Battle シーンから Main シーンに遷移している場合に限り、プレイヤーキャラの位置と向いている方向の情報を
GameData クラスに保持されているプレイヤーキャラの位置と向いている方向の情報を参照して、配置を変更する処理を実装する
以上のような処理の流れになります。
この処理を順番に実装していくようになりますが、
処理を実装する順番と、実際に行われる処理の順番は前後して構いません。
(逆説的に考えると、この順番にとらわれてしまうとスクリプトの修正が難しくなります。)
つまり、上記の1〜6の処理を実装するにあたって、1から順番に実装しなければならない、ということはないということになります。
そしてどちらかというとゴール地点である6の処理から実装を行っていった方が処理は実装しやすいケースが多いです。
これは新しく追加する処理を、1から順に実行していくことに関係しています。
先の処理を見ていただくと、6の処理には新しく追加する処理があります。
また、2の処理を実行するためにも GameData クラスに事前に新しい処理を実装しておく必要があります。
このように
処理の全体の流れをあらかじめ把握して設計しておくことにより、
どういった順番でスクリプトの修正をしていけばよいのか、
その情報を自分で管理することが出来るようになります。この把握をせずに、たとえば2から処理を書き始めてしまったとしても
ここで処理したい内容が GameData クラスにはまだ実装されていないため、実装ができない状態になってしまいます。
これが
実際の処理の流れの順番と、スクリプトを修正したり、作成したりする順番が前後するという意味になります。
上記の処理の流れをふまえてスクリプトを修正を考えると、次のような順番がやりやすいでしょう。
1.GameData クラスを修正して、プレイヤーキャラの位置と向いている方向の情報を保持するための変数を新しく用意する。
また、EncountManager クラスから実行される「プレイヤーキャラの位置と向いている方向の情報を保持する処理」を記述したメソッドを用意する
さらに、PlayerController クラスから実行される「プレイヤーキャラの位置と向いている方向の情報を参照する処理」を記述したメソッドを用意する
2.PlayerController クラスを修正して、GameData クラスの情報を参照して、Battle シーンから Main シーンへと遷移した場合に限り、
プレイヤーキャラの位置と向いている方向の情報を設定する処理を Start メソッド内に用意する。
Start メソッドに用意する理由はゲーム開始時にプレイヤーキャラの位置と向いている方向の情報を設定しておく必要があるため
また、新しく向いている方向の情報を外部のクラスで利用できるようにするメソッドを用意する。なぜならこの情報は private 修飾子であるのでそのままでは外部のクラスで利用ができないため
3.EncountManager クラスを修正して、エンカウントが発生したときに Battle シーンへと遷移する前に GameData クラスに準備した
「プレイヤーキャラの位置と向いている方向の情報を保持する処理」を行うメソッドを実行して、それらの情報を GameData クラスに保持させる
このとき、PlayerController クラスに用意した向いている方向の情報を取得するメソッドも利用して方向の情報を取得して利用する
前回の実装のように、どちらの順番で書いても片方のスクリプトに一時的にエラーが発生するようなもの(競合)については、それを把握した上でどちらから修正しても構いません。
今回はそのように競合してしまう処理はないので、上記の順番でスクリプトの修正を行っていければ、設計した処理の流れを実装することが出来ます。
処理の流れはそれとして、その流れを実装していくには、果たしてどのスクリプトから実装を考えていけばよいか、その順番は別として考えることが大切です。