質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2815閲覧

Unityのアセット"Quick Save"でのロードが動作しない

Imoring

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/11/10 09:03

前提

Unityにてゲームを作成中です。
セーブ機能を実装しようとQuick Saveというアセットを導入し、ネット上に記載されていた同アセットの使い方を参考に、
①ゲーム全体で使用する変数および、起動時にロードを行う処理を記載したスクリプト”GameData.cs”
と、
②ボタンを押すことで"GameData.cs"内の変数を書き換え、同時にその数値をJsonに書き出すスクリプト
の2つのスクリプトを作成しました。

しかし、Jsonファイルに変数を書き出すところまでは上手く行ったのですが、それをロードするところがうまく動いてくれません。
また、エラーメッセージはありません。
どなたか原因を教えていただきたいです。

下がスクリプトを作る際に参考にさせていただいたサイトです
https://fineworks-fine.hatenablog.com/entry/2022/09/01/073000

実現したいこと

ロード処理を実行できるようにする。

該当のソースコード

C#

1//1番のスクリプト 2 3using System.Collections; 4using System.Collections.Generic; 5using System; 6using UnityEngine; 7using CI.QuickSave; 8 9public class GameData 10{ 11 //ゲーム全体で使う変数 12 public static byte test; 13 14 void Start() 15 { 16   //ロード処理 17 // QuickSaveReaderのインスタンスを作成 18 QuickSaveReader reader = QuickSaveReader.Create("GameData"); 19 // データを読み込む 20 byte test = reader.Read<byte>("Test"); 21 22 //ロードが正常に行われたかの確認用。ここには0と表示される。 23 Debug.Log("Test:" + test); 24 } 25} 26 27 28//2番のスクリプト 29 30using System.Collections; 31using System.Collections.Generic; 32using UnityEngine; 33using UnityEngine.UI; 34using CI.QuickSave; 35 36public class TestScript : MonoBehaviour 37{ 38 public void OnClick() 39 { 40 GameData.test = 1; 41 42 //セーブ処理 43 // QuickSaveWriterのインスタンスを作成 44 QuickSaveWriter writer = QuickSaveWriter.Create("GameData"); 45 // データを書き込む 46 writer.Write("Test", GameData.test); 47 writer.Commit(); 48 49 //正常にセーブされたかの確認用。ここには1と表示される。 50 Debug.Log(GameData.test); 51 } 52}

試したこと

①のスクリプトのロード処理部分をStartではなくAwakeに入れてみたり、別スクリプトに移してボタンを押したらロードするようにしてみましたが、それでも変化はありませんでした。

補足情報(FW/ツールのバージョンなど)

Unity2021.3.10f1
上記のとおり、セーブ時のDebug.Logには正常な数値が表示されているのでセーブまでは動いています。
が、ロードすると初期値の0になってしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lazh

2022/11/11 01:11

記載された内容だと、 GameDataのStart()が呼ばれることはないですがソースコードはあってますか?
Imoring

2022/11/11 01:35

一度ゲームを終了した後、次回起動した際にロードを行う想定でStart()にしているのですが、まずかったでしょうか。 何分まだ仕様をいまいち理解しきれていないもので…。
lazh

2022/11/11 01:53

GameDataはTestScriptのようにMonoBehaviourを継承していないので起動時にStart()は呼ばれないです 簡単に確認しようと思ったらMonoBehaviourを付けてヒエラルキーの適当なオブジェクトに付けるとログが出ると思います
Imoring

2022/11/11 09:52

ありがとうございます。おっしゃる通りにMonoBehaviourを付けてみたところ正常にロードをしてくれました。 しかし別の問題も発生してしまいまして、上二つとは別のスクリプト(仮にTheOtherScriptとします)のUpdate()にてGameData内のtestの値によって画面に表示するものを変更する、といった処理を組んでいたのですが、こちらがロードした後のtestの数値を反映してくれなくなりました。 ゲーム実行中のTestScript内のOnClick ()によるtestの数値の変化は反映してくれるのでTheOtherScriptのコードに異常はなさそうなのですが、原因わかりますでしょうか。
lazh

2022/11/11 13:00 編集

このソースだと >public static byte test; >byte test = reader.Read<byte>("Test"); ローカルで新しくtestを宣言してそっちに値を入れてるので、 グローバルのtestにはロードされた値は入りません 当然他のスクリプトで参照しているのは上のやつなので反映されないです 勘違いの原因にしかならないので同じ名前の変数は付けない方がいいと思います
Imoring

2022/11/11 14:12

なるほど、頭に型名を付けてしまったせいで別の変数だとUnity側に思われてしまっていたんですね。 お恥ずかしい限りです。 ですがおかげさまで無事解決することが出来ました。 重ね重ね本当にありがとうございました。
guest

回答1

0

自己解決

自己解決ではありませんが、コメントにて解決法をご提示いただいたのでこれをもって解決済みとさせていただきます。

投稿2022/11/11 14:14

Imoring

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問