前提・実現したいこと
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)
などを追加しましたが、上手くいきませんでした。
回答2件
あなたの回答
tips
プレビュー