RMMV セーブ/ロード不可になる場合がある件[対処方法あり]

プラグイン中に特定の処理が入っていると、セーブ/ロード不能になる件。 対処方法あり。 一連の流れを時系列順にまとめ。
0
サンシロ @rev2nym

drive.google.com/file/d/0B9n88H… ツクールMVスクリプト「アナログムーブ」公開します。タイルによらない移動とアナログスティック入力に対応しています。 まだ未実装機能が多く実用には堪えないかもしれません。お試しにどうぞ~。 #RPGツクールMV #RPGMakerMV

2015-11-06 18:49:45
「おれだーっ」「からみ大将軍!?」 @tonbiniira

@rev2nym あと海外にも似たようなスクリプトありましたがセーブができなくなる不具合があったり1px移動は課題も多そうです

2015-11-06 21:32:28
サンシロ @rev2nym

@tonbiniira ありがとうございます!調べてみます。

2015-11-06 21:33:16
サンシロ @rev2nym

@tonbiniira フォロワーの隊列表示はいまのところ未対応です。イベント間のエラー落ちとセーブ不可確認しました。修正しようと思います。教えていただきありがとうございました!

2015-11-06 21:50:37
サンシロ @rev2nym

セーブできない…これすごく厄介だぞ…

2015-11-06 22:25:52
サンシロ @rev2nym

RPG Maker MVのセーブにおいて特定の条件下でセーブ不能になる現象を確認しました。循環参照を持つクラスが一つでも存在するとセーブ時に無現ループに陥ります(stack too deep系の例外が発生して続行不可)。#RPGツクールMV #RPGMakerMV

2015-11-06 23:27:39
サンシロ @rev2nym

セーブ不能になる現象を再現するプラグインを作成しました。以下のプラグインを有効にしてセーブしてみてください。#RPGツクールMV #RPGMakerMV drive.google.com/file/d/0B9n88H… twitter.com/rev2nym/status…

2015-11-06 23:44:04
サンシロ @rev2nym

よっしゃ!直したるで! ^q^

2015-11-06 23:55:12
サンシロ @rev2nym

セーブが出来ない件、簡単かと思ったら手に負えない雰囲気になってきたゾ

2015-11-07 01:27:39
サンシロ @rev2nym

一度セーブデータとして拾ったオブジェクトIDを記録しておいて、重複でセーブしないようにすればいいと思ったけど、JavaScriptにオブジェクトIDなんて概念はなかった!

2015-11-07 01:34:37
サンシロ @rev2nym

セーブは出来るようになったけど今度はロードに失敗するという!今夜はもう寝よう!

2015-11-07 02:19:41
サンシロ @rev2nym

drive.google.com/file/d/0B9n88H… 循環参照を持つオブジェクトに対応したセーブロード機能プラグインを作成しました。よかったらお試しください~。 twitter.com/rev2nym/status…

2015-11-07 03:18:31
サンシロ @rev2nym

方針としては「循環参照を切ることで無限ループを防ぐ」「一度参照したデータは次は参照しない」。これではセーブか漏れてしまうプロパティが出てしまう。対策します。できるはず。

2015-11-07 04:03:03
サンシロ @rev2nym

@Jun_A_sakamoto ありがとうございます!しかし申し訳ありません「どんなプラグインを導入していてもロード後に正常に動くか」は非常に怪しいです。具体的には循環参照を用いるプラグイン使用時は正常にセーブ・ロードできません。もし使用するなら入念なテストを強く推奨します><。

2015-11-07 11:14:02
サンシロ @rev2nym

MVの循環参照セーブ問題。元のセーブ機能はオブジェクトのデータ木構造を再帰的に無条件で値の評価をするから無限ループに陥る。昨晩の私の対策プラグインだと「循環参照を検出したらセーブしない」という手段で無限ループを回避したので、循環参照はセーブされないのです…。(トートロジー)

2015-11-07 11:25:45
サンシロ @rev2nym

「循環参照をセーブしない」ことによる弊害はもちろんあります。ロードしたときにもともと循環参照が入っていたところは null になってしまうのです。これらは JSON.stringify を使ってセーブしている以上、完全には解決できないのではないかと思っています。

2015-11-07 11:29:23
サンシロ @rev2nym

次善の対策としては、「循環参照を持つ処理を作らない」「もし循環参照を使うならロード時に必ず null を初期化する」くらいでしょうか。

2015-11-07 11:33:49
サンシロ @rev2nym

たとえばオブジェクト生成時に this を渡して保持させて、コールバックさせるようなクラスはアウトです。

2015-11-07 11:40:29
サンシロ @rev2nym

@rev2nym セーブ不能問題には未対応です。(リンクエラーにてツイート再掲)

2015-11-07 12:59:40
サンシロ @rev2nym

drive.google.com/open?id=0B9n88… ツクールMVプラグイン「循環参照対策セーブ機能」を更新。循環参照検知の精度が向上しました。 #RPGツクールMV #RPGMakerMV twitter.com/rev2nym/status…

2015-11-07 15:03:00
サンシロ @rev2nym

@rev2nym しかし未だ根本的な解決には至らず。

2015-11-07 15:04:28
サロンパス @saronpasu

@rev2nym おつかれさまです。 遅ればせながら、ようやく状況を半分ぐらい(?)理解しました。 プラグインで独自になんかセーブ/ロードしたいときは、JSONで処理できるオブジェクトで保存するということですよね。

2015-11-07 15:06:01
サンシロ @rev2nym

@saronpasu ありがとうございます。おっしゃる通りではあるんですが、そもそもMVのセーブ(オブジェクト分解)機能が循環参照を考慮していなかったのもあります。なのでJSONのstringify(整形文字列化)とMVのオブジェクト分解機能の二ヶ所に対策を施しています。

2015-11-07 15:16:46
サンシロ @rev2nym

@saronpasu 循環参照を考慮していないというよりも、嵌ったらとりあえず例外を投げる、といった感じでしたね。

2015-11-07 15:19:42
サロンパス @saronpasu

@rev2nym えっと。MVのセーブ機能の改善を独自にされようとしているのだと思います。(違ったらごめんなさい) それってスゴイと思うのですが。 しかるべき窓口(MakerMVの場合はバグレポートフォーラム)に連絡とかってされていましたでしょうか。

2015-11-07 15:23:57