Unityと吉里吉里でSLGとかRPGを作るブログ

お疲れ様です。
やってもやっても作業が後から沸いてくる猫ダマシです。

今回は、いつかやろうと思っていた、TJSプラグインをセーブロードに対応させる方法です。
吉里吉里で動的ゲームを作成する場合、最も難易度が高いのが、このセーブとロード機能です。
というのも、吉里吉里に付いているセーブロード機能は、ノベルゲーム用のフレームワークであるKAGの機能であり、ノベル用に特化した形になっています。

そんな訳で、今回は2回に分けて「セーブ機能の説明」と「その実現方法」を解説していきます。

例によって、そのまま動くサンプルを用意しました。

■サンプルロード■
※解説用にちょっと特殊な作りになっています。
まずは、このブログを読んで下さい。


■KAGのセーブ機能でセーブされるもの

まずは、吉里吉里のセーブロード機能について、確認しておきましょう。
そもそも、吉里吉里のセーブとロードは何をセーブして何をロードするのか。

1.前景レイヤと背景レイヤの情報
2.変数の内、f.で始まるゲーム変数

これ以外に、画面をフルスクリーンにしているとか、既読のシナリオはどれか等の情報や、sf.で始まるシステム変数は、セーブロードとは別に保存されます。


■データ保存と読み込みの流れ

吉里吉里でのデータ保存方法は、かなり特殊な形をとっています。
まず、データは、セーブ可能なラベルを通った時に、その時のデータを保持します。
次に、saveタグなどで栞(セーブデータ)に上で保持されたデータが保存されます。

ロードまで含めると、こんな感じです

セーブ可能なラベルを通過
②上記時点の各種情報を保持
③saveタグで①のデータをセーブ
④loadタグで栞を読み込む
⑤保存さらた情報を元に、レイヤと変数が復元され、セーブしたラベルからスクリプトが実行される

セーブを実行した時点のデータを保存するのでは無く、セーブ可能なラベルを通過した時点のデータである点に注意です。
例えばですが、ノベルゲームを作って、セーブ可能なラベルを先頭におき、後は作らなければ、どこで保存しようと、ロードすれば最初に戻る訳です。

この仕様はノベルゲームにおいても、それなりに不便らしく、随時セーブ可能ラベルを自動てぶち込んでくれるスクリプトやプラグインが公開されています。
これで、セーブ可能ラベルを意識しなくて、セーブを実行した時の状態が保存されます。

ノベルゲームなら、これでめでたしめでたしなのですが、動的ゲームだとそうはいかない訳です。


■TJSスクリプトをセーブロードに対応させる

動的ゲームを作って、セーブデータを保存する場合、2つの壁が存在します。
1つは、TJSのプラグインをkag.addPluginでKAGに登録しても、レイヤも変数も保存しれくれない事です。
まずは、こちらを解決して行きます。

とはいえ、それ程難しくはありません、KAGPluginを継承しているので、セーブとロードが発生した場合、onStoreとonRestoreが呼び出されます。

と言う訳で、サンプルデータを見てください。
004_AroomPlugin
005_BroomPlugin
006_ItemWinPlugin
にセーブ処理と、ロード処理が入っています。

●セーブ処理
//------------------------------------
// セーブ処理
//------------------------------------
function onStore(f, elm)
{
  f.AroomPlugin = new Dictionary();
  f.AroomPlugin.close_flg = close_flg;
}

f.AroomPlugin = new Dictionary();
ここで、引数のfに自分のプラグイン名でデータ保存用の領域を確保してます。
f.で始まる変数。そうですゲーム変数ですね。
これが栞にセーブされる訳です。

●ロード処理
//------------------------------------
// ロード処理
//------------------------------------
function onRestore(f, clear, elm)
{
  if(f.AroomPlugin !== void)
  {
    //クローズフラグON
    if(f.AroomPlugin.close_flg == 1)
    {
      closeWin();
    }
    else
    {
      openWin("fore");
    }
  }
}


if(f.AroomPlugin !== void)
セーブデータに、自分の保存したデータがあるかチェックしてます。

if(f.AroomPlugin.close_flg == 1)
次にクローズフラグがONならば、今の状態に関わらず、クローズ。
OFFならばオープンします。
これで、保存時の状態に復元出来ます。

005_BroomPluginと006_ItemWinPluginには、取得したアイテム情報の取り扱いも行っています。
そちらも確認してみてください。


■動的ゲームにおけるセーブ処理

つづいて、2つ目の壁について説明したいと思います。
まずは、サンプルのこの画面を見てください。
セーブロード①
このサンプルでは、この鍵と●をクリックすると、アイテムを取得できる作りになっています。

セーブロード②
こんな感じですね。

セーブロード③

1回、このsavedataフォルダを消して、セーブボタンを押して見てください。
savedataフォルダが出来ましたね。
中を見ると、data2.kdtと言うファイルがあると思います。
これがセーブされた栞ファイルです。

では、試しに一旦吉里吉里を再起動して、ロードボタンを押して下さい。
どうですか、全くロードされませんね

次は同じ手順で、鍵と●を取った後、ラベルボタンセーブボタンを押してみて下さい。
そして、再び再起動してロードを実行してみて下さい。
どうですか?、今度はちゃんとロード出来ましたね

この問題が何故発生するかと言うと、
セーブ可能なラベルを通過
を行っていないからです。

ノベルゲームと違い、動的ゲームはセーブ可能なラベルを常に通る形にするのは難しいです。
ですので、今回の様に、セーブ直前にセーブ可能なラベルを通らせる必要があります。

実は、今回のサンプルには、TJSに挑戦!さんのセーブロードスクリプトを使用する予定でしたが、このスクリプトを動的ゲームで使うには、相当改造しないと無理そうだったので、諦めました。
次回は、セーブロード画面のサンプルを用意したいと思います。

因みに、当サークルのゲーム、「姫百合の乱」ではセーブロード機能も当然ついてます。
大規模な動的ゲームのサンプルが欲しい方は、こちらも如何でしょうか。
と最後は宣伝で締めさせて頂きます。





◆つぶつぶ主人公HP◆
スポンサーサイト
2013.04.06 / Top↑
Secret

TrackBackURL
→http://nekodamasi.blog79.fc2.com/tb.php/88-e28acce4