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

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

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

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

Unity

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

コードレビュー

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

Q&A

解決済

7回答

12217閲覧

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

grape_ll

総合スコア83

C#

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

Unity

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

コードレビュー

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

0グッド

0クリップ

投稿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}

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

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

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

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

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

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

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

guest

回答7

1

ベストアンサー

ぱっと見だけども…

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

そうでないなら最低限

diff

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

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

投稿2021/06/29 23:25

gentaro

総合スコア8949

grape_ll👍を押しています

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

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

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

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

grape_ll

2021/06/30 01:57

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

2023/08/25 05:27 編集

Such an interesting article here. I was searching for something like that for quite a long time and at last I have found it here. [url=https://www.jacketmakers.com/product/deadpool-3-wolverine-leather-jacket/]Wolverine Leather Jacket[/url]
guest

0

The best faux leather jackets are the ones that actually make you happy. And our effort is to provide you with [url=https://fauxjacket.com/product/mens-orange-faux-leather-moto-jacket/]orange faux leather jacket[/url]. So visit our site now.

投稿2023/09/22 05:19

LeylaDoyle

総合スコア2

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

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

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

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

0

Lerenjack gets your hands on the most exclusive piece by Movie Jackets,and Leather Jackets Apparel with an amazing discount. Gaming Jackets

投稿2023/09/19 06:57

lerenjack

総合スコア2

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

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

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

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

0

Pacman is a classic arcade game that has been around for over 30 years. It was first released in Japan on May 22, 1980, and quickly became one of the most popular games of all time. To celebrate its milestone anniversary, Pacman received an updated version called ” pacman 30th anniversary”.

投稿2023/08/30 09:00

pacman9937

総合スコア2

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

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

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

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

0

共有していただき、誠にありがとうございます run 3。私の素晴らしい仕事に役立ち、あなたのおかげで作業時間を大幅に短縮できました。 私はクォードル、テンプル ランなどのゲームをコーディングしました。興味があれば run 3 online、ぜひご連絡ください。

投稿2023/06/21 03:08

markola

総合スコア8

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

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

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

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

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

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

0

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

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

投稿2021/06/29 22:12

y_waiwai

総合スコア87267

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

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

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

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

grape_ll

2021/06/30 01:50

なるほど,見てみます.
pacman9937

2023/09/02 06:07

The history of Pacman 30th Anniversary dates back to 1980 when Namco, a Japanese game development company, first released the original Pac-Man. Creator Toru Iwatani’s inspiration for the game was sparked by pizza – he wanted to create a game that would appeal to both men and women alike during their lunch breaks.Pac-Man became an instant hit in Japan before it made its way overseas to America in October of the same year. It quickly gained popularity among arcade-goers worldwide, with many gaming enthusiasts becoming obsessed with beating each other’s high scores. <a href="https://pacman-30thanniversary.net/">Pacman</a>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.68%

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

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

質問する

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

C#

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

Unity

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

コードレビュー

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