妹、セーブデータとゲームインスタンスをわけたくない
妹「セーブゲームとゲームインスタンスって、一緒にしたら駄目なのかな? セーブする時とロードする時と、変数を全部コピーしてるんだけどさ、中身同じなのにコピーするだけとか無意味な気がする」
「セーブ出来るのと、レベルをまたいでデータを保持出来るのと、持ってる機能が違うから別々にはなる。でも多少簡単にする方法ならあるよ。例えセーブゲームのデータに必要なデータ全部入れといて、レベル移動の時にセーブしてロードする。普通のセーブデータとは別の、プレイヤーが選択出来ない隠しスロットに保存する」
妹「データをそのままにするんじゃなくて、セーブして持ち運ぶのか。それでもいいけど」
「この方法の難点はセーブしなくないデータが混ざっている場合に面倒なこと。普通にセーブする時に要らない部分までセーブされちゃう。かといって2つのクラスに分けたりするとまたややこしくなるし。それとディスクへの書き込みは不安定になりやすいところだから、出来るだけ減らしたいというのもある」
妹「他の方法は?」
「こういう感じで、セーブに必要なデータが詰まった構造体を作って、この型の変数をセーブゲームとゲームインスタンスの両方に作っておいたらどうかな。結局セーブとロードのたびにコピーするのは同じだけど、構造体まるごとコピー出来るから必要なノードは減らせるし、パラメータ追加してもセーブロードの仕組みを書き換えなくていい」
妹「データの読み書きが面倒になるんじゃない? HP書き換えるのとか」
「構造体のノードを出して、そこから個別のノードを取り出すことになるから、一段階余計なのが挟まるとは思う。そのへんは良い感じの関数を作るとか、レベルに変数作って普段はそこに構造体入れとくとか、何か対策が必要になるかも」
妹「この図のセーブしないって書いてるやつは?」
「セーブはしないけどレベルをまたいで必要になるデータ。どんなデータかと言われると……すぐには出てこないけど。ともかくそういうデータが必要な場合は、セーブ用の構造体とは別にしておくと、不要なデータをセーブしないで済む」
妹「これ構造体じゃなくてクラスじゃ駄目なの?」
「駄目じゃないかもしれないけど、クラスというか、クラスの読み込みは結構やっかいで、経験上思ったように動かないことが多いんだよ。UE4の場合どうなるかわからないけど。とりあえず参照型のメンバーを持ってない構造体が無難だと思う。バグとかで変なことになるにしても、見てわかるレベルでの変なことにしかしないから」
妹「じゃ配列は?」
「値型の配列なら大丈夫じゃないかと思うけど、微妙なラインだから実験してよく確かめてからの方がいいと思う」