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

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

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

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

Unity

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

Q&A

解決済

1回答

160閲覧

Unity:周囲のオブジェクトの確認とカウントについて

N-Dot

総合スコア3

C#

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

Unity

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

0グッド

0クリップ

投稿2025/03/10 17:13

実現したいこと

_A_B_C_D_E
■ ■ [ ] ■ ■1
■ ■ [ ] ■ ■2
■ ■ ■ ■ ■3
■ ■ ■ ■ ■4
■ ■ ■ ■ ■5

例えば上記のようなマスの時は[ ]が隣接しているB1,B2,C3,D1,D2のみ破壊が可能でほかのブロックはまだ破棄できないというようなプログラムを書きたいです!

上下左右のいずれか一つでも破壊されていたら自身の破壊も可能にするプログラムということになります。
破壊が可能か否かはブール値を設定すれば良いのですが、それ自体を確認するロジックが書けません。。。

現在OnMouseDown()によって自身を破壊するプログラムを持たせたブロックオブジェクトを敷き詰めてあるのですが、自由な場所を破壊するのではなく道を作る(掘り進める)ように上下左右のいずれかが破壊されているときにはじめてOnMouseDow()による破棄を可能にしたいです。

周りのオブジェクトを判定、カウントするロジックはどれも当たり判定を検知するたびに呼び出されてしまうため周りのオブジェクトの有無の確認に落とし込むアイデアが浮かばず苦戦しています。

発生している問題・分からないこと

OnCollisionEnter2D()や、OnTriggerEnter(),Exit()などどれも接触を感知している限り呼び出されつづけるため、周囲のオブジェクトの個数をカウントしようにもカウントは増え続ける。。。
どなたかよい案がありましたら教えてください。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

コンパイルエラーは基本的に出ませんが満足いく結果は得られていません

補足

特になし

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

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

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

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

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

YAmaGNZ

2025/03/10 22:07

指定された場所(壊そうとした場所)の上下左右を確認すればいいのではないですか? マップ情報を2次元配列に持てば実現しやすいのではないでしょうか。
N-Dot

2025/03/11 15:29 編集

アドバイスありがとうございます! たしかにその方法で上下左右の確認はできそうですね!! 初心者の感覚的には配列に座標を持たせて随時更新させるというのは処理として重そうなのですが実際どうなのでしょうか? それと”破壊しようとしたブロック”という表現とても参考になりました!ありがとうございます!
YAmaGNZ

2025/03/11 22:14

実際の座標ではなく質問の例の場合ですと5X5のマップとなるので int map[5,5] といった形で配列としてその中身が0の場合は破壊後、1の場合は破壊可能ブロックといったように格納しておけばいいのではないかという感じです。 このマップ情報に変化があればその部分を描画更新(オブジェクトの変更等)すればいいのですからそこまでの負荷にはならないと思います。
guest

回答1

0

自己解決

今回はPhysics2D.Linecast( startPosition, endPosition, collisionLayer)を工夫して使うことで解決しました!
Linecastは startPosition - endPosition の座標に当たり判定を発生させることができます。
これにより、自身の上下左右に任意のレイヤー(collisionLayer)との当たり判定を出すことができます。

またちょっとしたことですが、今回は自身と同じTag、Layerをもっているオブジェクトが対象なので自身との当たり判定を防止する必要がありました。

ここでLinecastのstartPosition,endPositionをうまく設定することで自身から少し話した位置に当たり判定を発生させることができました。

下のコードではテストとして上下左右の判定のみコーディングしていますがこのコードのBool値を活用することでブロック破壊に条件を追加できるようになりそうです!

C#

1using UnityEngine; 2 3public class Test : MonoBehaviour 4{ 5 public LayerMask Layer; 6 7 void Update() 8 { 9 BlockChacker(); 10 } 11 12 public void BlockChacker() 13 { 14 Vector3 startU = transform.position + transform.up * 0.51f; 15 Vector3 startD = transform.position - transform.up * 0.51f; 16 Vector3 startL = transform.position - transform.right * 0.51f; 17 Vector3 startR = transform.position + transform.right * 0.51f; 18 19 Vector3 endU = transform.position + transform.up * 0.52f; 20 Vector3 endD = transform.position - transform.up * 0.52f; 21 Vector3 endL = transform.position - transform.right * 0.52f; 22 Vector3 endR = transform.position + transform.right * 0.52f; 23 24 Debug.DrawLine(startU, endU , Color.green); 25 Debug.DrawLine(startD, endD , Color.red); 26 Debug.DrawLine(startL, endL , Color.blue); 27 Debug.DrawLine(startR, endR , Color.yellow); 28 29 bool upHit = Physics2D.Linecast(startU, endU, Layer).collider != null; 30 bool downHit = Physics2D.Linecast(startD, endD, Layer).collider != null; 31 bool leftHit = Physics2D.Linecast(startL, endL, Layer).collider != null; 32 bool rightHit = Physics2D.Linecast(startR, endR, Layer).collider != null; 33 34 if(!upHit) Debug.Log("上のブロックがなくなった!!"); 35 if(!downHit) Debug.Log("下のブロックがなくなった!!"); 36 if(!leftHit) Debug.Log("左のブロックがなくなった!!"); 37 if(!rightHit) Debug.Log("右のブロックがなくなった!!"); 38 } 39}

投稿2025/03/11 15:42

N-Dot

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問