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

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

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

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

NullReferenceException: Object reference not set to an instance of an objectの解決

grape_ll
grape_ll

総合スコア83

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

9回答

0グッド

0クリップ

10713閲覧

投稿2021/06/29 14:14

###質問内容
NullReferenceException: Object reference not set to an instance of an object
を対処するにはどのようにすれば良いのか教えていただきたいです.
以下のサイトの立ち絵の表示の部分で詰まっております.

リンク内容

以下のエラーのでるコードの改変前で正常に動くものを作っているのですが,文字数制限であげることが出来ないので,次のnote記事に載せます.

質問用コード

###エラー

NullReferenceException: Object reference not set to an instance of an object GameManager.OnClick () (at Assets/Scripts/GameManager.cs:130) GameManager.Update () (at Assets/Scripts/GameManager.cs:98)

###エラーが出るコード

C#

1using UnityEngine; 2using UnityEngine.UI; 3using System.Collections.Generic; 4using System.Collections; 5 6// MonoBehaviourを継承することでオブジェクトにコンポーネントとして 7// アタッチすることができるようになる 8public class GameManager : MonoBehaviour{ 9 // SerializeFieldと書くとprivateなパラメーターでも 10 // インスペクター上で値を変更できる 11 [SerializeField] 12 private Text mainText; 13 [SerializeField] 14 private Text nameText; 15 [SerializeField] 16 private float captionSpeed = 0.2f; 17 [SerializeField] 18 private GameObject nextPageIcon; 19 [SerializeField] 20 private Image backgroundImage; 21 [SerializeField] 22 private string spritesDirectory = "Sprites/"; 23 [SerializeField] 24 private GameObject characterImages; 25 [SerializeField] 26 private string prefabsDirectory = "Prefabs/"; 27 28 private List<Image> _charaImageList = new List<Image>(); 29 30 31 // パラメーターを追加 32 private const char SEPARATE_MAIN_START = '「'; 33 private const char SEPARATE_MAIN_END = '」'; 34 private Queue<char> _charQueue; 35 private const char SEPARATE_PAGE = '&'; 36 private Queue<string> _pageQueue; 37 private const char SEPARATE_COMMAND = '!'; 38 private const char COMMAND_SEPARATE_PARAM = '='; 39 private const string COMMAND_BACKGROUND = "background"; 40 private const string COMMAND_SPRITE = "_sprite"; 41 private const string COMMAND_COLOR = "_color"; 42 private const string COMMAND_CHARACTER_IMAGE = "charaimg"; 43 private const string COMMAND_SIZE = "_size"; 44 private const string COMMAND_POSITION = "_pos"; 45 private const string COMMAND_ROTATION = "_rotate"; 46 private const string CHARACTER_IMAGE_PREFAB = "CharacterImage"; 47 48 49 private string _text = 50 "!background_sprite=\"background_sprite1\"!charaimg_sprite=\"polygon\"=\"background_sprite2\""+ 51 "!charaimg_size=\"polygon\"=\"500, 500, 1\"&ともり「トーキョーは 薄暗い閃光放って」&ともり 「消耗した MPも回復できぬまま」" + 52 "&!background_sprite=\"background_sprite2\"!background_color=\"255,0,255\"!charaimg_pos=\"polygon\"=\"-500, 500, 0\"&ともり「相当な 厄介者の説法聞いて」"; 53 54 55 /** 56 * 文を1文字ごとに区切り、キューに格納したものを返す 57 */ 58 private Queue<char> SeparateString(string str){ 59 // 文字列をchar型の配列にする = 1文字ごとに区切る 60 char[] chars = str.ToCharArray(); 61 Queue<char> charQueue = new Queue<char>(); 62 // foreach文で配列charsに格納された文字を全て取り出し 63 // キューに加える 64 foreach (char c in chars) charQueue.Enqueue(c); 65 return charQueue; 66 } 67 68 private bool OutputChar(){ 69 if (_charQueue.Count <= 0){ 70 nextPageIcon.SetActive(true); 71 return false; 72 } 73 mainText.text += _charQueue.Dequeue(); 74 return true; 75 } 76 77 78 // 文字送りするコルーチン 79 private IEnumerator ShowChars(float wait){ 80 // OutputCharメソッドがfalseを返す(=キューが空になる)までループする 81 while (OutputChar()) 82 // wait秒だけ待機 83 yield return new WaitForSeconds(wait); 84 // コルーチンを抜け出す 85 yield break; 86 } 87 88 //全文表示 89 private void OutputAllChar(){ 90 StopCoroutine(ShowChars(captionSpeed)); 91 while (OutputChar()) ; 92 nextPageIcon.SetActive(true); 93 } 94 95 // MonoBehaviourを継承しているとき,毎フレーム呼ばれる 96 private void Update(){ 97 // 左(=0)クリックされたらOnClickメソッドを呼び出し 98 if (Input.GetMouseButtonDown(0)) OnClick(); 99 } 100 101 //文字列を指定した区切り文字毎に区切り,キューに格納したものを返す 102 private Queue<string> SeparateString(string str, char sep){ 103 string[] strs = str.Split(sep); 104 Queue<string> queue = new Queue<string>(); 105 foreach (string l in strs) queue.Enqueue(l); 106 return queue; 107 } 108 109 //初期化 110 private void Init(){ 111 _pageQueue = SeparateString(_text, SEPARATE_PAGE); 112 ShowNextPage(); 113 } 114 115 //次のページの表示 116 private bool ShowNextPage(){ 117 if (_pageQueue.Count <= 0) return false; 118 // オブジェクトの表示/非表示を設定する 119 nextPageIcon.SetActive(false); 120 ReadLine(_pageQueue.Dequeue()); 121 return true; 122 } 123 124 private void Start(){ 125 Init(); 126 } 127 128 //クリックしたときの処理 129 private void OnClick(){ 130 if (_charQueue.Count > 0) OutputAllChar(); 131 else{ 132 if (!ShowNextPage()){ 133 // UnityエディタのPlayモードを終了する 134 UnityEditor.EditorApplication.isPlaying = false; 135 } 136 } 137 } 138 139 140 private void ReadLine(string text){ 141 // 最初が「!」だったら 142 if (text[0].Equals(SEPARATE_COMMAND)){ 143 ReadCommand(text); 144 ShowNextPage(); 145 return; 146 } 147 string[] ts = text.Split(SEPARATE_MAIN_START); 148 string name = ts[0]; 149 string main = ts[1].Remove(ts[1].LastIndexOf(SEPARATE_MAIN_END)); 150 nameText.text = name; 151 mainText.text = ""; 152 _charQueue = SeparateString(main); 153 StartCoroutine(ShowChars(captionSpeed)); 154 } 155 156 /* スプライトをファイルから読み出し、インスタンス化する*/ 157 private Sprite LoadSprite(string name){ 158 return Instantiate(Resources.Load<Sprite>(spritesDirectory + name)); 159 } 160 161 /*パラメーターから色を作成する*/ 162 private Color ParameterToColor(string parameter){ 163 string[] ps = parameter.Replace(" ", "").Split(','); 164 if (ps.Length > 3) 165 return new Color32(byte.Parse(ps[0]), byte.Parse(ps[1]), byte.Parse(ps[2]), byte.Parse(ps[3])); 166 else 167 return new Color32(byte.Parse(ps[0]), byte.Parse(ps[1]), byte.Parse(ps[2]), 255); 168 } 169 170 171 172 private void SetBackgroundImage(string cmd, string parameter){ 173 cmd = cmd.Replace(COMMAND_BACKGROUND, ""); 174 SetImage(cmd, parameter, backgroundImage); 175 } 176 177 /* 立ち絵の設定*/ 178 private void SetCharacterImage(string name, string cmd, string parameter){ 179 cmd = cmd.Replace(COMMAND_CHARACTER_IMAGE, ""); 180 name = name.Substring(name.IndexOf('"') + 1, name.LastIndexOf('"') - name.IndexOf('"') - 1); 181 Image image = _charaImageList.Find(n => n.name == name); 182 if (image == null){ 183 image = Instantiate(Resources.Load<Image>(prefabsDirectory + CHARACTER_IMAGE_PREFAB), characterImages.transform); 184 image.name = name; 185 _charaImageList.Add(image); 186 } 187 SetImage(cmd, parameter, image); 188 } 189 190/*パラメーターからベクトルを取得する*/ 191 private Vector3 ParameterToVector3(string parameter){ 192 string[] ps = parameter.Replace(" ", "").Split(','); 193 return new Vector3(float.Parse(ps[0]), float.Parse(ps[1]), float.Parse(ps[2])); 194 } 195 196 //コマンドの呼び出し 197 private void ReadCommand(string cmdLine){ 198 cmdLine = cmdLine.Remove(0, 1); 199 Queue<string> cmdQueue = SeparateString(cmdLine, SEPARATE_COMMAND); 200 foreach (string cmd in cmdQueue){ 201 string[] cmds = cmd.Split(COMMAND_SEPARATE_PARAM); 202 if (cmds[0].Contains(COMMAND_BACKGROUND)) 203 SetBackgroundImage(cmds[0], cmds[1]); 204 if (cmds[0].Contains(COMMAND_CHARACTER_IMAGE)) 205 SetCharacterImage(cmds[1], cmds[0], cmds[2]); 206 } 207 } 208 209 //画像の設定 210 private void SetImage(string cmd, string parameter, Image image){ 211 cmd = cmd.Replace(" ", ""); 212 parameter = parameter.Substring(parameter.IndexOf('"') + 1, parameter.LastIndexOf('"') - parameter.IndexOf('"') - 1); 213 switch (cmd){ 214 case COMMAND_SPRITE: 215 image.sprite = LoadSprite(parameter); 216 break; 217 case COMMAND_COLOR: 218 image.color = ParameterToColor(parameter); 219 break; 220 case COMMAND_SIZE: 221 image.GetComponent<RectTransform>().sizeDelta = ParameterToVector3(parameter); 222 break; 223 case COMMAND_POSITION: 224 image.GetComponent<RectTransform>().anchoredPosition = ParameterToVector3(parameter); 225 break; 226 case COMMAND_ROTATION: 227 image.GetComponent<RectTransform>().eulerAngles = ParameterToVector3(parameter); 228 break; 229 } 230 } 231 232 233 234 235}

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答9

