2023年9月2日

エディターでは完全に機能していたのに、ビルドしたら使えず、セーブ変数に騙されたと思った話です。被害者面していますが、ただの確認不足です。

セーブ変数

Unityのビジュアルスクリプティングにはセーブ変数という便利な機能があります。

このセーブ変数(Saved Variables)はPlayerPrefsというUnity標準セーブ機能が使われており、数字1件や文字列1件を保存することができます。しかしリストは保存できない、ということを今回知りました。

エディターでは完全に動いていたのに、WebGLでビルドしてゲームページを更新したらセーブが消えてしまっていて、おかしいなと思ってました。普通の変数としてはちゃんと機能していて、保存だけが上手くいっていませんでした。

PlayerPrefsで保存できるのは3種類(String、Float、Int)だそうです。

私が使おうとしていたのはBooleanのリストで、Player Prefsではそもそもboolを保存できないようです。しかしunity3d.comにはセーブ変数にboolを使っている画像があります。 ???

私が今まで作ったゲームを見返すと、Floatはセーブ出来ていて、Booleanはセーブできていませんでした。やはりVisual Scriptingのセーブ変数も、文字列と数列しか保存できないのでは。 以前作ったゲームを見返したらあるゲームでは反映されているようでした。謎が深まります。初心者過ぎて色々なことが分からない……。

 

エディターでは完全に動いていたけどビルドしたら機能していなかったBooleanのセーブ↓

初心者過ぎて色々なことに確信が持てませんが、少なくとも私の環境ではそうなのでしょう。

 

使えると思い込んでいた件

前述したようにエディターでは完璧に動いていたんですよ……。再プレイしたときもエンディング取得情報が引き継がれていました。ちゃんとセーブできているように見えていたんです……。

しかもTypeになんでも指定できるので、座標情報やゲームオブジェクトも保存できると信じて疑いませんでした。

保存できないタイプを指定しても特に警告が出るわけではなく、ビルドして、テストプレイして、ページを再読み込みするとセーブが消えていて、そこで初めて機能していないと気づくのです……。

これは罠です。

 

Unityフォーラムでも私と同じ件で悩んでいらっしゃる方がいて、独自の解法を示してくださっていました。

私はEasySaveに任せることにします。簡単なWebGLのゲームなら今までのセーブ変数で充分です。今回の簡単なエンディングリストの管理の場合、0と1を単一の文字列にしてゴリ押ししてもよかったのかもしれません。

 

Easy Save

先日Easy Saveを入手したものの、「あんまり恩恵ないや」と思っていました。UVSなら、リストも座標情報も簡単に保存できると思い込んでいたからです。

今回の件で、世のUnity使いたちがこぞって買い求めている理由がやっと分かりました。同じPlayer Prefsという機能を使っている以上、まあそうなりますわ……。

 

 

おわりに

今まで全く気にしていませんでしたが、ちゃんとセーブ変数の説明欄に、「Unityオブジェクトリファレンスはサポートしてません」と書いてありました……。

Unity Visual Scriptingのセーブ変数は私のような初心者でもすぐ使うことが出来たので、とても便利です。こういう罠というか仕様が広く伝わればいいなと思います。

Categories: