質問: フィールドを歩いていて、敵とエンカウントしたら戦闘シーンに突入するといったことしようとしています。 ただ、シーンの切り替えの処理で質問があります。 シーン2からシーン1に戻った時に、シーン1の状態を保持する方法を教えてください。 ----------------------------------------- フィールドのシーン(シーン1)から戦闘のシーン(シーン2)に遷移の仕方はわかるのですが、 シーン2からシーン1に戻った際にキャラクターの座標がまた初期の位置になってしまいます。 また、DontDestroyOnLoad(キャラクターのオブジェクト)を使って解決しようとすると、シーン1に戻った際にキャラクターが2つに増えてしまいます。 こういう処理をする場合、どういう実装をするのがベストなんですか? あと、 画面遷移やゲームの進行の管理をするスクリプトはキャラクターに貼り付けるのが通常なんですか?
回答: >シーン1の状態を保持する方法 普通にやるなら、シーン1から2へ移動する前に全てのオブジェクトの位置と状態(変数)等を保存しておき、シーン2から1に移動した時にそれを反映させる、という方法しか無いかと思います。 >DontDestroyOnLoadするとキャラクターが増える 幾つかやり方はありますが、分かりやすいのは、 シーン2から1に移動する前にオブジェクト名を変更(「○○_used」など、元の名前と違っていれば何でもOK)→DontDestroyOnLoadを付けたオブジェクトのAwakeで「他に↑で決めた名前のオブジェクトがあり、このオブジェクトの名前が最初のままだったら、このオブジェクトは破壊する」というスクリプトを付ける というやり方です。 要は「2つ存在した時に新しい方を消す」ようにすればいいのです。 ただし他のオブジェクトの繋がりが存在するとややこしくなりますので工夫してください。 (例えばシーン1にだけ存在するオブジェクトがDontDestroyOnLoadを持つオブジェクトを参照していた場合、上記の処理を行う時は「シーン2からやって来たオブジェクトがある場合はそちらを参照」する処理が必要です) ちなみにこのような常に1つだけ存在するような機能を「シングルトン」と言います。検索してみるといいかもしれません。 >シーン処理 「シーンを遷移しない」という方法も検討に入れるといいかもしれません。 例えば「本来シーン1のフィールドでは絶対に見えない位置(すごい遠い座標とか)」に戦闘フィールドを用意しておき、戦闘に入ったら暗転して見えないようにしてからキャラクターを戦闘フィールドに移動させる、などすると、まるで別のシーンに移ったかのような処理が出来ます。 ただしそれはそれでメモリやライトマップの問題等あるので、「可能ならば」という形です。 >画面遷移やゲームの進行の管理をするスクリプトはキャラクターに貼り付ける? キャラクターが確実に全シーンに存在するならば、それでもいいと思います。 大抵はそうではない場合が多いので、私は別オブジェクトにしています。 (キャラクターは大抵多くのコンポーネントを持っているので、見た時の分かりやすさという意味でもオブジェクト分けは有用です)