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

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

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

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

Unity

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

Q&A

解決済

2回答

1433閲覧

Unity ゲームデータ セーブ機能 エラー

nanakaka

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2021/10/26 02:50

編集2021/10/26 03:15

前提・実現したいこと

Unityでセーブロードのシステムを作っています。

実行前はエラーメッセージはないのですが、SaveLoadFileを関連付けているButtonを押すと、エラーメッセージが出てきます。

どのように解決すれば良いのでしょうか?
教えてください。
よろしくお願いします。

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

エラーメッセージ
NullReferenceException: Object reference not set to an instance of an object
SaveLoadFile.Save () (at Assets/SaveLoadFile.cs:41)
UnityEngine.Events.InvokableCall.Invoke () (at <ef667cdc82bf4a4e911d1ddea9ff581d>:0)
UnityEngine.Events.UnityEvent.Invoke () (at <ef667cdc82bf4a4e911d1ddea9ff581d>:0)
UnityEngine.UI.Button.Press () (at C:/Program Files/Unity/Hub/Editor/2020.3.9f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:68)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/Program Files/Unity/Hub/Editor/2020.3.9f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:110)
UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/Program Files/Unity/Hub/Editor/2020.3.9f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/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 C:/Program Files/Unity/Hub/Editor/2020.3.9f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:262)
UnityEngine.EventSystems.EventSystem:Update() (at C:/Program Files/Unity/Hub/Editor/2020.3.9f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:385)

該当のソースコード

C#

1ソースコードusing UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using System.IO; 5using System.Runtime.Serialization.Formatters.Binary; 6using System; 7 8public class SaveLoadFile : MonoBehaviour 9{ 10 11 // 入力フィールド 12 [SerializeField] 13 public string inputField; 14 15 [SerializeField] 16 public float HPdata; 17 [SerializeField] 18 public float playerxdata; 19 [SerializeField] 20 public float prayerydata; 21 22 // ファイルストリーム 23 private FileStream fileStream; 24 // バイナリフォーマッター 25 private BinaryFormatter bf; 26 27 private CreateNewData createNewData; 28 29 private player PlayerSclipt; 30 private DamageCheckSclipt HPSclipt; 31 32 33 void Start() 34 { 35 createNewData = GetComponent<CreateNewData>(); 36 } 37 38 public void Save() 39 { 40 41 HPdata = HPSclipt.HP(); 42 playerxdata = PlayerSclipt.X(); 43 prayerydata = PlayerSclipt.Y(); 44 45 46 createNewData.GetSaveData().SetHp(HPdata); 47 48 createNewData.GetSaveData().SetPlayerX(playerxdata); 49 50 createNewData.GetSaveData().SetPlayerY(prayerydata); 51 52 53 inputField = createNewData.GetSaveData().GetJsonData(); 54 55 56 bf = new BinaryFormatter(); 57 fileStream = null; 58 59 60 61 62 try 63 { 64 // ゲームフォルダにfiledata.datファイルを作成 65 fileStream = File.Create(Application.dataPath + "/filedata.dat"); 66 // クラスの作成 67 Data data = new Data(); 68 // 入力フィールドのテキストをクラスのデータに保存 69 data.dataText = inputField; 70 // ファイルにクラスを保存 71 bf.Serialize(fileStream, data); 72 } 73 catch (IOException e1) 74 { 75 Debug.Log("ファイルオープンエラー"); 76 } 77 finally 78 { 79 if (fileStream != null) 80 { 81 fileStream.Close(); 82 } 83 } 84 } 85 86 public void Load() 87 { 88 bf = new BinaryFormatter(); 89 fileStream = null; 90 91 try 92 { 93 // ファイルを読み込む 94 fileStream = File.Open(Application.dataPath + "/filedata.dat", FileMode.Open); 95 // 読み込んだデータをデシリアライズ 96 Data data = bf.Deserialize(fileStream) as Data; 97 //inputField.text = data.dataText; 98 } 99 catch (FileNotFoundException e1) 100 { 101 Debug.Log("ファイルがありません"); 102 } 103 catch (IOException e2) 104 { 105 Debug.Log("ファイルオープンエラー"); 106 } 107 finally 108 { 109 if (fileStream != null) 110 { 111 fileStream.Close(); 112 } 113 } 114 115 } 116 117 // 保存するデータクラス 118 [Serializable] 119 class Data 120 { 121 public string dataText; 122 } 123}

###試したこと
41行目を消しても42行目に、42行目を消しても43行目にエラーメッセージが出てくるのでその3行がエラーの原因だと思います。

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

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

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

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

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

1T2R3M4

2021/10/26 02:53

調べたこと、試したこと、Debugした結果を質問に追記していただけませんか。
guest

回答2

0

ベストアンサー

41行目を消しても42行目に、42行目を消しても43行目にエラーメッセージが出てくるのでその3行がエラーの原因だと思います。

HPdata = HPSclipt.HP(); playerxdata = PlayerSclipt.X(); prayerydata = PlayerSclipt.Y();

HPScliptとPlayerScliptにオブジェクトのコンポーネントを和エリアてる必要があります。そのためにはいくつか方法がありますが、例えば29,30行目を下記のように修正し、インスペクター上で対応するオブジェクトのコンポーネントをドラッグアンドドロップすればよいです。

//private player PlayerSclipt; //private DamageCheckSclipt HPSclipt; public player PlayerSclipt; public DamageCheckSclipt HPSclipt;

投稿2021/10/26 05:00

YOshim

総合スコア1085

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

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

nanakaka

2021/10/26 08:30

privateで取得しているスクリプトをすべてpublicで取得したらできました ありがとうございます!
guest

0

どのように解決すれば良いのでしょうか?

エラーメッセージに書かれている通り、41行目が実行されたときHPScliptにオブジェクトが設定されていないことが原因です。
HPScliptに何らかの値をセットしてください。
何をセットすればいいのかは、どのような動作を作りたいかによって質問者さんが決める必要があります。

投稿2021/10/26 02:58

ku__ra__ge

総合スコア4524

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

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

nanakaka

2021/10/26 03:33

他のスクリプトに下のようなスクリプトがあるのですが、これではHPScliptに値をセットできていないのでしょうか どのあたりが間違っているのかも教えていただけると幸いです。 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class DamageCheckSclipt : MonoBehaviour { private string Damagetag = "enemytag"; public Slider slider; public float hp; void Start() { hp = 20f; } void Heal() { if(Input.GetKeyDown("2")) { if (hp < 20) { hp++; slider.value = hp; } } } private void OnTriggerEnter2D(Collider2D collision) //コライダーの中に別のコライダーが入ったら { if (collision.tag == Damagetag) { if (hp > 0) { hp--; slider.value = hp; } } } public float HP() { return hp; } }
ku__ra__ge

2021/10/26 03:57

できません。具体的にはこのスクリプトのなかのどの行でHPScliptに値をセットできると考えたのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問