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

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

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

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

Unity

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

Q&A

解決済

2回答

861閲覧

UnityでのNulllReferenceExpectionエラー

keita_kkk

総合スコア17

C#

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

Unity

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

0グッド

0クリップ

投稿2021/09/24 01:17

編集2021/09/24 01:54

前提・実現したいこと

ttps://tech.pjin.jp/blog/2015/09/06/unity%e3%81%a72d%e3%82%a2%e3%82%af%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%b2%e3%83%bc%e3%83%a0%e3%82%92%e4%bd%9c%e3%82%8d%e3%81%86%e2%91%a3-%ef%bd%9e/
を写しながら、Unityでゲームを作成しています。その際にエラーが発生しました。

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

NullReferenceException: Object reference not set to an instance of an object Player.Update () (at Assets/Script/Player.cs:40)

該当のソースコード(C#)

Player

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 public float flap = 600f; 8 public float scroll = 10f; 9 Rigidbody2D rigidbody2D; 10 GameObject gameController; 11 GameObject scoreGUI; 12 13 void Awake() 14 { 15 rigidbody2D = GetComponent<Rigidbody2D>(); 16 gameController = GameObject.Find("GameController"); 17 scoreGUI = GameObject.Find("ScoreGUI"); 18 } 19 20 void Start() 21 { 22 rigidbody2D.isKinematic = true; 23 } 24 25 void FixedUpdate() 26 { 27 if (GameController.isPlaying == true) 28 { 29 rigidbody2D.velocity = new Vector2(scroll, rigidbody2D.velocity.y); 30 } 31 } 32 33 void Update() 34 { 35 if (Input.GetKeyDown("space")) 36 { 37 38 if (GameController.isPlaying == false) 39 { 40 gameController.SendMessage("GameStart"); 41 rigidbody2D.isKinematic = false; 42 } 43 rigidbody2D.velocity = Vector2.zero; 44 rigidbody2D.AddForce(Vector2.up * flap, ForceMode2D.Impulse); 45 } 46 } 47 48 void Move() 49 { 50 if (GameController.isPlaying == true) 51 { 52 rigidbody2D.velocity = new Vector2(scroll, rigidbody2D.velocity.y); 53 } 54 } 55 56 void OnTriggerEnter2D(Collider2D col) 57 { 58 if (col.gameObject.tag == "CountZone") 59 { 60 scoreGUI.SendMessage("AddScore", 1); 61 } 62 } 63 64 void OnCollisionEnter2D(Collision2D col) 65 { 66 if (col.gameObject.tag == "Death") 67 { 68 gameController.SendMessage("GameOver"); 69 } 70 } 71}

GameController

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6using UnityEngine.SceneManagement; 7 8public class GameController : MonoBehaviour 9{ 10 11 private GameObject player; 12 private GameObject start; 13 private GameObject gameOver; 14 public static bool isPlaying; 15 16 void Awake() 17 { 18 player = GameObject.Find("Player"); 19 start = GameObject.Find("Start"); 20 gameOver = GameObject.Find("GameOver"); 21 } 22 23 void Start() 24 { 25 gameOver.SetActive(false); 26 isPlaying = false; 27 } 28 29 void Update() 30 { 31 if (Input.GetKeyDown("a")) 32 { 33 SceneManager.LoadScene("bird"); 34 } 35 } 36 37 public void GameStart() 38 { 39 start.SetActive(false); 40 isPlaying = true; 41 } 42 43 public void GameOver() 44 { 45 if (isPlaying == true) 46 { 47 gameOver.SetActive(true); 48 isPlaying = false; 49 player.GetComponent<Player>().enabled = false; 50 } 51 } 52}

試したこと

エラーの日本語訳を調べる
入力するキーを変えてみる

補足情報

Playerで、エラーではないのですが

Rigidbody2D rigidbody2D;

の部分で
「'Player.rigidbody2D'は継承されたメンバー'Conponent.rigidbody2D'を非表示にします。
非表示にする場合はキーワードnewを使用してください。」
と出ています。

また、GameControllerは'Start'と表示するテキストに入れています。

現在実行すると初期位置から落ちず、動きません。エラーはspaceキーを押したときに表示されます。

デバッグを行ったところ、次のようになりました。
イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/09/24 01:24

どの行で NulllReferenceExpection が出るのか質問に追記しましょう。 デバッガを使って何が null になっているのか調べましょう。デバッガが使えるのは質問者さんだけ。
keita_kkk

