保留にしていたSceneManagerクラスを作成する。
これもゲームオブジェクトの一つなので、GameObjectクラスを継承し純粋仮想関数を実装する。
現状ではRootJobの子にPlaySceneがいるが、間にSceneManagerを入れよう。
(RootJobのInitializeでSceneManagerを作成し、SceneManagerのInitializeでPlaySceneを作成する)
TestSceneクラスを作成する。
テスト用なので何もしなくて良い。(このシーンに切り替えて、何も表示されなければ成功)
シーンを切り替える処理はSceneManagerクラスに書くが、切り替えたいタイミングはいつ来るかわからない。
そこで、いつでもSceneManagerにアクセスできるように、GameObjectクラスにFindObject関数(名前でオブジェクトを検索できる関数)を作ろう。
まずは、名前を引数で受け取って、子や孫にその名前のオブジェクトが無いか探すFindChildObject関数を作ろう。
再起処理で比較的簡単に作れる。
見つけたらそのアドレスを返せばよい。
一番トップのRootJobのFindChildObject関数を呼べば、現在の全てのオブジェクトの中から検索することができる。
ということで、RootJobを探すGetRootJob関数を作成しよう。
そのオブジェクトがRootJobかどうかは「親がいるかどうか」でわかる。
親がnullptrであればそれがRootJobなのでthisを返せばいい。
親がいるのであれば、親のRootJob関数を呼べばいい。
いつかはRootJobにたどり着く。
ということで、FindObjectの中身は
return GetRootJob()->FindChildObject(〇〇〇〇);
みたいな一行でOK。
オブジェクトを削除するときと同様で、シーンを切り替えるタイミングには注意が必要。
SceneManagerクラスのUpdate関数で切り替えれば問題ないだろう。
SceneManagerクラスにenumで全シーンに名前を付けておく。 参照
「現在のシーン」と「次のシーン」の番号を入れる変数を用意する。
上の変数にはどちらも最初のシーンの番号を入れておく。
ChangeScene関数で「次のシーン」を変更できるようにしておく
Update関数で、上の2つの変数の中身が異なっていれば切り替え処理を行う
現在のシーンを含め、SceneManager以下の全オブジェクトを削除
ロードしたモデルやスプライトを削除
「次のシーン」の変数をみて、該当するシーンのオブジェクトを作成
「現在のシーン」の番号を入れる変数に「次のシーン」の値を代入する。