1

ベストアンサー

ぱっと見だけども…

_charQueueとやらのインスタンスが生成される可能性のあるコードがReadLine(string)メソッドを通った場合だけなんだけど、質問文が想定している操作ではこのメソッドを通ることが保障されてるの?

そうでないなら最低限

diff

1- private Queue<char> _charQueue; 2+ private Queue<char> _charQueue = new Queue<char>();

ぐらいやっとけばエラーは起きないと思うけども。

投稿2021/06/29 23:25

gentaro

総合スコア8943

grape_ll👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

grape_ll

2021/06/30 01:57

教えていただいた通りに宣言したら問題なく動きました. ありがとうございます.

0

I think making a website like you is an advantage for you, I'm happy to share my feelings with everyone, I am very passionate about the game because it is very interesting. Please take the time to experience with me here: nytimes crossword

投稿2023/03/13 07:55

clamb78

総合スコア14

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

i like all of you anwser nice job guys دانلود موزیک شاد جدید

投稿2023/02/15 17:23

andymartin

総合スコア2

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

If it helps you visualize it better, you can think of a reference as a linking pointing to a web page, or a shortcut pointing to a file on your computer. Types such as int (and the other numerical primitive types), DateTime, and boolean are value types. That is, structs are value types. Classes are reference types. pacman 30th anniversary

