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

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

新規登録して質問してみよう
ただいま回答率
86.12%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

【Unity】実行ボタンを押すとフリーズしてしまう

intenseG
intenseG

総合スコア34

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

2回答

2リアクション

2クリップ

23785閲覧

投稿2017/03/31 06:19

###前提・実現したいこと
囲碁の詰碁問題(将棋でいうところの詰将棋)を出題するアプリを制作中なのですが、ある日、Unityで実行ボタンを押した途端メモリ使用率が97%以上に跳ね上がり、パソコンがフリーズしてしまいました。

そこで、グーグル大先生にお尋ねしてみたところ**「無限ループしてる」「処理が重い」**というのが原因の候補にあがってきたのですが、、

まず、無限ループしている箇所がないかを確認しましたが、ありませんでした。
となると「処理が重い」というのが原因だと思うのですが、どの箇所の処理が重いのかが全く検討もつかず途方に暮れています。

Unity画面

###発生している問題
実行するとメモリ使用率が97%以上に跳ね上がり、フリーズしてしまいます。

###ソースコード

C#

public class TsumegoManager : MonoBehaviour { int panelCountX = 0; //横の石数 int panelCountY = 0; //縦の石数 public GameObject stonePrefab; //石のひな型 public GameObject panelBasePosi; //生成した石を置く親オブジェクト List<StoneManager> stoneList; //生成した石のスクリプトリスト List<List<int>> correctArray; //正解配置格納リスト(複数) List<int> selectArray; //選択配置格納リスト(偶数黒 奇数白) int pushIndex = 0; //選択インデックス(偶数黒 奇数白) public Image correctImg; //正解画像 public Image wrongImg; //不正解画像 public Image blockImg; //画面タップ防止用画像 void Start() { //石のリストと配置リストを初期化 stoneList = new List<StoneManager>(); selectArray = new List<int>(); //配置する石数 panelCountX = 4; panelCountY = 8; //ステージの問題(左上からの石の並びを1次元配列で表現) string stageInfo = "0,0,0,0,2,2,2,2,2,1,1,0,2,1,0,0,2,0,1,0,0,2,1,0,0,2,1,0,0,2,2,2,0,0,0,0"; //カンマで分割 string[] stageArray = stageInfo.Split(','); //正解用配列を生成 correctArray = new List<List<int>>(); //解答手順をあるだけ生成して格納 List<int> correct1 = new List<int> { 104, 143, 130 }; correctArray.Add(correct1); //1パネルのサイズ float panelWid //元は60.0fth = 53; //一番左上のポジション float panelInitPosiX = 0.0f; float panelInitPosiY = 0.0f; panelInitPosiX = -1.0f * panelWidth * (panelCountX / 2.0f - 0.5f); panelInitPosiY = 1.0f * panelWidth * (panelCountY / 2.0f - 0.5f); Debug.Log(panelInitPosiX); Debug.Log(panelInitPosiY); //石の配置(左上から右上 一段下がって左からの順序) //縦 for (int i = 0; i < panelCountY; i++) { //横 for (int j = 0; j < panelCountX; j++) { //石を生成 GameObject obj = (GameObject)Instantiate(stonePrefab); //親オブジェクトを設定 obj.transform.parent = stonePrefab.transform; //拡大率を1に設定 obj.transform.localScale = Vector3.one; //ポジションを設定 obj.transform.localPosition = new Vector3(panelInitPosiX + panelWidth * j, panelInitPosiY - panelWidth * i, 0); //スクリプトを取得してリストに追加 StoneManager stoneManager = obj.GetComponent<StoneManager>(); stoneList.Add(stoneManager); //インデックスを算出 int index = i * panelCountX + j; //ボタンの名前をインデックスにする //ボタン押したときに使います。 stoneManager.komaBtn.gameObject.name = index.ToString(); //石の設定 if (int.Parse(stageArray[index]) == 0) { //石なし タップするボタンが活性 stoneManager.setKomaInfo("NONE"); } else if (int.Parse(stageArray[index]) == 1) { //白い石 ボタン非活性 stoneManager.setKomaInfo("WHITE"); } else if (int.Parse(stageArray[index]) == 2) { //黒い石 ボタン非活性 stoneManager.setKomaInfo("BLACK"); } } } //ブロック画像を非表示 blockImg.gameObject.SetActive(false); } //石のボタンを押下時処理 public void pushKoma(GameObject obj) { //タップしたインデックスを取得 int tapIndex = int.Parse(obj.name); //選択リストに追加(黒) selectArray.Add(tapIndex); //黒い石を配置 stoneList[tapIndex].setKomaInfo("BLACK"); //プッシュ回数を1プラス pushIndex += 1; //チェック処理 checkKoma(); } //チェック処理 void checkKoma() { //絞り込んだ新しい配列を生成 List<List<int>> nextArray = new List<List<int>>(); //複数回答分回す for (int i = 0; i < correctArray.Count; i++) { //リストを取得 List<int> array = correctArray[i]; //1手1手見ていく //1つでも違う手だったら除外 bool isOk = true; for (int j = 0; j < pushIndex; j++) { if (selectArray[j] != array[j]) { isOk = false; } } //今の手とすべて同じ場合 if (isOk) { //絞り込みのリストに追加 nextArray.Add(array); } } //絞り込みの件数によって分岐 if (nextArray.Count == 0) { //全部不正解 wrongImg.enabled = false; blockImg.gameObject.SetActive(true); } else { //クリア判定 //絞り込みが1件ですべてタップした場合 if (nextArray.Count == 1 && nextArray[0].Count == pushIndex) { //クリア correctImg.enabled = false; blockImg.gameObject.SetActive(true); } else { //残った配列からランダムに選ぶ int random = Random.Range(0, nextArray.Count); List<int> next = nextArray[random]; //選択配列に追加(白) selectArray.Add(next[pushIndex]); //白い石を設定 stoneList[next[pushIndex]].setKomaInfo("WHITE"); //プッシュ回数を1プラス pushIndex++; //絞り込み配列に入れ替える correctArray = nextArray; } } } //もう一度ボタン押下処理 public void pushOnce() { //正解or不正解画像を非アクティブにする correctImg.enabled = false; wrongImg.enabled = false; //画面を読み込みなおす SceneManager.LoadScene("Problem"); } }

C#

public class StoneManager : MonoBehaviour { public Image blackStoneImg; public Image whiteStoneImg; public Button komaBtn; void Start () { } //石の情報をセット public void setKomaInfo(string kbn) { if (kbn == "WHITE") { //白石の設定 whiteStoneImg.gameObject.SetActive(true); komaBtn.gameObject.SetActive(false); } else if (kbn == "BLACK") { //黒石の設定 blackStoneImg.gameObject.SetActive(true); komaBtn.gameObject.SetActive(false); } else if (kbn == "NONE") { //石なしの設定 whiteStoneImg.gameObject.SetActive(false); blackStoneImg.gameObject.SetActive(false); komaBtn.gameObject.SetActive(true); } } }

###試したこと
・時間をあけて実行、日を変えて実行
・2重ループのループ回数を減らす

###補足情報(言語/FW/ツール等のバージョンなど)
Unity歴:1ヶ月
開発ツール:Unity5.5.2f1 Personal(64bit)

【PCスペック】
OS:win7 64bit
CPU:Intel Corei7 3610QM 2.30GHz
RAM:8GB
グラフィックボード:Intel(R) HD Graphics 4000

Cotore, Satokingy👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。