前提・実現したいこと
unityでテトリスを作っています。
getcomponentをつかって他のスプリクトを呼び出そうとしたら
NullReferenceException: Object reference not set to an instance of an object
controller.addgrid () (at Assets/controller.cs:122)
controller.move () (at Assets/controller.cs:64)
controller.Update () (at Assets/controller.cs:31)
というエラーがゲームオーバーのテスト中に発生し、色々記事を調べてみましたが中々うまくいきません。
発生している問題・エラーメッセージ
NullReferenceException: Object reference not set to an instance of an object controller.addgrid () (at Assets/controller.cs:122) controller.move () (at Assets/controller.cs:64) controller.Update () (at Assets/controller.cs:31)
ソースコード
C#
1//スプリクト名 controller 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class controller : MonoBehaviour 7{ 8 public float falltimer = 1f; 9 public float timecounter; 10 public float waittimer; 11 public GameObject go; 12 13 14 15 public static int WIDTH = 10; 16 public static int HIGHT = 20; 17 18 private static Transform[,] grid = new Transform[WIDTH, HIGHT]; 19 20 public Vector3 rotationPoint; 21 // Start is called before the first frame update 22 void Start() 23 { 24 go = GameObject.Find("spawnb"); 25 } 26 27 // Update is called once per frame 28 void Update() 29 { 30 move(); 31 32 } 33 void move() 34 { 35 //ブロックの移動 36 if (Input.GetKey(KeyCode.A) && Time.time - waittimer >= 0.05) 37 { 38 transform.position += new Vector3(-1, 0, 0); 39 if (!movecontroll()) 40 { 41 transform.position -= new Vector3(-1, 0, 0); 42 } 43 waittimer = Time.time; 44 45 } 46 else if (Input.GetKey(KeyCode.D) && Time.time - waittimer >= 0.05) 47 { 48 transform.position += new Vector3(1, 0, 0); 49 if (!movecontroll()) 50 { 51 transform.position -= new Vector3(1, 0, 0); 52 } 53 waittimer = Time.time; 54 55 } 56 else if (Input.GetKey(KeyCode.S) || Time.time - timecounter >= falltimer) 57 { 58 transform.position += new Vector3(0, -1, 0); 59 60 if (!movecontroll()) 61 { 62 transform.position -= new Vector3(0, -1, 0); 63 addgrid(); 64 checkline(); 65 this.enabled = false; 66 FindObjectOfType<spawn>().spawnblock(); 67 68 } 69 timecounter = Time.time; 70 71 } 72 if (Input.GetKey(KeyCode.W) && Time.time - waittimer >= 0.1) 73 { 74 transform.RotateAround(transform.TransformPoint(rotationPoint), new Vector3(0, 0, 1), 90); 75 if (!movecontroll()) 76 { 77 transform.RotateAround(transform.TransformPoint(rotationPoint), new Vector3(0, 0, 1), -90); 78 } 79 waittimer = Time.time; 80 } 81 } 82 //ブロックの制御 83 bool movecontroll() 84 { 85 foreach (Transform children in transform) 86 { 87 int roundX = Mathf.RoundToInt(children.transform.position.x); 88 int roundY = Mathf.RoundToInt(children.transform.position.y); 89 90 if (roundX < 0 || roundX >= WIDTH || roundY < 0 || roundY >= HIGHT) 91 { 92 return false; 93 } 94 if (grid[roundX, roundY] != null) 95 { 96 return false; 97 } 98 99 } 100 return true; 101 } 102 103 //ブロックが重ならないようにする 104 void addgrid() 105 { 106 foreach (Transform children in transform) 107 { 108 109 int roundX = Mathf.RoundToInt(children.transform.position.x); 110 int roundY = Mathf.RoundToInt(children.transform.position.y); 111 112 grid[roundX, roundY] = children; 113 114 if(roundY>=HIGHT-1) 115 { 116 Destroy(go); 117 Debug.Log("gameover"); 118 GetComponent<gamecontroll>().gameover(); 119 this.enabled = false; 120 } 121 122 } 123 } 124 125 // ラインがあるか?確認 126 public void checkline() 127 { 128 for (int i = HIGHT - 1; i >= 0; i--) 129 { 130 if (HasLine(i)) 131 { 132 DeleteLine(i); 133 RowDown(i); 134 } 135 } 136 } 137 138 // 列がそろっているか?確認 139 bool HasLine(int i) 140 { 141 for (int j = 0; j < WIDTH; j++) 142 { 143 if (grid[j, i] == null) 144 return false; 145 } 146 return true; 147 } 148 149 // ラインを消す 150 void DeleteLine(int i) 151 { 152 for (int j = 0; j < WIDTH; j++) 153 { 154 Destroy(grid[j, i].gameObject); 155 grid[j, i] = null; 156 } 157 158 } 159 160 // 列を下げる 161 public void RowDown(int i) 162 { 163 for (int y = i; y < HIGHT; y++) 164 { 165 for (int j = 0; j < WIDTH; j++) 166 { 167 if (grid[j, y] != null) 168 { 169 grid[j, y - 1] = grid[j, y]; 170 grid[j, y] = null; 171 grid[j, y - 1].transform.position -= new Vector3(0, 1, 0); 172 } 173 } 174 } 175 } 176} 177
c#
1//スプリクト名 spawn 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class spawn : MonoBehaviour 7{ 8 public GameObject[] tetris; 9 // Start is called before the first frame update 10 void Start() 11 { 12 spawnblock(); 13 } 14 15 // Update is called once per frame 16 void Update() 17 { 18 19 } 20 21 public void spawnblock() 22 { 23 Instantiate(tetris[Random.Range(0, tetris.Length)], transform.position, Quaternion.identity); 24 } 25 26 27}
c#
1//スプリクト名 gamecontroll 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6 7public class gamecontroll : MonoBehaviour 8{ 9 // Start is called before the first frame update 10 void Start() 11 { 12 this.gameObject.SetActive(false); 13 } 14 15 // Update is called once per frame 16 void Update() 17 { 18 19 } 20 public void gameover() 21 { 22 this.gameObject.SetActive(true); 23 } 24}
補足情報
ゲームエンジンver 2019.4.14f1
以下のサイトを参考にして制作しました。
https://masavlog.com/tetris/unity-tetris-2/
https://www.youtube.com/watch?v=T5P8ohdxDjo
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。