🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

1回答

2767閲覧

Unityで囲み判定をするにはどうしたらよいのでしょうか?

melonplus

総合スコア14

C#

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

0グッド

0クリップ

投稿2019/09/17 08:34

Unity2DでSplix.ioというゲームのようなものを作りたいと考えています。
Splix.io
四角形状の陣地から自分を上下左右に移動させて、移動したところに線を引き、自分の陣地に帰ったら囲んだ部分が自分の陣地となるようなゲームです。
そこで、UIのImageをPrefab化してスクリプトで等間隔に設置しています。
そのインスタンスの名前には、生成された順番が振り当てられています。
また四角形と四角形の隙間などを指定しています。
イメージ説明

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class GamePlay : MonoBehaviour { 7 8 public GameObject boxPrefab; 9 public Vector2Int boxMax; 10 public Vector2Int boxSize; 11 public Vector2Int boxSpace; 12 private Vector2Int posBase; 13 public Vector2Int panelSize; 14 private Color clearColor = new Color(0.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f); 15 private Color whiteColor = new Color(255.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f); 16 private Color redColor = new Color(255.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f, 255.0f / 255.0f); 17 private Color blueColor = new Color(0.0f / 255.0f, 0.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f); 18 19 // Use this for initialization 20 void Start () { 21 Blockset(); 22 } 23 24 // Update is called once per frame 25 void Update () { 26 27 } 28 29 public void Blockset () 30 { 31 var parent = this.transform; //子オブジェクトとして生成するため 32 posBase.x = (panelSize.x - ((boxSize.x + boxSpace.x) * (boxMax.x - 1))) / 2; 33 posBase.y = (panelSize.y - ((boxSize.y + boxSpace.y) * (boxMax.y - 1))) / 2; 34 Debug.Log(posBase); 35 for (int y = 0; y < boxMax.y; y++) 36 { 37 for (int x = 0; x < boxMax.x; x++) 38 { 39 int xPos = posBase.x + ((boxSpace.x + boxSize.x) * x); 40 int yPos = posBase.y + ((boxSpace.y + boxSize.y) * y); 41 int boxNumber = x + boxMax.x * y; 42 boxPrefab.name = boxNumber.ToString(); 43 boxPrefab.GetComponent<Image>().color = whiteColor; 44 //(撮影のため)boxPrefab.GetComponentInChildren<Text>().text = boxNumber.ToString(); 45 boxPrefab.transform.localScale = new Vector3(boxSize.x, boxSize.y, 1); 46 GameObject newBoxPrefab = (GameObject)Instantiate(boxPrefab, new Vector3(xPos, yPos, 0.0f), Quaternion.identity, parent); 47 newBoxPrefab.name = boxPrefab.name; 48 } 49 } 50 } 51} 52

ここまでは良いのですが、引いた線によって囲まれた範囲のImageの色を変更するという囲み判定の仕方が分かりません。
線は、LineRendererなどを使ったらなんとかできると思っています。線に沿ってMeshを作成してしようとも考えたのですが、難しそうなので断念しました。また、もっと良い方法等があれば教えてほしいです。Unity初心者で、丸投げな感じがしますが申し訳ありません。

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

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

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

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

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

stdio

2019/09/17 09:10

すみません、少しルールを整理すると、 ・プレイヤーの移動は上下左右(斜めは不可) ・移動したら、そこのマスは色が変わる。 ・マスを囲めば、そこの範囲の色も自分のものになる。 ・他のプレイヤーのラインが、自分が引いているラインと接触するとゲームオーバー。 ということでよろしいでしょうか? 私はそのゲームを制作したことはありませんが似たようなゲームは制作した経験があるので、お力になれれば幸いです。
melonplus

2019/09/17 09:22

そのような感じです。説明不足で申し訳ありません????
guest

回答1

0

ベストアンサー

まず、すべてのマスを表す2次元配列を用意します
これには、2つの情報を入れます
・誰の色か
・陣地か線か

プレイヤーが一旦外に出て、自分の色の陣地に戻れば、自分の線はすべて陣地になります
また、囲まれてない場所以外も陣地になります

囲まれてない場所、とは、画面外に隣接した場所で自分の陣地の色でない場所は囲まれていません
また、囲まれてないと判定された場所と隣接している場所も囲まれていません

このようにすべてのマスを判定して、残ったマスが囲まれている場所です

投稿2019/09/18 04:25

izmktr

総合スコア2856

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

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

Zuishin

2019/09/18 04:40

補足です。 探索済みかそうでないかの情報も必要ですね。 地図が大きいと探索に時間がかかるので、一歩動くたびに判定するのではなく、自分の陣地または線にぶつかった時に非同期で判定する必要がありそうです。 また、判定中に更に判定が必要になった時のために、判定を中断できるようにしなくてはなりません。 陣地決定後、エフェクト実行のため、どこが新しい陣地か抽出する必要もありそうです。セットを活用すれば効率的かもしれません。
izmktr

2019/09/18 04:49

囲み判定は自分の陣地に戻ったときのみで、自分の線で判定しては駄目でしょう やり方としては、確実に囲まれている場所を起点に検索するほうが効率的ですが、 8の字形状を考えてこの方法を提案しています 一歩動くたびに、というのは線を作らず自分の陣地の移動だけで判定、という意味でしょうか? 非同期判定、というのもどう考えても同期的に処理しないとまずい案件なのに、意味がわかりません
Zuishin

2019/09/18 04:55

同期的に処理すると、そこで止まるからです。リンク先のものは非同期で処理されているようです。 線は失敗なので、これは判定の必要はありませんね。
Zuishin

2019/09/18 04:58

一歩動くたびにというのは、自分の位置が変わるたび、つまり新しい線がうまれるたびにという意味です。 このたびに判定する必要はないという意味のことを質問者に向けて書きました。
izmktr

2019/09/18 05:16

ようなもの、であってそのものではないのでは? いたずらに口を挟んでも混乱するだけなので、新規に解答作ったほうがいいと思いますよ
Zuishin

2019/09/18 05:20

コードを書きましたが、同様のアルゴリズムの回答がついたので、破棄して高評価しました。今は評価を保留に戻しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問