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

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

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

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

Unity

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

Q&A

解決済

2回答

3491閲覧

衝突判定が起こる時と起こらない時がある

Bruno_5239

総合スコア23

C#

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

Unity

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

0グッド

0クリップ

投稿2019/06/30 05:50

編集2019/07/02 14:49

前提・実現したいこと

現在UnityのThirdPersonControllerを使った3Dアクションゲームを製作しています。プレイヤーが乗ったらAddForce()で上斜め前に打ち上げるジャンプパネルを作ったのですが、これがどうも度々判定されないようです。大体はコード通りに動くのでなぜたまに反応しない時があるのかがわかりません。どなたかアドバイスお願いします!

イメージ説明

該当のソースコード

using UnityStandardAssets.Characters.ThirdPerson;
using UnityEngine;
public class JumpPanelScript : MonoBehaviour
{
GameObject player;
Rigidbody playerrigid;
ThirdPersonCharacter thirdPersonCharacter;
[SerializeField]
private float JumpUpLevel = 15f;
void Start()
{
player = GameObject.FindWithTag("Player");
playerrigid = player.GetComponent<Rigidbody>();
thirdPersonCharacter = player.GetComponent<ThirdPersonCharacter>();
}
private void OnCollisionStay(Collision collision)
{
if (collision.gameObject.tag == "Player")
{
playerrigid.AddForce(collision.transform.TransformDirection(Vector3.forward) * 5, ForceMode.Impulse);
playerrigid.velocity = collision.transform.TransformDirection(Vector3.up) * JumpUpLevel;
thirdPersonCharacter.m_IsGrounded = false;
}
}

試したこと

・コライダーをトリガーにしたり、BoxColiderにして判定を厚くしても改善されませんでした。
・CollisionDetectionをContinuousやContinuos Dynamic, Continuous Speculativeなどすべて試してみましたが改善されませんでした。
・OnCollisionEnterおよびOnCollisionStayの両方で試しましたが変化は見られませんでした。
・AddForceの第二引数を全てのForceModeで試してみましたが飛距離が変わるだけで判定に変化はあまりありませんでした。

補足情報

ゲームの機能としてプレイヤーの速度を速くする機能があるのですが特に判定されない場合がこの時によくあります。これが原因なのでしょうか
イメージ説明
ThirdPersonControllerに自作のPlayerControllerスクリプトをアタッチし、Quicker ValueをThirdPersonCharacterのMoveSpeedMultiplierとAnimSpeedMultiplierにかけています。

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

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

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

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

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

sakura_hana

2019/07/02 02:29

なかなか難しそうではありますが……下記を試してはいかがでしょうか。 ・JumpUpLevelが外部から書き換え(例えば特定条件で0になる等)していないか確認 ・OnCollisionEnterとOnCollisionExitを追加して、OnCollisionStayも含めてDebug.Logを仕込んで衝突状況を確認(あり得るか分かりませんが、Stayを挟まずにEnter→即Exitしているのかも?)
Bruno_5239

2019/07/02 14:34

返信ありがとうございます!いくつものご提案感謝します! 2つとも試してみたところ ・JumpUpLevelの参照は当スクリプトのみでした。でもpublicなのは確かに良くないですね。SerializeFieldでprivateにしておきます! ・判定を全てで検証してみたところ、すり抜けてしまう状況の時はOnCollisionEnterとExitしか呼び出されておらずStayが呼び出されていませんでした!ということでStayとEnterの両方に同じコードを記述してみたところ改善されました!Stayがたまに呼び出されない原因についてはよくわかりませんでしたがひとまずこれで作っていこうと思います!ありがとうございました!
guest

回答2

0

ベストアンサー

AddForceで第2引数にForceMode.Impulseを使っているのであれば、OnCollisionStayの判定は相性が悪い可能性があります。OnCollisionEnterに書き換えれば瞬間的に判定されるので上手くいくかもしれません。

投稿2019/07/02 07:00

編集2019/07/02 07:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Bruno_5239

2019/07/02 14:56 編集

回答ありがとうございます! 先ほどの方の回答と合わせて判定を検証してみると確かにEnterは毎回呼び出されるもののStayはたまに呼び出されない時がありました! OnCollisionStayがたまに呼び出されないことが原因だったんですね。なぜStayは相性が悪いのかをよろしければ教えていただけないでしょうか? とにかくベストアンサーにしておきます!ありがとうございました!
退会済みユーザー

退会済みユーザー

2019/07/02 23:45 編集

相性が悪いことに関しては、 OnCollisionStayはオブジェクトのRIgidbody/Colliderに触れている間、関数を実行するというものです。 それに対して、ForceMode.Impulseは瞬間的に力を加えるというものなので、オブジェクトに触れた瞬間関数を実行するOnCollisionEnterの方が最適なんじゃないかなと思いました。 ForceModeに関してはこのサイトがオススメです https://www.f-sp.com/entry/2016/08/16/211214 ちなみに、OnCollision内にあるif文の中身なのですが、普通にPlayerタグが付いているのであれば、 collision.tag == "Player" でも動作します。
Bruno_5239

2019/07/03 06:48

なるほど、関数の特徴に合わせた動きができるイベントを使った方が良いのですね。もっと勉強していきたいと思います。ありがとうございました!
guest

0

Debug.Logを使いOnCollisionEnter, Stay, Exit全ての判定で呼び出されているか検証してみたところ、たまにすり抜けてしまう状況の時はOnCollisionEnterとExitしか呼び出されておらずStayが呼び出されていませんでした。
そこでOnCollisionEnterとStayの両方に同じコードを設けたところ改善されました。
原因については結局わかりませんでしたが、今の所はこれで進めていこうと思います。みなさん丁寧に回答してくださりありがとうございました!

投稿2019/07/02 14:37

Bruno_5239

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問