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

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

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

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

Q&A

1回答

680閲覧

Unityで円形Collider同士の当たり判定が複数発生する場合

po_tato

総合スコア97

Unity

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

0グッド

0クリップ

投稿2018/03/20 08:14

編集2022/01/12 10:55

Unity2D横スクロールのアプリを制作しているのですが、キャラクターの進行方向にコインを散りばめ、
取得するとその数が増えていくというありきたりなものをテストとして作ってみたのですが、
スコアの数がおかしいことになります。
一つのコインが10ポイントとすると、それが20ポイントとなったりすることがあります。
ちなみに、プレイヤーのコライダーの設定は上部がboxColliderで下部がCircleColliderで作成しており、コインを上部にしかヒットしない位置に配置すると、正常に加算されますが、下部のCircleColliderにもヒットする位置に配置すると加算される点数が倍になったりします。
全部、上部に当たる位置に設定すればいいかなとも思いましたが、キャラクターのジャンプアクションなどによって、
キャラクターの脚あたりにヒットする場合もあるので、これは解決するべきだと思いました。

これはどのように解決するべきでしょうか?
何か知っている方がいらっしゃいましたら、ご教示して頂きたいです。

コインはprefabで、
設定しているタグ名は"Coin"です。

今回はプレイヤーの進行方向に3枚のコインを並べて実験しています。

プレイヤーのスクリプトは以下です。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerManager : MonoBehaviour { //プレイヤー制御用Rigidbody2D private Rigidbody2D rbody; //移動速度固定値 private const float MOVE_SPEED = 3.0f; //移動速度 private float moveSpeed; private bool onTrigger = false; //コインのポイント数 private const int COIN_POINT = 10; private int sum = 0; // Use this for initialization void Start() { rbody = GetComponent<Rigidbody2D>(); } // Update is called once per frame void Update() { } void FixedUpdate() { moveSpeed = MOVE_SPEED; rbody.velocity = new Vector2(moveSpeed, rbody.velocity.y); } void OnTriggerEnter2D(Collider2D col) { if (col.gameObject.tag == "Coin") { sum += COIN_POINT; Debug.Log("ポイントは" + sum); } } }

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

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

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

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

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

guest

回答1

0

boxColliderにぶつかった時とCircleColliderにぶつかった時、両方で当たり判定が発生しているのが原因です。

正しく動作するかは怪しいですが、とりあえず、
OnTriggerEnter2Dのif文の中にcol.enable = false;という文を追加してみてください。
(コインの当たり判定を無効化することで次の当たり判定を発生させなくします。ただし2つのColliderに同フレーム時に当たっていると多分無意味)


■上記は正常に動作しないようなので別案
こちらも未検証ですがComposite Collider 2Dを使用すると上手くいくかもしれません。
(CircleColliderは対象外らしいのでPolygonColliderを代わりに使うといいと思います)

参考:【Unity】複数のColliderを結合するComposite Collider 2Dを使って少し遊ぶ - テラシュールブログ

投稿2018/03/22 01:32

編集2018/03/26 04:28
sakura_hana

総合スコア11425

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

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

po_tato

2018/03/23 03:08

返答ありがとうございます!遅れてすみません。 sum+=の上の行に追加してみました、 そうすると追加前は合計値が60とログに表示されてましたが、追加後は50と表示されます。実行してコイン取得したときにインスペクターのコライダーを確認してみても、チェックマークが外れていないのが疑問でした。
sakura_hana

2018/03/26 04:01

遅くなってすみません。 この場合の理想とする数値が幾つなのか分からないので(減っているなら正しいと見ていいのか)何とも言えませんが…… この処理だとオフになるColliderはコイン側です。プレイヤー側のColliderに変化は無いです。
po_tato

2018/03/26 04:06

説明不足ですみません。 プレイヤーの進行方向にコインを3枚並べて検証しています。 この場合理想とする合計値は30なのですが、初期段階では60、 アドバイス通りに実行すると50になったということです。 なぜ50になるのか疑問です。 そうなのですね!コイン側をチェックしていませんでした、、
sakura_hana

2018/03/26 04:28

とすると最初の方法は「成功したりしなかったりする」と考えるべきですね。 別案を回答に追記しました。(CompositeColliderを使う場合、col.enable = false;の追記は恐らく不要かと)
po_tato

2018/03/26 07:13

Composite Collider 2Dを使用するという案ですが、コインを取得する際、変更前ではキャラ上部に設置しているboxコライダーの"is Trigger"にチェックを入れ、コインをすり抜けながら取得していました。下部のCircleコライダーには地面をすり抜けないように"is Trigger"にチェックを入れない設定だったのですが、これは親に設定したConpositColliderに"is Trigger"が一つしかないため、チェックを入れるとキャラが地面をすり抜け、チェックを外すとコインとごっつんこする気がするのですが、、
sakura_hana

2018/03/26 07:28

とするとそもそも前提条件がおかしいですね。 OnTriggerEnter2Dは"is Trigger"でチェックを入れているオブジェクトのみ発動する為、チェックを入れていないCircleColliderでは発生しないはずです。 CompositeColliderを一旦外して元の状態にした後、 コインをCircleColliderにだけぶつかる(BoxColliderにはぶつからない)位置にするとどうなりますか? (ちなみに、すり抜けた後のコインはその場に残り続けるという認識で合っていますか?)
po_tato

2018/03/26 08:52

すみません、コイン側の"isTrigger"にチェックが入っていたのでプレイヤー側のコライダーは問答無用ですり抜けていました。ちなみに、コインはすり抜けると同時にDestroyしています。CircleColliderにだけ当たると30となります。
po_tato

2018/03/29 05:51

やり方としては理解できるのですが、poligonColliderだと下の地面との接地面がでこぼこになってしまったりしてオブジェクトに引っかかったりするのですが、滑らかにする方法などご存知でしたらご教示して頂けると幸いでございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問