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

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

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

3回答

4112閲覧

複数の当たり判定を取りたい OnCollisionEnterを使いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2019/10/18 12:18

編集2019/10/23 01:24

プレイヤーの子に空のゲームオブジェクトを作ってそこに当たり判定を足元に入れて地面判定を行いそれをプレイヤーに伝えるという処理を作りたいのですが子の空のゲームオブジェクトにbox colliderを入れてRigidbodyも入れる必要があると思いますがその子のRigidbodyとプレイヤーの親の
Rigidbodyはどう設定すればいいのでしょうか? 

やりたいことはジャンプして落下するときの地面判定や高い場所かから落ちた時の落下するかどうかなどに使いたいです。
※Rigidbodyを入れないとOnCollisionEnterが発生しないので。

つまり自分は複数のコリジョンの当たり判定を取りたいです。

イメージ説明
イメージ説明

プレイヤースクリプト

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { Rigidbody rb; // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody>(); } // Update is called once per frame void Update() { } private void FixedUpdate() { rb.AddForce(new Vector3(0,-10.0f,0)); } }

ground地面判定の子の空のゲームオブジェクトのスクリプト

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ground : MonoBehaviour { bool isGround; // Start is called before the first frame update void Start() { isGround = false; } // Update is called once per frame void Update() { } private void OnCollisionEnter(Collision collision) { Debug.Log("地面判定!"); } }

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

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

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

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

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

guest

回答3

0

物理的挙動用object(落下など)(親)   <=スクリプトをアタッチしない
┣コライダーイベント用object(子1)
┣コライダーイベント用object(子2)
┗トリガーイベント用object(子3)
※全てRigidBodyコンポーネント実装

のように並列にできるはずです。
子オブジェクトのRigidBodyのConstraints>Freeze>Position>x,y,z=trueとするとうまくいくようですが。

投稿2019/10/29 14:47

KanazawaKureha

総合スコア368

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

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

退会済みユーザー

退会済みユーザー

2019/10/29 14:58

子1や子2ににはコライダー入れますか?またスクリプトはどこにアタッチするのでしょうか? 自分は落下して地面に着地したことを親のプレイヤースクリプトに伝えるみたいな処理を作りたいのですが またそれと攻撃を受けた被弾ようコリジョンや将来性を持たせたいのですがその辺を考慮したことが知りたいです。無知ですいません。
KanazawaKureha

2019/10/29 15:14

親:Rigid有,Collider無,イベント処理無 外界の情報をシャットアウト。子オブジェクトのみから情報を取得し、情報の統合、判断に専念したスクリプトをアタッチする。 子:Rigid有,Collider/Trigger有,イベント処理有 外界からのイベントを受け取り親オブジェクトに情報を送る。または、親からの指令によってのみ自信を操作することに専念したスクリプトをアタッチする。子オブジェクト同士でやり取りは行わないのが原則。 というのを私は心掛けるようにしています。おそらくこれで大抵の親子関係は決まってくると思うのですが、
退会済みユーザー

退会済みユーザー

2019/10/29 15:16

質問ですが? コライダーイベントとはOnTriggerEnterですよね。?
guest

0

なんだか無理やり感半端ないですがこんな方法も、、、

######親の中身


C#

1public class... : Mono... 2{ 3 bool parentCollisionStay; 4 public bool childCollisionStay; 5 6 public bool InCollision 7 { 8 get 9 { 10 return parentCollisionStay && !childCollisionStay; 11 } 12 } 13 14 void Update() 15 { 16 if (InCollision) 17 { 18 ////親のコライダーが衝突している時の処理 19 } 20 } 21 22 void OnCollisionEnter() 23 { 24 parentCollisionStay = true; 25 } 26 27 void OnCollisionExit() 28 { 29 parentCollisionStay = false; 30 } 31}

######子の中身


C#

1public class... : Mono... 2{ 3 ≪親オブジェクトにアタッチした前述コードのクラス名≫ parent; 4 5 void OnCollisionEnter 6 { 7 parent.childCollisionStay = true; 8 //その他OnCollisionEnterに書きたいことを自由に 9 } 10 11 void OnCollisionExit 12 { 13 parent.childCollisionStay = false; 14 //その他OnCollisionExitに書きたいことを自由に 15 } 16}

何やっているかと一言で言えば、「親のイベントを子のイベントが打ち消すことで親のイベントだけに反応する処理が書ける」という事です。

※"..."は省略記号です
※ネタ枠寄りの回答です

投稿2019/10/29 13:13

KanazawaKureha

総合スコア368

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

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

退会済みユーザー

退会済みユーザー

2019/10/29 14:14

つまり"OnCollisionEnterは取れない"ということよろしいのでしょうか?提示してもらったやり方で強引?にやることはできても本来やるやりかたではないように思えるので
KanazawaKureha

2019/10/29 14:47

そういう事でしたら別解答にひとつ案を上げておきました
guest

0

RigidBodyの設定ですが
要するに以下のことが必要だと思います。

  1. 他のコライダーに当たっても動かしたくない
  2. 重力を働かしたくない

見たところ2についてはuseGravityをオフにすることで解決しているようなので、
ConstraintsのFreeze Position のすべてにチェックをつけるだけでいいと思います。

私が今のところわかることは以上です。追記・編集が必要でしたら言ってください。

投稿2019/10/19 04:55

rintarou1234

総合スコア157

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

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

退会済みユーザー

退会済みユーザー

2019/10/19 11:54

質問ですが僕は足元のコリジョンと攻撃判定のコリジョン分けたいので子のオブジェクトにしてるのですが どうも親オブジェクトのOnCollisionEnterが反応してるみたいなのですがどうすれば複数のコリジョンに分けることができるのでしょうか?
rintarou1234

2019/10/19 12:12 編集

例えばですか私が知っている方法では 1、触れているコライダーのタグを確認する。 2、レイヤーで当たり判定を分ける。 があります。 1の方法では OnCollisionEnter(Collider col) { if(col.tag == "Player") Debug.Log("Player"); } と言って方法で、当たったオブジェクトが何のタグを持っているかを調べられます。 詳しくはこちらに 衝突判定のあれこれ https://qiita.com/moscoara_nico/items/8eee1de552601a8a8f1f 【Unity】Tagの追加ってどうやるの?【初心者向け】 https://tech.pjin.jp/blog/2018/04/10/unity_tag_create/ 2のレイヤーを使う方法ですが、残念ですが私は試したことがなく説明できないので、このサイトを見て試してみてください。 [Unity]レイヤーで当たり判定を制御する http://www.cho-design-lab.com/2013/09/07/unity-collision-controll-layer/ たぶん、方法2のほうが安定すると思います。
退会済みユーザー

退会済みユーザー

2019/10/20 15:16

質問ですが自分がやりたいことは地面と攻撃判定とコリジョンを分けたいので子のオブジェクトにコリジョンを入れてそのコリジョンは地面の判定なのでそれをOnCollisionEnterしたいのですがOnCollisionEnterが呼ばれませんこれについて知りたいのですがそちらの回答は当たった先のものですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問