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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

解決済

2回答

1178閲覧

[Unity] MovePositionで発生したNullReferenceExceptionの回避方法について教えてください

yasuki27

総合スコア0

C#

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2020/06/12 14:58

こんにちは。
Unity初心者でちょっとプログラミングで詰まっていることもあり質問させていただきます。

前提・実現したいこと

Unityで自作ゲームを作っている者です。
一定方向に動く障害物を作ろうとしています。

ゲームオブジェクトに以下のコンポーネントを付けて、
・Sprite Renderer
・BoxCollider 2D
・Rigidbody 2D
・Obstacle (★後述)
・Block01 (★後述)
ゲームを開始しようとする「rb2Obstacle.MovePosition(direction * speed); 」(※)に対してNullReferenceExceptionが発生してしまいます。
※ 下記エラーの(at Assets/Scripts/Objects/Obstacle.cs:32)に該当

自力ではどこがNullになっているのか理解できなかったので、どなたかご教授下さい。

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

NullReferenceException: Object reference not set to an instance of an object Obstacle.MoveObstacle (UnityEngine.Vector2 direction) (at Assets/Scripts/Objects/Obstacle.cs:32) Block01.FixedUpdate () (at Assets/Scripts/Objects/Block01.cs:25)

Obstacle

C#

1public class Obstacle : MonoBehaviour 2{ 3 public float speed; 4 5 private Rigidbody2D rb2Obstacle; 6 7 private void Start() 8 { 9 rb2Obstacle = this.GetComponent<Rigidbody2D>(); 10 } 11 12 public void MoveObstacle(Vector2 direction) 13 { 14 rb2Obstacle.MovePosition(direction * speed); 15 } 16}

Block01

C#

1public class Block01 : MonoBehaviour 2{ 3 private Obstacle Obstacle; 4 private Rigidbody2D rb2; 5 6 7 void Start() 8 { 9 Obstacle = GetComponent<Obstacle>(); 10 rb2 = GetComponent<Rigidbody2D>(); 11 } 12 13 private void FixedUpdate() 14 { 15 Obstacle.MoveObstacle(rb2.position * -1); 16 } 17 18}

補足情報

使用しているUnityは Version2019.4.0f1 Personal です。

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

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

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

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

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

fiveHundred

2020/06/13 00:32

質問とは関係ないかもしれませんが、「private Obstacle Obstacle;」のようにクラス名と変数名を同じにするのはよくないですよ。
yasuki27

2020/06/13 17:16

指摘どうもです。
guest

回答2

0

自己解決

どうしても状況が変わらなかったので、質問分のObstacleスクリプトを以下のように書き換えて、
Obstacleスクリプトだけで動かすようにすると無事に想定した動作をさせることができました。
解答・調査にご協力して頂いた方々、ありがとうございました。

C#

1public class Obstacle : MonoBehaviour 2{ 3 //移動スピード 4 public float speed; 5 6 [SerializeField] private Rigidbody2D rb2Obstacle; 7 8 private void FixedUpdate() 9 { 10 //ローカル座標のX軸のマイナス方向に移動する 11 MoveObstacle(transform.position.x - (Time.deltaTime * speed)); 12 } 13 14 //移動処理 15 public void MoveObstacle(float direction) 16 { 17 rb2Obstacle.MovePosition(new Vector2(direction, transform.position.y)); 18 } 19} 20

投稿2020/06/15 12:00

yasuki27

総合スコア0

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

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

MMashiro

2020/06/15 12:25

既に上記で解決してるので蛇足かと思いますが、 もしかしたらFixedUpdateがStartの前に呼ばれてしまっているために起きている問題かもしれません。 Start()内の処理をAwake()内に変更することで修正されるかもしれません
guest

0

ご提示のコードと情報だけだと問題なく動作すると思われます。
(事実空プロジェクトで試してみましたが動作しました)

一つのオブジェクトに対して正しくすべてのコンポーネントがセットされているか再確認してみてください
(例えば他の変なオブジェクトにObstacleコンポーネントだけついてしまっていないかの確認等)

投稿2020/06/14 16:48

MMashiro

総合スコア2378

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

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

yasuki27

2020/06/15 11:55

解答と調査ありがとうございます。 もう一度確認してみましたが動作状況は変わりませんでした。
MMashiro

2020/06/15 11:57

新しくシーンを作成し、新しいGameObjectに必要なコンポーネント全て張り付けてみても エラーは出ますでしょうか?
yasuki27

2020/06/15 12:16

新しいシーンでやってみましたが状況は変わらなかったです。 ページ上部の回答に書いたのですが、スクリプトの書き方を変えるとやりたかった動作をさせることができました。 調査ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問