妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

妹、セーブデータとゲームインスタンスをわけたくない

妹「セーブゲームとゲームインスタンスって、一緒にしたら駄目なのかな? セーブする時とロードする時と、変数を全部コピーしてるんだけどさ、中身同じなのにコピーするだけとか無意味な気がする」

「セーブ出来るのと、レベルをまたいでデータを保持出来るのと、持ってる機能が違うから別々にはなる。でも多少簡単にする方法ならあるよ。例えセーブゲームのデータに必要なデータ全部入れといて、レベル移動の時にセーブしてロードする。普通のセーブデータとは別の、プレイヤーが選択出来ない隠しスロットに保存する」

妹「データをそのままにするんじゃなくて、セーブして持ち運ぶのか。それでもいいけど」

「この方法の難点はセーブしなくないデータが混ざっている場合に面倒なこと。普通にセーブする時に要らない部分までセーブされちゃう。かといって2つのクラスに分けたりするとまたややこしくなるし。それとディスクへの書き込みは不安定になりやすいところだから、出来るだけ減らしたいというのもある」

妹「他の方法は?」

f:id:una_unagi:20150831234713p:plain

「こういう感じで、セーブに必要なデータが詰まった構造体を作って、この型の変数をセーブゲームとゲームインスタンスの両方に作っておいたらどうかな。結局セーブとロードのたびにコピーするのは同じだけど、構造体まるごとコピー出来るから必要なノードは減らせるし、パラメータ追加してもセーブロードの仕組みを書き換えなくていい」

妹「データの読み書きが面倒になるんじゃない? HP書き換えるのとか」

「構造体のノードを出して、そこから個別のノードを取り出すことになるから、一段階余計なのが挟まるとは思う。そのへんは良い感じの関数を作るとか、レベルに変数作って普段はそこに構造体入れとくとか、何か対策が必要になるかも」

妹「この図のセーブしないって書いてるやつは?」

「セーブはしないけどレベルをまたいで必要になるデータ。どんなデータかと言われると……すぐには出てこないけど。ともかくそういうデータが必要な場合は、セーブ用の構造体とは別にしておくと、不要なデータをセーブしないで済む」

妹「これ構造体じゃなくてクラスじゃ駄目なの?」

「駄目じゃないかもしれないけど、クラスというか、クラスの読み込みは結構やっかいで、経験上思ったように動かないことが多いんだよ。UE4の場合どうなるかわからないけど。とりあえず参照型のメンバーを持ってない構造体が無難だと思う。バグとかで変なことになるにしても、見てわかるレベルでの変なことにしかしないから」

妹「じゃ配列は?」

「値型の配列なら大丈夫じゃないかと思うけど、微妙なラインだから実験してよく確かめてからの方がいいと思う」