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

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

詳細はこちら
Unity3D

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

Q&A

解決済

1回答

2714閲覧

複数の当たり判定について 子のオブジェクトの当たり判定でOnCollisionEnterはなぜ使えないのか?そもそもTriggerの違い

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

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

0グッド

0クリップ

投稿2019/10/11 17:27

編集2019/10/23 20:17

Unity バージョン2018.4.9f1

---質問内容---
3Dアクションゲームで地面、攻撃、移動範囲の当たり判定を分けたくプレイヤーの子に空のオブジェクトを作りそこに当たり判定を入れて複数のコリジョンを取りたいです。OnTriggerではなく"OnCollisionEnter"を使う方法が知りたいです。

※画像にはありませんが Rigidbodyを付けない版、つける版両方やりました。
空のゲームオブジェクトについてです。is TriggerをオンにするとOnTriggerEnterのスクリプトは反応するのは知ってますが自分はOnCollisionEnterで行いたいです。OnCollisionEnterを使うにはRigidbodyを入れないと使えないため提示画像通りRigidbodyを入れis Kinematicをオフにするとプレイヤーだけ落下してしまい足元の地面判定が取れません、またis kinematicをオンにするとプレイヤーと一緒に落下しますがCollsiion Triggerともに反応しませんまた常にuse gravityはオフです。またプレイヤースクリプトは常に落下する重力落下処理が書かれているはずです。

足元の子の空のオブジェクト
イメージ説明
スクリプト

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() { // Debug.Log("Ground"); } private void OnCollisionEnter(Collision collision) { Debug.Log("Collision 地面判定!"); } private void OnTriggerEnter(Collider other) { Debug.Log("Trigger 地面判定!"); } }

プレイヤーオブジェクト
イメージ説明

スクリプト

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { Rigidbody rb; Vector3 move; // GameObject go = GameObject.Find("GameObject"); // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody>(); } // Update is called once per frame void Update() { move.x = Input.GetAxis("Horizontal"); move.z = Input.GetAxis("Vertical"); } /*アニメーション管理*/ void Animation_Mng() { } private void FixedUpdate() { rb.AddForce(new Vector3(0,-10.0f,0)); rb.velocity = new Vector3(move.x, rb.velocity.y, move.z); } private void OnCollisionEnter(Collision collision) { //Debug.Log("プレイヤーcollision"); } }

一応地面であるトレインのコンポーネントです、また障害物の壁などが出る予定です。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

1、その地面判定用の空のオブジェクトにアタッチしたスクリプトでOnCollsionEnterが反応しないのでOnTriggerEnterを使うようにしましたがなぜOnCollisionEnterは使えないのでしょうか?

そういう仕様だからです。

  • ColliderのIsTriggerがオンの時はOnTriggerEnterが呼ばれる
  • ColliderのIsTriggerがオフの時はOnCollsionEnterが呼ばれる

という風に、Unityがそう決めているので従うしかありません。

2、親子関係のコリジョンを含むこの場合は別のスクリプトで参照したい場合はどうすればいいのでしょうか?

何を言っているのかさっぱり分かりません。

関係しそうな情報としては、

  • 別オブジェクトと親と子両方が衝突した場合→親と子両方のスクリプトが反応
  • 別オブジェクトと親だけが衝突した場合→親のスクリプトだけが反応
  • 別オブジェクトと子だけが衝突した場合→親と子両方のスクリプトが反応
  • 親と子が衝突した場合→親と子両方のスクリプトが反応

だったかと思います。(※親と子のRigidbodyの有無でも変わりそうなので注意)
詳細(OnTriggerEnter/OnCollsionEnterのどちらが呼ばれるのか等)は私は未検証なので、まずDebug.Logなどで検証してみてください。

投稿2019/10/13 04:20

編集2019/10/13 04:23
sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2019/10/13 10:38

不思議なことにトリガーをオフにしてもOnCollisionが呼ばれないのです....
sakura_hana

2019/10/16 01:52

・OnCollision〜を書いたスクリプトが付いている方のオブジェクトのトリガーがオフであることを確認(自分がオンで相手がオフだと、自分のOnCollision〜は呼ばれないと思います) ・メソッド名と引数の型に間違いが無いか確認(OnTrigger〜の引数はColliderで、OnCollision〜の引数はCollision) ・Rigidbodyの有無を確認(過去質問参照) 回答にも書きましたが、私も不確定な部分があるので、Debug.Logしながら全ての組み合わせで検証してみてください。
退会済みユーザー

退会済みユーザー

2019/10/23 00:16 編集

Rigidbodyを子のオブジェクトに入れたら動きましたがこれだとちょっとやりたいことと違いまして自分は プレイヤーの足元にくっついている子のオブジェクトも一緒に移動させたいのですがその場合はRigidbodyの設定をどうしたらいいのでしょうか?
sakura_hana

2019/10/21 01:54

子のRigidbodyのisKinematicオン、UseGravityオフで出来ませんか?
退会済みユーザー

退会済みユーザー

2019/10/23 00:33

動きましたがスクリプトのOnCollisionEnterが反応しませんこれはなぜでしょうか?
退会済みユーザー

退会済みユーザー

2019/10/23 00:57

ちなみに親にもRigidbodyが入っています。
退会済みユーザー

退会済みユーザー

2019/10/23 00:57

それとisKinematicをoff にしないといけませんw
sakura_hana

2019/10/23 04:39

ベストアンサー付きましたが解決したんでしょうか? なぜ反応しないのか私もよく分からないので、 ・親オブジェクトのインスペクター ・子オブジェクトのインスペクター ・ぶつかる相手(地面)オブジェクトのインスペクター をスクショで全部提示するのと、 ・Unityのバージョン ・レイヤーでの衝突制限を入れていないかどうか を確認して追記してください。(もしかしてもしかするとUnityのバグかもしれないので)
退会済みユーザー

退会済みユーザー

2019/10/23 08:06

追記しました。Unity バージョン2018.4.9f1です。またRigidbodyを入れずに実行するとプレイヤーのOn CollisionEnterに反応しますがこれではどのコリジョンかわからないため困っています。
退会済みユーザー

退会済みユーザー

2019/10/23 09:31

質問2、です初歩的ですが「複数のコリジョンを取る」という行為はそもそも存在するのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問