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

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

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

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

Q&A

解決済

1回答

505閲覧

Unityが止まります。どこを直せば良いですか?

oozorapilot

総合スコア1

Unity

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

0グッド

0クリップ

投稿2021/05/29 12:50

前提・実現したいこと

このサイトを参考に、「壁のばし法の何もない点から壁を延ばし既存の壁につなぐやり方」をUnityの3Dゲームで迷路を作ろうとしました。しかし、以下のコードをアタッチし、動かした(「Play」ボタンを押した)ところ、何も変化が無いのでタスクマネージャーで確認すると、応答なしとなっていました。エラーコードも現時点で出てきてないので、初心者の私には何が間違っているのか全く分かりません。どこをどのように直せば壁のばし法が出来ますか?教えていただければとても嬉しいです。

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

何も無し

該当のソースコード

まだまだ学習したばかりなので見にくい部分があったらごめんなさい。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Linq; 5using System; 6 7public class MazeMaker : MonoBehaviour 8{ 9 public int Width, Height; 10 public GameObject wallPrefab; 11 private int[] Spornlist; //要素が、0…何も無い、1…今作っている壁がある、2…固定された壁がある 12 List<GameObject> MakingWall = new List<GameObject>(); 13 int checker, NESTchecker, ListD, Looker = 0; 14 bool[] nestcheck = { false, false, false, false }; 15 16 // Use this for initialization 17 void Start () 18 { 19 Width += 2; 20 Height += 2; 21 22 SpornListDirector(0); 23 Debug.Log("初期化完了"); 24 25 int A, B; 26 for (A = SpornListDirector(2), B = SpornListDirector(3); A != -1 || B != -1;) 27 { 28 //始める場所をランダムに決める 29 for (checker = SpornListDirector(4); checker != 0; checker = SpornListDirector(4)) { } 30 31 //決まったスタート場所に移動する 32 A = Width + 1; 33 int position2 = checker % A; //計算の明記 34 transform.position = new Vector3(position2 * 2, transform.position.y, Mathf.FloorToInt(checker / Width) * 2); 35 ListD = 1; 36 Looker = checker; 37 SpornListDirector(5); 38 MakeWall(); 39 } 40 } 41 42 // Update is called once per frame 43 void Update () 44 { 45 46 } 47 48 void MakeWall() 49 { 50 // 2マス先の壁をランダムに見る 51 NESTchecker = UnityEngine.Random.Range(0, 4); 52 //その結果をspornlistで確認出来るようにする 53 if (NESTchecker == 0) 54 { 55 Looker -= Width; 56 } 57 else if (NESTchecker == 1) 58 { 59 Looker++; 60 } 61 else if (NESTchecker == 2) 62 { 63 Looker += Width; 64 } 65 else if (NESTchecker == 3) 66 { 67 Looker--; 68 } 69 // 既に決定した壁だったら 70 int listchecker = SpornListDirector(1); 71 if (listchecker == 2) 72 { 73 WallMaker(); 74 75 WallDecide(2); 76 MakingWall.Clear(); 77 nestcheck[0] = false; 78 nestcheck[1] = false; 79 nestcheck[2] = false; 80 nestcheck[3] = false; 81 } 82 // 今作っている壁があったら 83 else if (listchecker == 1) 84 { 85 nestcheck[NESTchecker] = true; 86 if (nestcheck.Contains(false)) // いずれかの方向に壁が作れる場合 87 { 88 MakeWall(); 89 } 90 // どこにも壁が作れるスペースが無かった場合 91 { 92 // 今まで作った壁とそれらのデータを消す 93 checker = 0; 94 for (int counts = MakingWall.Count; checker <= counts; checker++) 95 { 96 Destroy(MakingWall[checker]); 97 } 98 MakingWall.Clear(); 99 WallDecide(0); 100 nestcheck[0] = false; 101 nestcheck[1] = false; 102 nestcheck[2] = false; 103 nestcheck[3] = false; 104 } 105 } 106 //何も無かったら壁を伸ばす 107 { 108 WallMaker(); 109 nestcheck[0] = false; 110 nestcheck[1] = false; 111 nestcheck[2] = false; 112 nestcheck[3] = false; 113 MakeWall(); 114 } 115 } 116 117 void WallMaker() 118 { 119 //壁を作る 120 for (int i = 0; i < 2; i++) 121 { 122 int keyX = 0, keyZ = 0; 123 if (NESTchecker == 0) 124 { 125 keyZ = 1; 126 } 127 else if (NESTchecker == 1) 128 { 129 keyX = 1; 130 } 131 else if (NESTchecker == 2) 132 { 133 keyZ = -1; 134 } 135 else if (NESTchecker == 3) 136 { 137 keyX = -1; 138 } 139 transform.Translate(keyX, 0, keyZ); 140 GameObject go = Instantiate(this.wallPrefab) as GameObject; 141 go.gameObject.transform.position = this.transform.position; 142 MakingWall.Add(go); 143 } 144 SpornListDirector(5); 145 } 146 147 void WallDecide(int a) 148 { 149 ListD = a; 150 // 「今作っている壁がある」とされているところを全て変える 151 for (int num = Array.IndexOf(Spornlist, 1); num != -1; num = Array.IndexOf(Spornlist, 1)) // 「今作っている壁がある」とされているインデックス番号を取得 152 { 153 Looker = num; 154 SpornListDirector(5); 155 } 156 } 157 158 int SpornListDirector(int Controller) 159 { 160 if (Controller == 0) 161 { 162 Spornlist = new int[Width * Height]; 163 //スポーンリストの初期化 164 for (checker = 0; checker < Spornlist.Length; checker++) 165 { 166 if (checker <= 13 || checker % 13 == 0 || checker % 13 == 12 || checker >= 132) //hierarchy上に壁がある所のみ変える 167 { 168 Spornlist[checker] = 2; 169 } 170 else 171 { 172 Spornlist[checker] = 0; 173 } 174 } 175 Controller = 0; 176 } 177 178 if (Controller == 1) //指定要素を取得 179 { 180 Controller = Spornlist[Looker]; 181 } 182 183 if (Controller == 2) //「0」になっている要素を検索 184 { 185 Controller = Array.IndexOf(Spornlist, 0); 186 } 187 if (Controller == 3) //「1」になっている要素を検索 188 { 189 Controller = Array.IndexOf(Spornlist, 1); 190 } 191 192 if (Controller == 4) //スタート地点を決める 193 { 194 Controller = UnityEngine.Random.Range(14, 132); 195 } 196 197 if (Controller == 5) //指定要素を変える 198 { 199 Spornlist[Looker] = ListD; 200 } 201 return Controller; 202 } 203} 204

試したこと

このスクリプトが正しくアタッチできるか、PrefabのGameObjectも問題無いかなど確認したが、何も問題は無かった。

補足情報(FW/ツールのバージョンなど)

  • Unity 2020.3.0f1 Personal
  • Visual Studio 2019

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

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

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

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

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

guest

回答1

0

ベストアンサー

c#

1 //始める場所をランダムに決める 2 for (checker = SpornListDirector(4); checker != 0; checker = SpornListDirector(4)) { }

この箇所でcheckerが0になることがないので無限ループしていると思われます。

投稿2021/05/29 14:10

yuuyu

総合スコア1139

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

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

oozorapilot

2021/05/31 12:49

```c# //始める場所をランダムに決める for (checker = SpornListDirector(4); checker != 0; checker = SpornListDirector(4)) { } ``` の所を ```c# //始める場所をランダムに決める do { Looker = SpornListDirector(4); checker = SpornListDirector(1); } while (checker != 0); ``` としたら、エラーコードが出ないままフリーズする現象は無くなりました。yuuyuさんのアドバイス通りに無限ループが起きてしまっていました。分かりやすいアドバイスありがとうございます!この問題は解決できたのですが、他の部分でエラーコードが出てきたので何とか解決して、迷路の自動生成が完成出来るように頑張りたいと思います。今回はありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問