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

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

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

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

Q&A

解決済

2回答

248閲覧

C#の当たり判定の質問です!!!Unity:モンスターの動きの制御に関するバグ修正について

N-Dot

総合スコア3

C#

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

0グッド

0クリップ

投稿2025/03/06 10:22

実現したいこと

モンスターがブロックのない場所を移動するようにしたいです。

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

X垢のほうでバグ時の動画上げてます
現在OnCollisionメソッドを用いてステージレイヤーを持たせたブロックとの衝突を感知、Vector2によって移動方向を反転させています。また、左右移動中の予期せぬ上下との衝突を避けるためにモンスターの当たり判定の半径を少し小さくし、衝突時に位置調整も行っています。
左右のみ、上下のみでの衝突による反転は問題なかったのですが、左右の衝突によって上下に移動するようにコードを書き換えたところブロックにめり込んでしまい、モンスターがブロック上も移動してしまいます。

該当のソースコード

C#

1 //衝突時の処理 2 void OnCollisionEnter2D(Collision2D collision) 3 { 4 Debug.Log("Collision detected with: " + collision.gameObject.name); // デバッグログを追加 5 //ステージに衝突したら場合 6 if (collision.gameObject.layer == LayerMask.NameToLayer("Stage")) 7 { 8 ContactPoint2D contact = collision.contacts[0];//衝突した接触点の処理 9 Vector2 normal = contact.normal;//接触点の法線ベクトルを取得 10 11 if(currentDirection == Vector2.up || currentDirection == Vector2.down)//上下の衝突 12 { 13 if(normal.y < 0) adjust = -adjust; 14 else adjust = adjust; 15 currentDirection = new Vector2(0, 0);//上下の移動をやめる 16 transform.position = new Vector2(transform.position.x, transform.position.y + adjust); 17 currentDirection = (Random.value > 0.5f) ? Vector2.right : Vector2.left;//ランダムに左右を決定 18 } 19 else//左右の衝突 20 { 21 if(normal.x < 0) adjust = adjust; 22 else adjust = -adjust; 23 currentDirection = new Vector2(0, 0); 24 transform.position = new Vector2(transform.position.x + adjust, transform.position.y); 25 currentDirection = (Random.value > 0.5f) ? Vector2.up : Vector2.down;//ランダムに上下を決定` 26 } 27 28 // 方向を反転させる 29 if (currentDirection == Vector2.right) 30 { 31 currentDirection = Vector2.left; // 反対方向に変更 32 } 33 else if (currentDirection == Vector2.left) 34 { 35 currentDirection = Vector2.right; // 反対方向に変更 36 } 37 else if (currentDirection == Vector2.up) 38 { 39 currentDirection = Vector2.down; // 反対方向に変更 40 } 41 else if (currentDirection == Vector2.down) 42 { 43 currentDirection = Vector2.up; // 反対方向に変更 44 } 45 } 46 }

試したこと・調べたこと

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

おそらく、連続した一方向への移動が原因と考えています。
例えば、右方向への衝突後上下移動に変更、上下衝突により左右移動へ←ここで右方向へ変更されたときにめり込んでる?

補足

特になし

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

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

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

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

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

guest

回答2

0

ベストアンサー

モンスターがブロックにめり込んでしまう問題は、連続した移動方向の変更と不正確な位置調整が原因です。解決策として、移動方向の変更を遅らせ、衝突方向とめり込み量に応じた位置調整を行い、ランダムではなく衝突方向と反対方向に移動するように修正します。また、衝突判定の精度を高めるために、Rigidbody2DやCollider2Dの設定を見直すことも有効です。Read More

投稿2025/03/06 11:54

編集2025/03/07 06:20
randy854

総合スコア9

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

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

N-Dot

2025/03/06 13:55

回答ありがとうございます。 やはり位置調整に問題があったようです。 そもそもtransform.positionがVector3型でしたね。。。 とても参考になりました
guest

0

位置調整の方法とおそらくプログラム上のコード順序が原因でした。
具体的には、そもそもtransform.positionがVector3型なのでnew Vector2()による位置調整は間違っていたこと。
また、位置調整を衝突後の移動方向の変更の処理と同タイミングで行おうとしたことが良くなかったようです。

Vector2型からVector3型へ返還しました。加えて、取得した法線ベクトルを位置調整に利用することで余計な処理を減らしています。

これにより問題なく、モンスターが衝突を検知して移動するロジックをコーディングできました。
ありがとうございました!

C#

1 //衝突時の処理 2 void OnCollisionEnter2D(Collision2D collision) 3 { 4 Debug.Log("Collision detected with: " + collision.gameObject.name); // デバッグログを追加 5 //ステージに衝突したら場合 6 if (collision.gameObject.layer == LayerMask.NameToLayer("Stage")) 7 { 8 ContactPoint2D contact = collision.contacts[0];//衝突した接触点の処理 9 Vector2 normal = contact.normal;//接触点の法線ベクトルを取得 10 11 // 衝突の法線に基づいて位置を調整 12 Vector2 adjustment = normal * adjust; // 調整量を設定(0.1fは適宜調整) 13 transform.position += (Vector3)adjustment; // 位置を調整 14 15 // 上下の衝突 16 if (Mathf.Abs(normal.y) > Mathf.Abs(normal.x)) 17 { 18 currentDirection = new Vector2((Random.value > 0.5f) ? 1 : -1, 0); // ランダムに左右を決定 19 } 20 else // 左右の衝突 21 { 22 currentDirection = new Vector2(0, (Random.value > 0.5f) ? 1 : -1); // ランダムに上下を決定 23 } 24 25 } 26 }

投稿2025/03/06 14:04

編集2025/03/06 14:07
N-Dot

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問