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

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

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

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

Unity

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

Q&A

6回答

61374閲覧

エラーメッセージの意味が分かりません

Unity52149279

総合スコア6

C#

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

Unity

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

0グッド

1クリップ

投稿2018/08/10 18:35

NullReferenceException: Object reference not set to an instance of an object
myscript.Update () (at Assets/myscript.cs:33

実際のコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class myscript : MonoBehaviour
{
GameObject[] cubes = new GameObject[4];
GameObject[] gos = new GameObject[4];

// Use this for initialization void Start() { for(int i = 0;i < 4; i++) { cubes[i] = GameObject.Find("Cube" + i); gos[i] = GameObject.Find("GameObject" + i); } } // Update is called once per frame void Update() { Rigidbody rigidbody = GetComponent<Rigidbody>(); foreach(GameObject obj in cubes){ obj.transform.Rotate(new Vector3(1f, 1f, 1f)); } Vector3 v = transform.position; v.y += 2; v.z -= 7; Camera.main.transform.position = v;   ←この部分がダメ見たいです if (Input.GetKey(KeyCode.LeftArrow)) { rigidbody.AddForce(new Vector3(-1f, 0f, 0f)); } if (Input.GetKey(KeyCode.RightArrow)) { rigidbody.AddForce(new Vector3(1f, 0f, 0f)); } if (Input.GetKey(KeyCode.UpArrow)) { rigidbody.AddForce(new Vector3(0f, 0f, 1f)); } if (Input.GetKey(KeyCode.DownArrow)) { rigidbody.AddForce(new Vector3(0f, 0, -1f)); } } private void OnTriggerEnter(Collider collider) { if (collider.gameObject.name.StartsWith("Cube")) { for(int i = 0; i < 4; i++) { if(cubes[i] == collider.gameObject) { ParticleSystem ps = gos[i].GetComponent<ParticleSystem>(); ps.Play(); cubes[i].SetActive(false); } } } }

}

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

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

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

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

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

guest

回答6

0

####エラーメッセージの意味について

NullReferenceException: Object reference not set to an instance of an object myscript.Update () (at Assets/myscript.cs:33

myscript.Update ()メソッドの33行目でNullReferenceExceptionという例外が発生しているということです。

この回答で分からない単語があれば、1個1個以下のワードから検索してみてください。

  • メソッド
  • NullReferenceException
  • Null
  • 例外(Exception)
  • 参照(Reference)

####実際の問題点

Camera.main.transform.position = v;   ←この部分がダメ見たいです

ここがmyscript.csの33行目を指しているからだと推測します。

この中で、CameramaintransformpositionvがNullだということかもしれません。

ただ、
vVector3 v = transform.position;で通っており、
Camera.main.transform.positionpositionはまだmyscript.cs内のどこにも使われていないため、Nullでも問題ないと思います。

なので、残った
CameramaintransformのどれかがNullであることが原因です。
確認してみてください。

また、何かわからないことがあれば質問してください。

投稿2018/08/11 09:18

編集2018/08/11 12:08
BluOxy

総合スコア2663

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

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

Bongo

2018/08/11 11:06

BluOxyさんのアドバイスに加えまして、怪しい点が絞り込めましたら、やはり本家リファレンスも参照してみるのがいいかと思います。 Camera.main - Unity スクリプトリファレンス(https://docs.unity3d.com/jp/current/ScriptReference/Camera-main.html)によれば... Camera.main public static Camera main ; 説明 "MainCamera" にタグ付けされている最初の有効なカメラ(読み取り専用)。 The primary Camera in the scene. Returns null if there is no such camera in the scene. This property uses FindGameObjectsWithTag internally and doesn't cache the result. It is advised to cache the return value of Camera.main if it is used multiple times per frame. ...との記述があります。タグを「MainCamera」に設定されたカメラがシーン内に存在しているかどうかはご確認済みでしょうか?
guest

0

Cameraって何だよ!」って言っていますね。
CameraというGameObjectを探しているのならば、こうすることで大丈夫だと思います。

C#

1//省略 2GameObject camera; 3void Start() 4{ 5for(int i = 0;i < 4; i++) 6 { 7 cubes[i] = GameObject.Find("Cube" + i); 8 gos[i] = GameObject.Find("GameObject" + i); 9 } 10camera = GameObject.Find("Camera"); 11} 12//v.z…まで省略 13Camera.transform.position = v;

省略しすぎて、すみません。

投稿2023/04/02 11:05

Looki

総合スコア13

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

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

0

結論として、以下のコードで実行可能です。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class myscript : MonoBehaviour 6{ 7 GameObject[] cubes = new GameObject[4]; 8 GameObject[] gos = new GameObject[4]; 9 10 Camera _camera;//カメラ 11 Rigidbody _rigidbody;//Rigidbody 12 13 // Use this for initialization 14 void Start() 15 { 16 _camera = Camera.main; //キャッシュすれば書き込み可能 17 18 _rigidbody = GetComponent<Rigidbody>();// キャッシュする 19 20 for(int i = 0;i < 4; i++) 21 { 22 cubes[i] = GameObject.Find("Cube" + i); 23 gos[i] = GameObject.Find("GameObject" + i); 24 } 25 } 26 27 // Update is called once per frame 28 void Update() 29 { 30 //Rigidbody rigidbody = GetComponent<Rigidbody>(); これは負荷が高くなるのでStart()内でキャッシュする。 31 foreach(GameObject obj in cubes){ 32 obj.transform.Rotate(new Vector3(1f, 1f, 1f)); 33 } 34 35 Vector3 v = transform.position; 36 v.y += 2; 37 v.z -= 7; 38 // Camera.main.transform.position = v; こうではなく... 39 40 _camera.transform.position = v;//こうすればカメラが移動する。 41 42 //以下、割愛 43 } 44 45}

公式リファレンスには、

"MainCamera" にタグ付けされている最初の有効なカメラ(読み取り専用)。

と書いてあります。
NullReferenceExceptionが起きたのは、Camera.mainが読み取り専用だったためです。
そのためCamera.main.transform.positionを変更しようとするとこのエラーが出ます。
読み取り専用の変数は、一度別の変数に代入することで操作できるようになるので、覚えておくと良いですよ。

また、ついでですが、GetComponentをUpdate内でいちいちしてると重くなるので、クラス変数を用意して、Start内でGetComponentすると良いですよ。

投稿2021/05/01 08:10

task58

総合スコア24

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

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

0

よくわからないエラーが出たときは、
エラーメッセージをコピーしてgoogle検索。
「NullReferenceException: Object reference not set to an instance of an object」
このとき、そのソース特有の文言は省いた方がいいです。(myscript.Update ()とか)
それでたいてい解決します。

投稿2018/08/11 02:49

lightwill

総合スコア962

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

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

0

nullに対して何かをやろうとした時に出る例外です。

投稿2018/08/11 02:47

mitsu-wan

総合スコア139

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

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

0

Null Reference Exception
エラーメッセージの意味を知りたいという質問ですね?
ここを見てください。

投稿2018/08/10 22:49

Zuishin

総合スコア28669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問