ScriptableObjectファイル挙動確認

エディターモードでは変更が永続的に保存される。

ビルド後はexeファイルを実行中は変更が保持されているが、ファイルを閉じると初期値にもどる。なので、セーブ機能としては使うことができない。
ファイルを閉じるまでは保持されているのでファイルを閉じる前にsaveデータとしてどこかしらに保存して置き、起動時にその保存ファイルをScriptableObjectファイルに適用してあげればいい。

public void SetNowScene(string name) {
        Debug.Log(GetGameManagerDataBase().NowScene);
        GetGameManagerDataBase().NowScene = name;
        Debug.Log("2 = " + GetGameManagerDataBase().NowScene);
        Debug.Log(GetGameManagerDataBase().NowScene);
        GameManagerDataBase a = GetGameManagerDataBase();
        Debug.Log("Data: " + a.NowScene);
}

public void PrintNowScene(){
Debug.Log(Resources.Load<SceneMoveInfo>("DataBase/SceneMoveInfo").NowScene)
}

コードで変更後、それを参照している限りは変更が保持される。
どこからも参照されなくなると、一番最初の値に戻る。
要検討

ScriptableObjectから作ったアセットファイルはどれか一つのアセットファイルを参照していると他のファイルも変更が保持される。ような気がしている。

値の変更が消える現象理解できたかも。

候補としては2つある。

1つ目。

変更が上書きする前にScriptableObjectへの参照がなくなってしまう。

変更→描きこみ→Save()処理終了ではなくて、変更→Save()処理終了になっており、描きこみが行われる前に変更内容が失われてしまう。

(playerStataDataBaseに対する変更は関数の一番最後にいっぺんに実行されるとか?)

保存されるタイミングとしてはフレームが終了した時かも。Destroy(gameobject)でオブジェクトが破壊されるタイミング近辺かな。

2つ目。

変更が上書きされるが、関数の終了と共に参照がなくなり、ScriptableObjectが初期値にさらに上書きされている。

今のところの総合的な判断。

ScriptableObjectが初期される条件はゲームを終了した時だけ。

上であげた例は1つ目が正解な気がする。

対処方法。

クラス変数にした。

ScriptableObjectの基礎!シーン間でデータ受け渡しなど

Unity

Posted by admin