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

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

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

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

Android

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

Unity

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

Q&A

解決済

3回答

1537閲覧

特定条件下においてプレハブを非アクティブにする方法が分からない

intenseG

総合スコア34

C#

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

Android

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

Unity

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

0グッド

0クリップ

投稿2017/04/17 14:44

編集2017/04/18 08:31

###前提・実現したいこと

(29ffc6857fa59ad87813cc510eeb7a94.png)

上の画像は、右から2つ目、上から4つ目の位置の黒石オブジェクトをアクティブにした状態なのですが、このときに右上の繋がっている白石3つを非アクティブにしたいのですがうまくいきません。

参考URL:http://usapyon.game.coocan.jp/katsunari/howto_kihon.html

まず、TsumegoManagerクラスでプレハブを169個生成し、個々の要素に対して石の状態を設定しています。

StoneManagerクラスのsetStoneメソッドでは、石の状態とタップしたインデックスを引数で受け取り、そのインデックスに既に石が置かれてなければ仮で石を置いて相手の石を取れるかどうか判定し、石を取れるならそのインデックスをListに格納してpushStoneメソッドに返す、といった処理にしています。(長くてすみません)

デバッグログを出力してみたところ、prisonerAll(非アクティブにするオブジェクト数)は0でした。

###TsumegoManager.cs

//石のボタン押下時処理 public void pushStone(GameObject obj) { int tapIndex = int.Parse(obj.name); prisonerArray = stoneList[tapIndex].setStone(BLACK, tapIndex); foreach(int prisoner in prisonerArray) { if(prisoner < 0) break; stoneList[prisoner].setStone(NONE, prisoner); } }

###StoneManager.cs

