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

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

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

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

Unity

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

Q&A

解決済

2回答

2700閲覧

Unity スクリプト間でデータの受け渡しをしたい

keita_kkk

総合スコア17

C#

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

Unity

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

0グッド

0クリップ

投稿2021/09/26 09:37

編集2021/09/26 09:54

前提・実現したいこと

https://tech.pjin.jp/blog/2015/07/02/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%a0-%ef%bd%9e/と同じようなゲームを作ろうとしています。
スペースキーを押しSTARTの文字が消えると同時に床も動かせるようにしたいです。
(STARTの文字を消すのは出来ていますが、床を動かすのは出来ていません)
そのためにFloorMoveにゲームがスタートしているかの情報を受け渡したいのですが、上手くいきません。

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

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

該当のソースコード

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 14 void Awake() 15 { 16 rigidbody2D = GetComponent<Rigidbody2D>(); 17 gameController = GameObject.Find("GameController"); 18 scoreGUI = GameObject.Find("ScoreGUI"); 19 } 20 21 void Start() 22 { 23 rigidbody2D.isKinematic = true; 24 } 25 26 void Update() 27 { 28 if (Input.GetKeyDown("space")) 29 { 30 if (GameController.isPlaying == false) 31 { 32 gameController.SendMessage("GameStart"); 33 rigidbody2D.isKinematic = false; 34 } 35 rigidbody2D.velocity = Vector2.zero; 36 rigidbody2D.AddForce(Vector2.up * flap, ForceMode2D.Impulse); 37 } 38 } 39 40 void OnTriggerEnter2D(Collider2D col) 41 { 42 if (col.gameObject.tag == "CountZone") 43 { 44 scoreGUI.SendMessage("AddScore", 1); 45 } 46 } 47 48 void OnCollisionEnter2D(Collision2D col) 49 { 50 if (col.gameObject.tag == "Death") 51 { 52 gameController.SendMessage("GameOver"); 53 } 54 } 55}

GameController

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class GameController : MonoBehaviour 8{ 9 private GameObject player; 10 private GameObject start; 11 private GameObject gameOver; 12 public static bool isPlaying; 13 public float scroll = 0.15f; 14 Renderer cRenderer; 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 public void GameStart() 30 { 31 start.SetActive(false); 32 isPlaying = true; 33 } 34 35 public void GameOver() 36 { 37 if (isPlaying == true) 38 { 39 gameOver.SetActive(true); 40 isPlaying = false; 41 player.GetComponent<Player>().enabled = false; 42 } 43 } 44} 45

FloorMove

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5 6public class FloorMove : MonoBehaviour 7{ 8 public GameObject Plane; 9 GameObject[] step = new GameObject[10]; 10 float speed = 20; 11 float disappear = -60; 12 float respawn = 140; 13 14 GameObject gameController; 15 16 void Start() 17 { 18//ここのgamaControllerがnull 19 gameController = GameObject.Find("GameController"); 20 21 22 if (GameController.isPlaying == true) 23 { 24 for (int i = 0; i < step.Length; i++) 25 { 26 step[i] = Instantiate(Plane, new Vector3(20 * i, -50, 0), Quaternion.identity); 27 } 28 } 29 } 30 31 void Update() 32 { 33 for (int i = 0; i < step.Length; i++) 34 { 35//Consoleのエラーメッセージを押すとこの行に飛びます。しかし、デバッグしたところnullはありませんでした。 36 step[i].gameObject.transform.position -= new Vector3(speed * Time.deltaTime, 0, 0); 37 if (step[i].gameObject.transform.position.x < disappear) 38 { 39 step[i].gameObject.transform.position = new Vector3(respawn, -50, 0); 40 } 41 } 42 } 43} 44

補足情報

isPlaying の情報をFloorMoveに持って行けたら良いと思い、
FloorMoveにif (GameController.isPlaying == true)
などを追加しましたが、上手くいきませんでした。

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

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

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

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

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

bboydaisuke

2021/09/26 09:41

Console でエラーをダブルクリックするとエラーが起きた行にジャンプします。そこに書かれているクラス型の変数のうちどれかが null だ、というのがエラーの意味です。 わからなかったら、コピペしてあるコードに「エラーはここで起きています」と明示してください。
keita_kkk

2021/09/26 09:50

FloorMoveの gameController = GameObject.Find("GameController"); にブレークポイントをおいてデバッグしたところ gameControllerがnullとのことでした
YAmaGNZ

2021/09/26 10:00

ブレークポイントを設定して止まった状態はその行を「まだ実行していない状態」で停止します。 なので、 gameController = GameObject.Find("GameController"); この行で止まった状態で値を確認してもgameControllerにはまだ代入されていません。
keita_kkk

2021/09/26 11:08

なるほど。知識不足でした。教えていただきありがとうごさいます!
guest

回答2

0

GameController.isPlaying == true などを追加しましたが、上手くいきませんでした。

以下の記述で他オブジェクトのスクリプトを取得できます。

スクリプト名 変数名 = GameObject.Find(ゲームオブジェクト名).GetComponent<スクリプト名>();

GameControllerオブジェクトにアタッチされているGameControllerスクリプトのbool isPlayingを他のGameObjectで使用する場合、具体的には以下のような記述となります。

GameController sc = GameObject.Find("GameController").GetComponent<GameController>(); bool _isPlaying = sc.isPlaying; //一行で書くなら以下 bool _isPlaying = GameObject.Find("GameController").GetComponent<GameController>().isPlaying; //PlayerスクリプトではgameController = GameObject.Find("GameController");の記述があるので以下でもOK bool _isPlaying = gameController.GetComponent<GameController>().isPlaying;

ちなみにbool _isPlaying_isPlayingは変数名なのでなんでもよいです。

追記:
回答を見てなんでそれで上手くいくのか理解できず調べましたが、
GameControllerというスクリプトはオブジェクトにアタッチせずプロジェクト内で共有できる特別なものなんですね、初めて知りました。

投稿2021/09/26 10:34

編集2021/09/26 12:52
YOshim

総合スコア1085

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

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

keita_kkk

2021/09/26 13:35

そうなんですね!私も偶然出来たので良く理解していませんでした。 教えていただきありがとうごさいます!
guest

0

自己解決

FloorMove

1void Start()の中 2if (GameController.isPlaying == false) 3void Update()の中 4if (GameController.isPlaying == true)

としたら出来ました!

回答してくださった皆さん、ありがとうございました。

投稿2021/09/26 11:30

keita_kkk

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問