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

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

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

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

Unity

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

コードレビュー

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

解決済

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で書かれたコードにも対応しています。

コードレビュー

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

4回答

0リアクション

0クリップ

8995閲覧

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

using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; using System.Collections; // MonoBehaviourを継承することでオブジェクトにコンポーネントとして // アタッチすることができるようになる public class GameManager : MonoBehaviour{ // SerializeFieldと書くとprivateなパラメーターでも // インスペクター上で値を変更できる [SerializeField] private Text mainText; [SerializeField] private Text nameText; [SerializeField] private float captionSpeed = 0.2f; [SerializeField] private GameObject nextPageIcon; [SerializeField] private Image backgroundImage; [SerializeField] private string spritesDirectory = "Sprites/"; [SerializeField] private GameObject characterImages; [SerializeField] private string prefabsDirectory = "Prefabs/"; private List<Image> _charaImageList = new List<Image>(); // パラメーターを追加 private const char SEPARATE_MAIN_START = '「'; private const char SEPARATE_MAIN_END = '」'; private Queue<char> _charQueue; private const char SEPARATE_PAGE = '&'; private Queue<string> _pageQueue; private const char SEPARATE_COMMAND = '!'; private const char COMMAND_SEPARATE_PARAM = '='; private const string COMMAND_BACKGROUND = "background"; private const string COMMAND_SPRITE = "_sprite"; private const string COMMAND_COLOR = "_color"; private const string COMMAND_CHARACTER_IMAGE = "charaimg"; private const string COMMAND_SIZE = "_size"; private const string COMMAND_POSITION = "_pos"; private const string COMMAND_ROTATION = "_rotate"; private const string CHARACTER_IMAGE_PREFAB = "CharacterImage"; private string _text = "!background_sprite=\"background_sprite1\"!charaimg_sprite=\"polygon\"=\"background_sprite2\""+ "!charaimg_size=\"polygon\"=\"500, 500, 1\"&ともり「トーキョーは 薄暗い閃光放って」&ともり 「消耗した MPも回復できぬまま」" + "&!background_sprite=\"background_sprite2\"!background_color=\"255,0,255\"!charaimg_pos=\"polygon\"=\"-500, 500, 0\"&ともり「相当な 厄介者の説法聞いて」"; /** * 文を1文字ごとに区切り、キューに格納したものを返す */ private Queue<char> SeparateString(string str){ // 文字列をchar型の配列にする = 1文字ごとに区切る char[] chars = str.ToCharArray(); Queue<char> charQueue = new Queue<char>(); // foreach文で配列charsに格納された文字を全て取り出し // キューに加える foreach (char c in chars) charQueue.Enqueue(c); return charQueue; } private bool OutputChar(){ if (_charQueue.Count <= 0){ nextPageIcon.SetActive(true); return false; } mainText.text += _charQueue.Dequeue(); return true; } // 文字送りするコルーチン private IEnumerator ShowChars(float wait){ // OutputCharメソッドがfalseを返す(=キューが空になる)までループする while (OutputChar()) // wait秒だけ待機 yield return new WaitForSeconds(wait); // コルーチンを抜け出す yield break; } //全文表示 private void OutputAllChar(){ StopCoroutine(ShowChars(captionSpeed)); while (OutputChar()) ; nextPageIcon.SetActive(true); } // MonoBehaviourを継承しているとき,毎フレーム呼ばれる private void Update(){ // 左(=0)クリックされたらOnClickメソッドを呼び出し if (Input.GetMouseButtonDown(0)) OnClick(); } //文字列を指定した区切り文字毎に区切り,キューに格納したものを返す private Queue<string> SeparateString(string str, char sep){ string[] strs = str.Split(sep); Queue<string> queue = new Queue<string>(); foreach (string l in strs) queue.Enqueue(l); return queue; } //初期化 private void Init(){ _pageQueue = SeparateString(_text, SEPARATE_PAGE); ShowNextPage(); } //次のページの表示 private bool ShowNextPage(){ if (_pageQueue.Count <= 0) return false; // オブジェクトの表示/非表示を設定する nextPageIcon.SetActive(false); ReadLine(_pageQueue.Dequeue()); return true; } private void Start(){ Init(); } //クリックしたときの処理 private void OnClick(){ if (_charQueue.Count > 0) OutputAllChar(); else{ if (!ShowNextPage()){ // UnityエディタのPlayモードを終了する UnityEditor.EditorApplication.isPlaying = false; } } } private void ReadLine(string text){ // 最初が「!」だったら if (text[0].Equals(SEPARATE_COMMAND)){ ReadCommand(text); ShowNextPage(); return; } string[] ts = text.Split(SEPARATE_MAIN_START); string name = ts[0]; string main = ts[1].Remove(ts[1].LastIndexOf(SEPARATE_MAIN_END)); nameText.text = name; mainText.text = ""; _charQueue = SeparateString(main); StartCoroutine(ShowChars(captionSpeed)); } /* スプライトをファイルから読み出し、インスタンス化する*/ private Sprite LoadSprite(string name){ return Instantiate(Resources.Load<Sprite>(spritesDirectory + name)); } /*パラメーターから色を作成する*/ private Color ParameterToColor(string parameter){ string[] ps = parameter.Replace(" ", "").Split(','); if (ps.Length > 3) return new Color32(byte.Parse(ps[0]), byte.Parse(ps[1]), byte.Parse(ps[2]), byte.Parse(ps[3])); else return new Color32(byte.Parse(ps[0]), byte.Parse(ps[1]), byte.Parse(ps[2]), 255); } private void SetBackgroundImage(string cmd, string parameter){ cmd = cmd.Replace(COMMAND_BACKGROUND, ""); SetImage(cmd, parameter, backgroundImage); } /* 立ち絵の設定*/ private void SetCharacterImage(string name, string cmd, string parameter){ cmd = cmd.Replace(COMMAND_CHARACTER_IMAGE, ""); name = name.Substring(name.IndexOf('"') + 1, name.LastIndexOf('"') - name.IndexOf('"') - 1); Image image = _charaImageList.Find(n => n.name == name); if (image == null){ image = Instantiate(Resources.Load<Image>(prefabsDirectory + CHARACTER_IMAGE_PREFAB), characterImages.transform); image.name = name; _charaImageList.Add(image); } SetImage(cmd, parameter, image); } /*パラメーターからベクトルを取得する*/ private Vector3 ParameterToVector3(string parameter){ string[] ps = parameter.Replace(" ", "").Split(','); return new Vector3(float.Parse(ps[0]), float.Parse(ps[1]), float.Parse(ps[2])); } //コマンドの呼び出し private void ReadCommand(string cmdLine){ cmdLine = cmdLine.Remove(0, 1); Queue<string> cmdQueue = SeparateString(cmdLine, SEPARATE_COMMAND); foreach (string cmd in cmdQueue){ string[] cmds = cmd.Split(COMMAND_SEPARATE_PARAM); if (cmds[0].Contains(COMMAND_BACKGROUND)) SetBackgroundImage(cmds[0], cmds[1]); if (cmds[0].Contains(COMMAND_CHARACTER_IMAGE)) SetCharacterImage(cmds[1], cmds[0], cmds[2]); } } //画像の設定 private void SetImage(string cmd, string parameter, Image image){ cmd = cmd.Replace(" ", ""); parameter = parameter.Substring(parameter.IndexOf('"') + 1, parameter.LastIndexOf('"') - parameter.IndexOf('"') - 1); switch (cmd){ case COMMAND_SPRITE: image.sprite = LoadSprite(parameter); break; case COMMAND_COLOR: image.color = ParameterToColor(parameter); break; case COMMAND_SIZE: image.GetComponent<RectTransform>().sizeDelta = ParameterToVector3(parameter); break; case COMMAND_POSITION: image.GetComponent<RectTransform>().anchoredPosition = ParameterToVector3(parameter); break; case COMMAND_ROTATION: image.GetComponent<RectTransform>().eulerAngles = ParameterToVector3(parameter); break; } } }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

C#

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

Unity

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

コードレビュー

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