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

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

新規登録して質問してみよう
ただいま回答率
85.50%
クラッシュ

クラッシュ(crash)はプログラムを完全に停止させてしまう修復不可能なエラー結果を指します。

Unity

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

Q&A

解決済

2回答

4129閲覧

[unity] 実行するとずっと読み込み状態が続く。。(問題箇所特定済み。原因不明)

doron

総合スコア152

クラッシュ

クラッシュ(crash)はプログラムを完全に停止させてしまう修復不可能なエラー結果を指します。

Unity

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

0グッド

0クリップ

投稿2016/01/01 07:39

編集2016/01/09 06:34

unityにて。。
地形の自動生成プログラムを作っているのですが、こいつ↓

C#

1using UnityEngine; 2using System.Collections; 3 4public class finT: MonoBehaviour { 5 6 //水とか草原とか地面プレハブ入れ 7 public GameObject[] objs; 8 //山とか城とかの構造物プレハブ入れ 9 public GameObject[] mns; 10 11 //高度map 12 int[,] hight=new int[8193,8193]; 13 //構造物生成時の空き地管理 14 bool[,] akiti=new bool[8193,8193]; 15 16 //構造物(mn)とその座標(vs) 17 ArrayList mn = new ArrayList(); 18 ArrayList vs = new ArrayList (); 19 20 //オブジェクト生成時の間隔 21 public float aida=0.5f; 22 23 // Use this for initialization 24 void Start () { 25 //四隅の高度を決めておく 26 hight [0, 0] = Random.Range (0, 100); 27 hight [8192, 0] = Random.Range (0, 100); 28 hight [0, 8192] = Random.Range (0, 100); 29 hight [8192, 8192] = Random.Range (0, 100); 30 31 //城が建つ中央の高度を固定 32 for (int y = 4095; y <= 4097; y++) { 33 for (int x = 4097; x <= 4097; x++) { 34 hight [x, y] = 70; 35 } 36 } 37 38//高度を求めるとこ 39 for (int i = 4096; i >= 1; i/=2) { 40 Debug.Log (i); 41 for (int y = 0; y <= 8192; y += i) { 42 for (int x = 0; x <= 8192; x += i) { 43 if(0==(y/i)%2){ 44 Debug.Log (""+(x-i)+","+y); 45 if (hight [x, y] == 0) { 46 47 hight [x, y] = (hight [x - i,y] + hight [x + i,y]) / 2+Random.Range(i*-4,i*4); 48 } 49 }else{ 50 if (0 == (x / i) % 2) { 51 if (hight [x, y] == 0) { 52 hight [x, y] = (hight [x, y - i] + hight [x, y + i]) / 2+Random.Range(i*-4,i*4); 53 } 54 } 55 56 } 57 58 } 59 } 60 for (int y = i; y <= 8192; y += i*2) { 61 for (int x = i; x <= 8192; x += i*2) { 62 if (hight [x, y] == 0) { 63 hight[x,y]=(hight[x - i,y] + hight [x + i,y]+hight [x, y - i] + hight [x, y + i])/4+Random.Range(i*-2,i*2); 64 } 65 } 66 } 67 } 68//高度マップを基に地面生成 69 for (byte y = 0; y <= 8192; y++) { 70 for (byte x = 0; x <= 8192; x++) { 71 GameObject obj=null; 72 //草村 73 if (hight [x, y] > 55) { 74 obj = objs [1]; 75 } 76 //砂浜 77 if (hight [x, y] < 50) { 78 obj = objs [0]; 79 } 80 //海 81 if (50<=hight [x, y] && hight [x, y] <= 55) { 82 obj = objs [2]; 83 } 84 Instantiate (obj, new Vector3 (x * aida - 2f, y * aida - 2f, 0), new Quaternion (0, 0, 0, 0)); 85 } 86 } 87//城と城の空き地確保。(城サイズは3×3) 88 mn.Add (mns [1]); 89 vs.Add (new Vector3 (4f * aida - 2f, 4f * aida - 2f, 0)); 90 for (int y = 4095; y <= 4097; y++) { 91 for (int x = 4095; x <= 4097; x++) { 92 akiti [x, y] = true; 93 } 94 } 95 //構造物を(mnに)まとめる 96 //ここで問題発生ーーーーーーーーーーー 97 for (int y = 0; y <= 8192; y++) { 98 for (int x = 0; x <= 8192; x++) { 99 //空き地が空いていたら 100 if (akiti [x, y] == false) { 101 if (hight [x, y] > 80) { 102 //山補完 103 mn.Add (mns [0]); 104 vs.Add (new Vector3 (x * aida - 2f, y * aida - 2f, 0)); 105 //ここもう空き地じゃないよ 106 akiti [x, y] = true; 107 } 108 } 109 } 110 } 111 //ーーーーーーーーーーーーーーーーーここまで 112 //構造物生成 113 for (int j=0;j!=mn.Count;j++) { 114 Instantiate ((GameObject)mn[j],(Vector3)vs[j],new Quaternion(0,0,0,0)); 115 } 116 } 117}

をunity上で実行しようとしてもずっと読み込み状態のままで止まってしまいます。無限ループでも作ってしまったのでしょうか(-▫︎-)
解決方法、正解コードでも書いていただくと嬉しい限りです。

分かっている事
*高度計算のとこで問題は発生していない模様
*構造物補完ルーチンのfor文に問題あり。

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

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

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

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

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

buibui80

2016/01/07 08:06

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答2

0

ベストアンサー

無限ループの可能性があると思っている時点で、
一気に実行せずにfor単位でテストして問題を切り分けするのが解決への一歩ですよ。

投稿2016/01/07 08:03

buibui80

総合スコア1033

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

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

doron

2016/01/08 06:34

やってみます。
doron

2016/01/08 06:36

問題箇所わかた。さんくす。
doron

2016/01/09 06:17

でも原因がわからん
buibui80

2016/01/09 07:02

単純に重いだけかもしれませんよ。 Start()内で全て行わずに複数フレームで分割処理するようにしたらどうでしょうか?
doron

2016/01/09 12:59

yieldか、、、
doron

2016/01/09 13:02

でも何故同等又はそれ以上の処理をしているであろう高度生成ルーチンでは問題なく動くのですか?arreylistのaddが遅いからでしょうか。。。
doron

2016/01/10 07:54

debug.logでわかたけど、80008000マップじゃ計算上一週間かかrわ。ボツ確定。
guest

0

参考になるかわかりませんが私が作っているマインクラフトライクゲームでは大量の地形構成要素を一度に生成するのではなくプレイヤーを中心に一定範囲のみ生成するようにしています。
空間をブロックので構成した場合、100100100の範囲を敷き詰めると100万ものgameobjectを生成することになり現実的ではありません。
そこでブロック一つ一つにgameobjectを割り当てるのではなく一定数のブロックを一つのgameobject(チャンク)でまとめ、必要な表面のメッシュのみを動的に生成することで現実的な速度で実行させることができます。
以下のサイトは非常に丁寧なチュートリアルがあります。
http://alexstv.com/index.php/posts/unity-voxel-block-tutorial

投稿2016/01/11 00:11

K.iijima

総合スコア103

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問