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

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

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

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

Unity

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

Q&A

1回答

1313閲覧

Unityのアセット"QuickSave"で暗号化したい

ArironUnit

総合スコア3

C#

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

Unity

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

0グッド

0クリップ

投稿2023/01/19 02:04

編集2023/01/19 04:17

前提

Unityでゲームを開発中です。
セーブ&ロードをボタンで操作したいと思い、"QuickSave"という無料アセットを導入しました。
参考にしているのは、
Assets > QuickSave > Example
の中にある、ExampleSceneというシーンです。
入力欄に文字を入れて[Save]ボタンを押せば、入力内容を記録したJsonファイルが所定の場所に作成され、
[Load]ボタンを押せばそのJsonファイルからデータが呼び出されます。
ところが、このJsonファイルは、暗号化されていません。
"QuickSave"には暗号化&圧縮の機能もあるのですが、このExampleSceneには実装されていないようです。
そこで、以下の2件のサイトを参考に、暗号化&圧縮を試みたのですが、うまくいきませんでした。

実現したいこと

  • アセット"QuickSave"を使用し、
  • セーブ&ロードをボタンで操作、かつ、
  • セーブデータは暗号化&圧縮されていること

SaveボタンとLoadボタンにアタッチされているスクリプトのソースコード

C#

1//セーブ&ロードはちゃんとできますが、暗号化・圧縮はされません。 2using CI.QuickSave; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ExampleSceneManagerController : MonoBehaviour 7{ 8 public InputField Input1; 9 public InputField Input2; 10 public InputField Input3; 11 public InputField Input4; 12 public InputField Input5; 13 public InputField Input6; 14 public InputField Input7; 15 public InputField Input8; 16 public InputField Content; 17 18 public void Save() 19 { 20 QuickSaveWriter.Create("Inputs") 21 .Write("Input1", Input1.text) 22 .Write("Input2", Input2.text) 23 .Write("Input3", Input3.text) 24 .Write("Input4", Input4.text) 25 .Commit(); 26 Content.text = QuickSaveRaw.LoadString("Inputs.json"); 27 } 28 29 public void Load() 30 { 31 QuickSaveReader.Create("Inputs") 32 .Read<string>("Input1", (r) => { Input5.text = r; }) 33 .Read<string>("Input2", (r) => { Input6.text = r; }) 34 .Read<string>("Input3", (r) => { Input7.text = r; }) 35 .Read<string>("Input4", (r) => { Input8.text = r; }); 36 } 37}

試したこと

上記2件のサイトを参考に、スクリプトを以下の様に変更しました。

C#

1using CI.QuickSave; 2using UnityEngine; 3using UnityEngine.UI; 4 5public class ExampleSceneManagerController : MonoBehaviour 6{ 7 public InputField Input1; 8 public InputField Input2; 9 public InputField Input3; 10 public InputField Input4; 11 public InputField Input5; 12 public InputField Input6; 13 public InputField Input7; 14 public InputField Input8; 15 public InputField Content; 16 public QuickSaveSettings settings; 17 18 private void Start() 19 { 20 QuickSaveSettings settings = new QuickSaveSettings(); 21 settings.SecurityMode = SecurityMode.Aes; 22 settings.Password = "PassWord"; 23 settings.CompressionMode = CompressionMode.Gzip; 24 } 25 26 public void Save() 27 { 28 QuickSaveWriter.Create("Inputs", settings) 29 .Write("Input1", Input1.text) 30 .Write("Input2", Input2.text) 31 .Write("Input3", Input3.text) 32 .Write("Input4", Input4.text) 33 .Commit(); 34 Content.text = QuickSaveRaw.LoadString("Inputs.json"); 35 } 36 37 public void Load() 38 { 39 QuickSaveReader.Create("Inputs", settings) 40 .Read<string>("Input1", (r) => { Input5.text = r; }) 41 .Read<string>("Input2", (r) => { Input6.text = r; }) 42 .Read<string>("Input3", (r) => { Input7.text = r; }) 43 .Read<string>("Input4", (r) => { Input8.text = r; }); 44 } 45}

Visual Studio 2022上ではエラーは現れませんが、Unityで実行し、[Save]ボタンを押すと、
何もセーブされない上に、以下のエラーメッセージが出ます。