投稿2023/01/30 01:25

fretfulreliable

総合スコア4

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

I still love this drift hunters game in the year 2023.

投稿2023/01/11 09:12

jeffreycrawford

総合スコア6

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

The message "object reference not set to an instance of an object" means that you are referring to an object the does not exist or was deleted or cleaned up. It's usually better to avoid a NullReferenceException than to handle it after it occurs color tunnel

投稿2022/12/14 07:25

Srewite

総合スコア2

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

jamsam

2023/01/09 12:50 編集

this is awesome!! thanks for posting

0

Since this is a business logic function, you shouldn't inspect the exception or catch the try here. Instead, you should let it throw the error away and let the UI or Presentation layer handle it. Since there is plainly no fault in this function, the object that used it and passed in a null object is the source of the error. Returning to tracing the object that called it and how the parameter was passed is the next step.
word hurdle

投稿2022/11/24 09:23

Mathew34

総合スコア4

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

NullReferenceExceptionが出るという事は、あなたがnullになっている事を想定しなかった変数がnullになっていたという事ですよね?何にしても、とりあえずデバッグしましょう。

・オブジェクトのセットし忘れ
単純に何かがセットされている筈だった変数にセットするのを忘れていた等。
ステップ実行し、デバッガで変数の値を確認すればすぐ判る。

・nullがセットされるケースがあるのを想定していなかった
特定のメソッドを呼んで、戻り値にnullが戻ってくるケースを考慮していなかった等。
プロパティにしてset時にStackFrameのログ取ったり、条件付きブレークポイントでも仕込んで、HITした時のメソッドの呼び出し履歴見れば、どこでnullがセットされたか判る。

例外は問題解決のためのヒントなので、例外が出た!で思考を止めずに、ちちんと例外オブジェクトの中身を分析しましょう。例外のStackFrameで発生個所、例外の種類で発生原因がおおよそ判るので、それらから調べればどこを直せばいいか特定しやすくなる筈です。

投稿2021/06/30 00:41

編集2021/06/30 00:43
退会済みユーザー

退会済みユーザー

総合スコア0

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

grape_ll

2021/06/30 01:52

ご回答ありがとうございます. おっしゃられたことをとりあえず上から確認してみることにします.

0

NullReferenceExceptionってのは、nullの変数(やnullのブツ)を使ってなにか操作しようとしてるときにでます。

そのエラーが出ている行(あるいはその前の行)にでてくる変数を片っ端から確認して、nullのものがないか探してみては

投稿2021/06/29 22:12

y_waiwai

総合スコア86471

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

grape_ll

2021/06/30 01:50

なるほど,見てみます.

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。