2021/09/24 01:54

了解しました! 追記しました。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2021/09/24 02:27 編集

追加で貼った画像を見ると、Update メソッドの中の gameController.SendMessage("GameStart"); の gameController が null ということのようですが、であれば Awake メソッドが Update メソッドより先に動いてないか gameController = GameObject.Find("GameController"); で取得できてないということが疑わしい・・・というように見当を付けて追いかけていくということはできませんか?
keita_kkk

2021/09/24 04:06

AwakeメソッドのgameController = ・・・の部分も追加して実行したところ、Awakeメソッドの方で止まり gameControllerとscoreGUIがnullとのことでした
guest

回答2

0

NulllReferenceExpectionエラーってほぼ答えがわかってるエラーなのでアタリをつけやすいです。
エラーが言う通り「参照先がNullです」ってことなので
Debug.Logとかで細かくチェック入れればすぐに原因が特定できますよ。

この場合、たぶんgameControllerなりがNullなんじゃないですかね?

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 public float flap = 600f; 8 public float scroll = 10f; 9 Rigidbody2D rigidbody2D; 10 GameObject gameController; 11 GameObject scoreGUI; 12 13 void Awake() 14 { 15 rigidbody2D = GetComponent<Rigidbody2D>(); 16 gameController = GameObject.Find("GameController"); 17 scoreGUI = GameObject.Find("ScoreGUI"); 18 19 // デバッグ用チェック 20 Debug.Log("Awake gameController" + gameController); 21 } 22 23 void Start() 24 { 25 rigidbody2D.isKinematic = true; 26 } 27 28 void FixedUpdate() 29 { 30 if (GameController.isPlaying == true) 31 { 32 rigidbody2D.velocity = new Vector2(scroll, rigidbody2D.velocity.y); 33 } 34 } 35 36 void Update() 37 { 38 if (Input.GetKeyDown("space")) 39 { 40 // デバッグ用チェック 41 Debug.Log("Update gameController" + gameController); 42 43 if (GameController.isPlaying == false) 44 { 45 gameController.SendMessage("GameStart"); 46 rigidbody2D.isKinematic = false; 47 } 48 rigidbody2D.velocity = Vector2.zero; 49 rigidbody2D.AddForce(Vector2.up * flap, ForceMode2D.Impulse); 50 } 51 } 52 53 void Move() 54 { 55 if (GameController.isPlaying == true) 56 { 57 rigidbody2D.velocity = new Vector2(scroll, rigidbody2D.velocity.y); 58 } 59 } 60 61 void OnTriggerEnter2D(Collider2D col) 62 { 63 if (col.gameObject.tag == "CountZone") 64 { 65 scoreGUI.SendMessage("AddScore", 1); 66 } 67 } 68 69 void OnCollisionEnter2D(Collision2D col) 70 { 71 if (col.gameObject.tag == "Death") 72 { 73 gameController.SendMessage("GameOver"); 74 } 75 } 76} 77

投稿2021/09/24 03:08

hogefugapiyo

総合スコア3302

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

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

keita_kkk

2021/09/24 04:21

ご指摘の通り、gameControllerがNullとなっていました。 この場合、どこを直せばNullではなくなるのでしょうか?
guest

0

ベストアンサー

gameControllerとscoreGUIがnullとのことでした

Awake()で以下を実行していますが

gameController = GameObject.Find("GameController"); scoreGUI = GameObject.Find("ScoreGUI");

Awake()が実行されるタイミングで、ヒエラルキーに"GameController GameObject"と"ScoreGUI`GameObject"は存在しますか。存在する場合それら2つのGameObjectはActiveになってますか。
この2点をクリアできていればエラーは解消されるはずです。

追記:

また、GameControllerは'Start'と表示するテキストに入れています。

GameControllerとScoreGUIはスクリプトの名称ということですかね。
そうであれば以下の手順で解決できます。

  1. ヒエラルキーでCreate Emptyで空のGameObjectを2つ生成する
  2. それぞれをGameControllerとScoreGUIという名称に変更する
  3. それぞれにスクリプトGameController、ScoreGUIをアタッチする

投稿2021/09/24 04:45

編集2021/09/24 04:51
YOshim

総合スコア1085

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

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

keita_kkk

2021/09/24 05:28

ありがとうごさいます!出来ました! スクリプトの場所が問題だったのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問