//Update is called once per frame void Update() { // ボタンの読み込み objfloor = GameObject.Find("wall"); objsecond = GameObject.Find("2F"); /* * 部屋生成の処理 * ----------------------------------------------------------------- */ // 部屋削除ボタンが表示されているとき if (objfloor != null) { // 2階ボタンが非表示の時(1階ボタンが表示されている = 1階モード) if (objsecond == null) { // 松瀬 01/19 132行目から161行目まで追加 // 2階の地面を削除、1階の部屋の高い場所を表示する処理(一度2階モードに切り替えると入る) if (SecondGrandDel == true) { SecondGrandDel = false; // 判定をfalseにして入り続けないようにしている SecondStart = true; // 2階の処理に入るためにtrueにしている // 2階の地面があった場所を戻すため0と1を代入 for (int i = 0; i < field.GetLength(0); i++) { for (int j = 0; j < field.GetLength(1); j++) { if (field[i, j, 4] == 1) { field[i, j, 4] = 0; } else if (field[i, j, 4] == 2) { field[i, j, 4] = 1; } } } // 2階の地面を削除 foreach (GameObject GrandDel in SecondGrandDelTag) { Destroy(GrandDel); } // 一度非表示にした壁の高い場所を表示 foreach (GameObject WallTopActive in WallTopList) { WallTopActive.SetActive(true); } } //ボタンを押した処理 if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //スタートの座標を取得 if (Physics.Raycast(ray, out hit)) { startObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(startObjectName).transform.position; tmp1 = tmp; } } //ボタンを離した処理 if (Input.GetMouseButtonUp(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //エンドの座標を取得 if (Physics.Raycast(ray, out hit)) { endObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(endObjectName).transform.position; tmp2 = tmp; //重なったら上に出力させないようにする //括弧内の文字列が入っているとオブジェクト生成の処理に入らない if (startObjectName.Contains("masu") || endObjectName.Contains("masu")) { } else { if (tmp1.x >= tmp2.x || tmp1.y >= tmp2.y) { tmp3.x = tmp1.x - tmp2.x; tmp3.y = tmp1.y - tmp2.y; for (int s = 0; tmp3.y >= s; s++) { tmp.y = tmp1.y - s; for (int t = 0; tmp3.x >= t; t++) { tmp.x = tmp1.x - t; tmp.z = tmp1.z; //選択した座標を配列の要素番号に代入からのその上に床オブジェクトを配置 field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 1] = 1; //インデックスの値が1の時、cubeを生成 if (field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 1] == 1) { //Assetsからmasuを取得 GameObject wall = Instantiate(masu); //オブジェクト生成時に"masu番号"に名前変更 wall.name = "masu" + count; wall.transform.position = new Vector3(tmp.x, tmp.y, tmp.z + 1); count++; wall.tag = "1fRoom" + FirstfRoomCount; } } } for (int s = 0; tmp3.y >= s; s++) { tmp.y = tmp1.y - s; for (int t = 0; tmp3.x >= t; t++) { tmp.x = tmp1.x - t; tmp.z = tmp1.z; if (field[(int)tmp.x + 1, (int)tmp.y, (int)tmp.z + 1] == 0 || field[(int)tmp.x - 1, (int)tmp.y, (int)tmp.z + 1] == 0 || field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z + 1] == 0 || field[(int)tmp.x, (int)tmp.y - 1, (int)tmp.z + 1] == 0) { // 選択した座標を配列の要素番号に代入からのその上に壁オブジェクトを配置 field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 2] = 1; field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 3] = 1; field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 4] = 1; //インデックスの値が1の時、cubeを生成 for (int u = 2; u <= 4; u++) { if (field[(int)tmp.x, (int)tmp.y, (int)tmp.z + u] == 1) { //Assetsからmasuを取得 GameObject wall = Instantiate(masu); //オブジェクト生成時に"masu番号"に名前変更 wall.name = "masu" + count; wall.transform.position = new Vector3(tmp.x, tmp.y, tmp.z + u); count++; wall.tag = "1fRoom" + FirstfRoomCount; // 1番上の壁をListに格納 if (u == 4) { WallTopList.Add(wall); } } } } } } } } } FirstfRoomCount++; } } // 2階ボタンが表示されている = 2階モード else if (objsecond != null) { //ボタンを押した処理 if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //スタートの座標を取得 if (Physics.Raycast(ray, out hit)) { startObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(startObjectName).transform.position; tmp1 = tmp; } } //ボタンを離した処理 if (Input.GetMouseButtonUp(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //エンドの座標を取得 if (Physics.Raycast(ray, out hit)) { endObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(endObjectName).transform.position; tmp2 = tmp; //括弧内の文字列が入っているとオブジェクト生成の処理に入らない if (startObjectName.Contains("masu") || endObjectName.Contains("masu")) { } else { if (tmp1.x >= tmp2.x || tmp1.y >= tmp2.y) { tmp3.x = tmp1.x - tmp2.x; tmp3.y = tmp1.y - tmp2.y; for (int s = 0; tmp3.y >= s; s++) { tmp.y = tmp1.y - s; for (int t = 0; tmp3.x >= t; t++) { tmp.x = tmp1.x - t; tmp.z = tmp1.z; //選択した座標を配列の要素番号に代入からのその上に床オブジェクトを配置 field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 1] = 1; //インデックスの値が1の時、cubeを生成 if (field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 1] == 1) { //Assetsからmasuを取得 GameObject wall = Instantiate(masu); //オブジェクト生成時に"masu番号"に名前変更 wall.name = "masu" + count; wall.transform.position = new Vector3(tmp.x, tmp.y, tmp.z + 1); count++; wall.tag = "2fRoom" + SecondRoomCount; } } } for (int s = 0; tmp3.y >= s; s++) { tmp.y = tmp1.y - s; for (int t = 0; tmp3.x >= t; t++) { tmp.x = tmp1.x - t; tmp.z = tmp1.z; if (field[(int)tmp.x + 1, (int)tmp.y, (int)tmp.z + 1] == 0 || field[(int)tmp.x - 1, (int)tmp.y, (int)tmp.z + 1] == 0 || field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z + 1] == 0 || field[(int)tmp.x, (int)tmp.y - 1, (int)tmp.z + 1] == 0) { // 選択した座標を配列の要素番号に代入からのその上に壁オブジェクトを配置 field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 2] = 1; field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 3] = 1; field[(int)tmp.x, (int)tmp.y, (int)tmp.z + 4] = 1; //インデックスの値が1の時、cubeを生成 for (int u = 2; u <= 4; u++) { if (field[(int)tmp.x, (int)tmp.y, (int)tmp.z + u] == 1) { //Assetsからmasuを取得 GameObject wall = Instantiate(masu); //オブジェクト生成時に"masu番号"に名前変更 wall.name = "masu" + count; wall.transform.position = new Vector3(tmp.x, tmp.y, tmp.z + u); count++; wall.tag = "2fRoom" + SecondRoomCount; } } } } } } } } SecondRoomCount++; } } } /* * (部屋生成処理) * ----------------------------------------------------------------- */ /* * 部屋削除の処理 * ----------------------------------------------------------------- */ // 部屋削除ボタンが非表示のとき else { //ボタンを押した処理 if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //座標を取得 if (Physics.Raycast(ray, out hit)) { startObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(startObjectName).transform.position; } GameObject tagname = GameObject.Find(startObjectName); GameObject[] deletetag = GameObject.FindGameObjectsWithTag(tagname.tag); foreach (GameObject gameObj in deletetag) { ObjDelName = gameObj.name; DelTagPos = GameObject.Find(ObjDelName).transform.position; field[(int)DelTagPos.x, (int)DelTagPos.y, (int)DelTagPos.z] = 0; Destroy(gameObj); } } } /* * (部屋削除処理) * ----------------------------------------------------------------- */ //2Fボタンが表示されているとき if (objsecond != null) { /* * 2階の地面生成の処理 * ----------------------------------------------------------------- */ if (SecondStart == true) { SecondStart = false; // 判定をfalseにして入り続けないようにしている SecondGrandDel = true; // 1階の処理で1回目には入らなかった処理に入れる // 壁の高い場所のオブジェクトを非表示に foreach (GameObject HidObj in WallTopList) { HidObj.SetActive(false); } //1と2を代入 for (int i = 0; i < field.GetLength(0); i++) { for (int j = 0; j < field.GetLength(1); j++) { if (field[i, j, 4] == 1) { field[i, j, 4] = 2; } else if (field[i, j, 4] == 0) { field[i, j, 4] = 1; } } } //各インデックスに代入された値をもとに生成するorしない for (int i = 0; i < field.GetLength(0); i++) { for (int j = 0; j < field.GetLength(1); j++) { //インデックスの値が1の時、cubeを生成 if (field[i, j, 4] == 1) { GameObject wall = Instantiate(secondcube); // wallの名前の変更 countによって一つ一つに番号をふる wall.name = "secondcube" + count; wall.transform.position = new Vector3(i, j, 4); count++; }//インデックスの値が2の時、cubeを生成 else if (field[i, j, 4] == 2) { GameObject wall = Instantiate(blackcube); //wallの名前の変更 countによって一つ一つに番号をふる wall.name = "blackcube" + blackcubecount; wall.transform.position = new Vector3(i, j, 4); blackcubecount++; } } } // 配列に括弧内で指定したタグが付いているオブジェクトを格納 SecondGrandDelTag = GameObject.FindGameObjectsWithTag("SecondCubeTag"); } /* * (2階の地面生成処理) * ----------------------------------------------------------------- */ if (objsecond != null) { if (SecondStart == true) { SecondStart = false; { } } } } }
// Update is called once per frame void Update() { //ボタンの読み込み obj1F = GameObject.Find("1F"); obj2F = GameObject.Find("2F"); roomb = GameObject.Find("roomcreateOff"); deleteb = GameObject.Find("roomdelete"); //ボタン下のオブジェクトに反応させない if (EventSystem.current.IsPointerOverGameObject()) { return; } //1Fと2Fに切り替えを行う if (obj1F != null) { //部屋の出力、壁の出力、削除等を入力 if (SecondGrandDel == true)//2階の地面の削除、1階の高い部分を出力 { SecondGrandDel = false; SecondStart = true; // 2階の地面があった場所の配列の値を戻すため0と1を代入 for (int i = 0; i < field.GetLength(0); i++) { for (int j = 0; j < field.GetLength(2); j++) { if (field[i, 4, j] == 1) { field[i, 4, j] = 0; } if (field[i, 4, j] == 2) { field[i, 4, j] = 1; } } } // 2階の地面の削除 foreach (GameObject GrandDel in SecondGrandDelTag) { Destroy(GrandDel); } // 一度非表示にした壁の高い場所を表示 foreach (GameObject WallTopActive in WallTopList) { WallTopActive.SetActive(true); } } //1階の部屋生成 if (roomb != null) { //ボタンを押したとき if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //スタートの座標を取得 if (Physics.Raycast(ray, out hit)) { startObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(startObjectName).transform.position; tmp1 = tmp; } } //ボタンを離した処理 if (Input.GetMouseButtonUp(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //エンドの座標を取得 if (Physics.Raycast(ray, out hit)) { endObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(endObjectName).transform.position; tmp2 = tmp; // 括弧内の文字列が入っているとオブジェクト生成の処理に入らない if (startObjectName.Contains("masutile") || endObjectName.Contains("masuwall")) { } else { if (tmp1.x <= tmp2.x || tmp1.z >= tmp2.z) { tmp3.x = tmp2.x - tmp1.x; tmp3.z = tmp1.z - tmp2.z; for (int s = 0; tmp3.z >= s; s++) { tmp.z = tmp1.z - s; for (int t = 0; tmp3.x >= t; t++) { tmp.x = tmp1.x + t; tmp.y = tmp1.y; //選択した座標を配列の要素番号に代入からのその上に床オブジェクトを配置 field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z] = 1; //インデックスの値が1の時、cubeを生成 if (field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z] == 1) { //Assetsからmasuを取得 GameObject floor = Instantiate(masutile); //オブジェクト生成時に"masu番号"に名前変更 floor.name = "masutile" + count; floor.transform.position = new Vector3(tmp.x, tmp.y + 1, tmp.z); count++; floor.tag = "1fRoom" + FirstfRoomCount; } } } for (int s = 0; tmp3.z >= s; s++) { tmp.z = tmp1.z - s; for (int t = 0; tmp3.x >= t; t++) { tmp.x = tmp1.x + t; tmp.y = tmp1.y; if (field[(int)tmp.x + 1, (int)tmp.y + 1, (int)tmp.z] == 0 || field[(int)tmp.x - 1, (int)tmp.y + 1, (int)tmp.z] == 0 || field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z + 1] == 0 || field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z - 1] == 0) { // 選択した座標を配列の要素番号に代入からのその上に壁オブジェクトを配置 field[(int)tmp.x, (int)tmp.y + 2, (int)tmp.z] = 1; field[(int)tmp.x, (int)tmp.y + 3, (int)tmp.z] = 1; field[(int)tmp.x, (int)tmp.y + 4, (int)tmp.z] = 1; //インデックスの値が1の時、cubeを生成 for (int u = 2; u <= 4; u++) { if (field[(int)tmp.x, (int)tmp.y + u, (int)tmp.z] == 1) { //Assetsからmasuを取得 GameObject wall = Instantiate(masuwall); //オブジェクト生成時に"masu番号"に名前変更 wall.name = "masuwall" + count; wall.transform.position = new Vector3(tmp.x, tmp.y + u, tmp.z); count++; wall.tag = "1fRoom" + FirstfRoomCount; // 1番上の壁をListに格納 if (u == 4) { WallTopList.Add(wall); } } } } } } } } } FirstfRoomCount++; } } //削除する if (deleteb != null) { //ボタンを押した処理 if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //座標を取得 if (Physics.Raycast(ray, out hit)) { startObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(startObjectName).transform.position; } GameObject tagname = GameObject.Find(startObjectName); GameObject[] deletetag = GameObject.FindGameObjectsWithTag(tagname.tag); foreach (GameObject gameObj in deletetag) { ObjDelName = gameObj.name; DelTagPos = GameObject.Find(ObjDelName).transform.position; field[(int)DelTagPos.x, (int)DelTagPos.y, (int)DelTagPos.z] = 0; Destroy(gameObj); } } } } else if (obj2F != null) { //2F地盤の出力、部屋の出力、壁の出力、削除等を入力 /* * 2階の地面生成の処理 * ----------------------------------------------------------------- */ if (SecondStart == true) { SecondStart = false; SecondGrandDel = true; // 1階の処理で1回目に入らなかった処理に入れる //ArrayList = WallTopList.ToArray(); foreach (GameObject delObj in WallTopList.ToArray()) { if (delObj == null) { WallTopList.Remove(delObj); } } foreach (GameObject delObjTes in WallTopList) { delObjTes.SetActive(false); } //1と0を代入 for (int i = 0; i < field.GetLength(0); i++) { for (int j = 0; j < field.GetLength(2); j++) { if (field[i, 4, j] == 1) { field[i, 4, j] = 2; } else if (field[i, 4, j] == 0) { field[i, 4, j] = 1; } } } //各インデックスに代入された値をもとに生成するorしない for (int i = 0; i < field.GetLength(0); i++) { for (int j = 0; j < field.GetLength(2); j++) { //インデックスの値が1の時、cubeを生成 if (field[i, 4, j] == 1) { GameObject wall = Instantiate(secondgrand); // wallの名前の変更 countによって一つ一つに番号をふる wall.name = "secondgrand" + count; wall.transform.position = new Vector3(i, 4, j); count++; }//インデックスの値が2の時、cubeを生成 else if (field[i, 4, j] == 2) { GameObject wall = Instantiate(blackcube); //wallの名前の変更 countによって一つ一つに番号をふる wall.name = "blackcube" + blackcubecount; wall.transform.position = new Vector3(i, 4, j); blackcubecount++; } } } // 配列に括弧内で指定したタグが付いているオブジェクトを格納 SecondGrandDelTag = GameObject.FindGameObjectsWithTag("2fgrand"); } /* * (2階の地面生成処理) * ----------------------------------------------------------------- */ //2階の部屋生成 if (roomb != null) { //ボタンを押したとき if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //スタートの座標を取得 if (Physics.Raycast(ray, out hit)) { startObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(startObjectName).transform.position; tmp1 = tmp; } } //ボタンを離した処理 if (Input.GetMouseButtonUp(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //エンドの座標を取得 if (Physics.Raycast(ray, out hit)) { endObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(endObjectName).transform.position; tmp2 = tmp; // 括弧内の文字列が入っているとオブジェクト生成の処理に入らない if (startObjectName.Contains("masutile") || endObjectName.Contains("masuwall")) { } else { if (tmp1.x <= tmp2.x || tmp1.z >= tmp2.z) { tmp3.x = tmp2.x - tmp1.x; tmp3.z = tmp1.z - tmp2.z; for (int s = 0; tmp3.z >= s; s++) { tmp.z = tmp1.z - s; for (int t = 0; tmp3.x >= t; t++) { tmp.x = tmp1.x + t; tmp.y = tmp1.y; //選択した座標を配列の要素番号に代入からのその上に床オブジェクトを配置 field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z] = 1; //インデックスの値が1の時、cubeを生成 if (field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z] == 1) { //Assetsからmasuを取得 GameObject floor = Instantiate(masutile); //オブジェクト生成時に"masu番号"に名前変更 floor.name = "masutile" + count; floor.transform.position = new Vector3(tmp.x, tmp.y + 1, tmp.z); count++; floor.tag = "2fRoom" + SecondRoomCount; } } } for (int s = 0; tmp3.z >= s; s++) { tmp.z = tmp1.z - s; for (int t = 0; tmp3.x >= t; t++) { tmp.x = tmp1.x + t; tmp.y = tmp1.y; if (field[(int)tmp.x + 1, (int)tmp.y + 1, (int)tmp.z] == 0 || field[(int)tmp.x - 1, (int)tmp.y + 1, (int)tmp.z] == 0 || field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z + 1] == 0 || field[(int)tmp.x, (int)tmp.y + 1, (int)tmp.z - 1] == 0) { // 選択した座標を配列の要素番号に代入からのその上に壁オブジェクトを配置 field[(int)tmp.x, (int)tmp.y + 2, (int)tmp.z] = 1; field[(int)tmp.x, (int)tmp.y + 3, (int)tmp.z] = 1; field[(int)tmp.x, (int)tmp.y + 4, (int)tmp.z] = 1; //インデックスの値が1の時、cubeを生成 for (int u = 2; u <= 4; u++) { if (field[(int)tmp.x, (int)tmp.y + u, (int)tmp.z] == 1) { //Assetsからmasuを取得 GameObject wall = Instantiate(masuwall); //オブジェクト生成時に"masu番号"に名前変更 wall.name = "masuwall" + count; wall.transform.position = new Vector3(tmp.x, tmp.y + u, tmp.z); count++; wall.tag = "2fRoom" + SecondRoomCount; // 1番上の壁をListに格納 if (u == 4) { WallTopList.Add(wall); } } } } } } } } } SecondRoomCount++; } } //削除する if (deleteb != null) { //ボタンを押した処理 if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //座標を取得 if (Physics.Raycast(ray, out hit)) { startObjectName = hit.collider.gameObject.name; tmp = GameObject.Find(startObjectName).transform.position; } GameObject tagname = GameObject.Find(startObjectName); GameObject[] deletetag = GameObject.FindGameObjectsWithTag(tagname.tag); foreach (GameObject gameObj in deletetag) { ObjDelName = gameObj.name; DelTagPos = GameObject.Find(ObjDelName).transform.position; field[(int)DelTagPos.x, (int)DelTagPos.y, (int)DelTagPos.z] = 0; Destroy(gameObj); } } } } }