public List<int> setStone(int state, int tapIndex) { int x, y; /* indexをxとyに分解 */ if (state == WHITE) { if (CheckLegal(WHITE, x, y)) { board[x, y] = WHITE; checkPrisoner(WHITE, x, y); /* 碁石オブジェクトをアクティブ化 */ return rtnTapIndex; } else { board[x, y] = WHITE; /* 碁石オブジェクトをアクティブ化 */ } } else if (state == BLACK) { if (CheckLegal(BLACK, x, y)) { board[x, y] = BLACK; checkPrisoner(BLACK, x, y); /* 碁石オブジェクトをアクティブ化 */ return rtnTapIndex; } else { board[x, y] = BLACK; /* 碁石オブジェクトをアクティブ化 */ } } else if (state == NONE) { board[x, y] = NONE; /* 碁石オブジェクトを非アクティブ化 */ } if (rtnTapIndex.Count == 0) { rtnTapIndex.Add(-1); } return rtnTapIndex; } public bool CheckLegal(int color, int x, int y) { if (board[x, y] != NONE) { return false; } if (move > 1) { if (ko_x == x && ko_y == y && ko_num == (move - 1)) { return false; } } if (CheckSuicide(color, x, y) == true) { return false; } return true; } public bool CheckSuicide(int color, int x, int y) { bool rtnVal; int opponent; //相手の色 board[x, y] = color; ClearCheckBoard(); rtnVal = DoCheckRemoveStone(color, x, y); if (rtnVal == true) { opponent = reverseColor(color); if (x > 1) { if (board[y, x - 1] == opponent) { ClearCheckBoard(); rtnVal = DoCheckRemoveStone(opponent, x - 1, y); if (rtnVal == true) { board[x, y] = NONE; return false; } } } if (y > 1) { if (board[y - 1, x] == opponent) { ClearCheckBoard(); rtnVal = DoCheckRemoveStone(opponent, x, y - 1); if (rtnVal == true) { board[x, y] = NONE; return false; } } } if (x < (BOARD_SIZE - 2)) { if (board[y, x + 1] == opponent) { ClearCheckBoard(); rtnVal = DoCheckRemoveStone(opponent, x + 1, y); if (rtnVal == true) { board[x, y] = NONE; return false; } } } if (y < (BOARD_SIZE - 2)) { if (board[y + 1, x] == opponent) { ClearCheckBoard(); rtnVal = DoCheckRemoveStone(opponent, x, y + 1); if (rtnVal == true) { board[x, y] = NONE; return false; } } } board[x, y] = NONE; return true; } else { board[x, y] = NONE; return false; } } public bool DoCheckRemoveStone(int color, int x, int y) { bool rtn; if (checkBoard[x, y] == true) { return true; } checkBoard[x, y] = true; if (board[x, y] == NONE) { return false; } if (board[x, y] == color) { if (x > 1) { rtn = DoCheckRemoveStone(color, x - 1, y); if (rtn == false) { return false; } } if (y > 1) { rtn = DoCheckRemoveStone(color, x, y - 1); if (rtn == false) { return false; } } if (x < (BOARD_SIZE - 2)) { rtn = DoCheckRemoveStone(color, x + 1, y); if (rtn == false) { return false; } } if (y < (BOARD_SIZE - 2)) { rtn = DoCheckRemoveStone(color, x, y + 1); if (rtn == false) { return false; } } } return true; } public int RemoveStone(int color, int x, int y) { int prisoner; if (board[x, y] == color) { return 0; } if (board[x, y] == NONE) { return 0; } ClearCheckBoard(); if (DoCheckRemoveStone(board[x, y], x, y)) { prisoner = DoRemoveStone(board[x, y], x, y, 0); return prisoner; } return 0; } public int DoRemoveStone(int color, int x, int y, int prisoner) { if (board[x, y] == color) { prisoner++; board[x, y] = NONE; if (x > 1) { rtnTapIndex.Add((x - 1) * (BOARD_SIZE - 2) + y); prisoner = DoRemoveStone(color, x - 1, y, prisoner); } if (y > 1) { rtnTapIndex.Add(x * (BOARD_SIZE - 2) + (y - 1)); prisoner = DoRemoveStone(color, x, y - 1, prisoner); } if (x < (BOARD_SIZE - 2)) { rtnTapIndex.Add((x + 1) * (BOARD_SIZE - 2) + y); prisoner = DoRemoveStone(color, x + 1, y, prisoner); } if (y < (BOARD_SIZE - 2)) { rtnTapIndex.Add(x * (BOARD_SIZE - 2) + (y + 1)); prisoner = DoRemoveStone(color, x, y + 1, prisoner); } } return prisoner; } public void checkPrisoner(int color, int x, int y) { int prisonerN; int prisonerE; int prisonerS; int prisonerW; int prisonerAll; bool koFlag; board[x, y] = color; /* 置いた石の隣に同じ色の石はあるか? */ if (board[y + 1, x] != color && board[y - 1, x] != color && board[y, x + 1] != color && board[y, x - 1] != color) { koFlag = true; } else { koFlag = false; } prisonerN = prisonerE = prisonerS = prisonerW = 0; /* 置いた石の周囲の相手の石が死んでいれば碁盤から取り除く */ if (y > 1) { prisonerN = RemoveStone(color, x, y - 1); } if (x > 1) { prisonerW = RemoveStone(color, x - 1, y); } if (y < (BOARD_SIZE - 2)) { prisonerS = RemoveStone(color, x, y + 1); } if (x < (BOARD_SIZE - 2)) { prisonerE = RemoveStone(color, x + 1, y); } prisonerAll = prisonerN + prisonerE + prisonerS + prisonerW; /* 置いた石の隣に同じ色の石がなく、取り除かれた石も1つならば劫 */ if (koFlag == true && prisonerAll == 1) { /* 劫の発生した手数を覚える */ ko_num = move; /* 劫の座標を覚える */ if (prisonerE == 1) { ko_x = x + 1; ko_y = y; } else if (prisonerS == 1) { ko_x = x; ko_y = y + 1; } else if (prisonerW == 1) { ko_x = x - 1; ko_y = y; } else if (prisonerN == 1) { ko_x = x; ko_y = y - 1; } } }

###補足情報
開発ツール:Unity 5.5.2f1

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

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

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

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

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

Clor

2017/04/18 00:07

>下記URLを参考にやってみたのですがうまくいかず。。  どう動かないのか どう動かしたいのか 具体的に記載をお願いします。
guest

回答3

0

ベストアンサー

動かしたわけじゃないので違うかもしれないんですが、DoRemoveStoneの以下の部分

public int DoRemoveStone(int color, int x, int y, int prisoner) { if (board[x, y] == color) { prisoner++; board[x, y] = NONE; if (x > 1) { rtnTapIndex.Add((x - 1) * (BOARD_SIZE - 2) + y); prisoner = DoRemoveStone(color, x - 1, y, prisoner); } if (y > 1) { rtnTapIndex.Add(x * (BOARD_SIZE - 2) + (y - 1)); prisoner = DoRemoveStone(color, x, y - 1, prisoner); } if (x < (BOARD_SIZE - 2)) { rtnTapIndex.Add((x + 1) * (BOARD_SIZE - 2) + y); prisoner = DoRemoveStone(color, x + 1, y, prisoner); } if (y < (BOARD_SIZE - 2)) { rtnTapIndex.Add(x * (BOARD_SIZE - 2) + (y + 1)); prisoner = DoRemoveStone(color, x, y + 1, prisoner); } } return prisoner; }

これだとprisonerが常に上書きされ、結果的に最後の if 文内だけの結果になってしまっていませんか

prisoner += DoRemoveStone(color, x - 1, y, prisoner);

こんな感じで prisoner の合計を返したいというのが本来の意図ではないでしょうか

投稿2017/04/20 03:03

kanitaoru

総合スコア204

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

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

0

回答して頂いた皆さんありがとうございます。

ヒエラルキーのTsumegoManagerオブジェクトにスクリプトをアタッチしていたのですが、NextButtonという他のオブジェクトにもアタッチしていました。。。

2つのオブジェクトからスクリプトの呼び出しを2回行っていたのが原因だったようです。

アタッチを解除したところ想定通りに動きました!

ベストアンサーは、曖昧な質問になったにも関わらず回答して頂いたkanitaoruさんに贈りたいと思います。
お騒がせしました><;

投稿2017/04/20 12:59

intenseG

総合スコア34

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

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

0

投稿2017/04/18 00:54

HiroshiWatanabe

総合スコア2160

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問