発生している問題・エラーメッセージ

NullReferenceException: Object reference not set to an instance of an object CI.QuickSave.QuickSaveBase.Load (System.Boolean rootMightNotExist) (at Assets/QuickSave/QuickSaveBase.cs:53) CI.QuickSave.QuickSaveWriter.Create (System.String root, CI.QuickSave.QuickSaveSettings settings) (at Assets/QuickSave/QuickSaveWriter.cs:40) ExampleSceneManagerController.Save () (at Assets/QuickSave/Example/ExampleSceneManagerController.cs:28) UnityEngine.Events.InvokableCall.Invoke () (at <3be1a7ff939c43f181c0a10b5a0189ac>:0) UnityEngine.Events.UnityEvent.Invoke () (at <3be1a7ff939c43f181c0a10b5a0189ac>:0) UnityEngine.UI.Button.Press () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:68) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:110) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:262) UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:385)

どうすればよいのか、ご教唆いただければ助かります。

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

Unityバージョン:2020.3.32f1 Personal

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

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

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

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

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

YAmaGNZ

2023/01/19 02:12

>をvoid Start()の中に入れ、かつ、QuickSaveWriter.CreateとQuickSaveReader.Createの引数を、 以降を言葉で説明するのではなく、このようなコードをを組んでこうなったと説明しないと何をどうやったのかは正確に伝わらないでしょう。 私がその部分を読んで思ったのは、ただ変数のスコープが理解できていないだけでは?ということでした。 なので、コード分割したり、言葉で説明するのではなく、現象の発生する全体コードを提示し「このコードでこうなります」と説明すべきかと思います。
ArironUnit

2023/01/19 04:22

コメントありがとうございます。 おっしゃる通り、基本的なところが理解できていないという自覚があります。 言葉で説明していた個所をコードなどに書き換えてみましたので、再度検討していただければ幸いです。
guest

回答1

0

16行目にて
public QuickSaveSettings settings;
とsettingsという変数を宣言しています。

そして、20行目でも
QuickSaveSettings settings = new QuickSaveSettings();
とsettingsという変数を宣言し、新しいQuickSaveSettingsを作成し代入しています。

この16行目で宣言した変数と20行目で宣言した変数は別物として扱われます。
なので20行目でsettingsに代入していても16行目の変数settingsには何も入っていないことになります。

そして、変数が有効な範囲は簡単にいいますと宣言されている{}の中となります。
16行目の宣言の場合ですと6行~45行の間、20行目の宣言の場合ですと19行~24行の間となります。

なので28行目や39行目で使用できるのは16行目で宣言したsettingsとなります。
そしてそのsettingsには何も入っていないのでNullReferenceExceptionとエラーになります。

ですから、変数の宣言やスコープについて学習しましょう。

投稿2023/01/19 04:53

YAmaGNZ

総合スコア10258

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

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

ArironUnit

2023/01/19 07:59

ご回答ありがとうございます。 いただいた内容は理解できました。 変数の宣言やスコープについて、webですぐに調べられる範囲では確認しました。 おかげで、これではダメだ、と言うことは分かりましたが、ではどうすればいいのかが分かりません。 とりあえず、20行目から23行目をSave()とLoad()の中にそれぞれ入れてやれば、スコープの問題はなくなりました。 本当はもっとスマートで正式なやり方があるような気がするのですが…。 …ところが今度は別の問題が起こりました。 そちらの方は、QuickSaveというアセット特有の問題だと思われます。 これについては、新しい質問として投稿しようと思います。 ご教授いただきまして、ありがとうございました。
YAmaGNZ

2023/01/19 08:33

質問に提示されているソースのStartメソッド内の QuickSaveSettings settings = new QuickSaveSettings(); と変数を新たに宣言しているのが悪いので settings = new QuickSaveSettings(); と宣言してあるものに対して代入するだけにすればいいだけです。
ArironUnit

2023/01/19 11:04

ありがとうございます。 もっとシンプルに質問すればよかったと反省しています。 要するに、上記の「SaveボタンとLoadボタンにアタッチされているスクリプトのソースコード」を修正して、セーブデータを暗号化&圧縮できるようにしたい、とだけ書けばよかったです。 結局、いまだに実現しておりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問