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

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

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

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

Unity

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

Q&A

解決済

1回答

1624閲覧

Unity FixedUpdate内でRigidbodyクラスのAddForceメソッドで操作したい物体の移動を行い、他の物体から離れたはずなのにOnCollisionStayが呼び出されてしまう。

s_yossun

総合スコア15

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2020/02/18 02:04

編集2020/02/19 02:28

前提・実現したいこと

趣味でUnityを使用し、ゲーム制作をしております。

操作したい物体が地面と接触している時のみ行いたい処理があります。

操作したい物体が地面と接触した時に呼び出されるOnCollisionEnterメソッド内で、地面と接触している時にtrueとするフラグをたて、操作したい物体が地面から離れた時に呼び出されるOnCollisionExitメソッド内で、そのフラグをfalseとします。
そして、地面と接触している時にtrueとなるフラグがtrueとなっている時のみFixedUpdate内でAddForceメソッドにより操作したい物体を動かそうとしています。

発生している問題・エラーメッセージ

FixedUpdate内でAddForceメソッドにより操作したい物体を動かそうとしているのですが、物体を動かした後に地面から離れているはずなのに、OnCollsionExitメソッドではなくOnCollsionStayメソッドが呼び出されてしまい、OnCollisionExit内で地面と接触しているかのフラグがfalseにされません。

その為地面と接触していない時でも、地面と接触している時のみ行いたい処理が実行されてしまいます。

地面から離れたフレームではフラグはfalseにされませんが、その次のフレームではOnCollsionExitメソッドが呼ばれフラグはtrueとされます。

該当のソースコード

C#

1using UnityEngine; 2 3// 操作したい物体につけるスクリプト 4public class Script_Capsule : MonoBehaviour 5{ 6 // 地面と接触している時のみ行いたい処理のフラグ 7 private bool jumpFlag; 8 9 // 地面と接触しているかどうかのフラグ 10 private bool isGrounded; 11 12 // 操作したい物体のRigidbody 13 private Rigidbody thisRigidbody; 14 15 void Start() 16 { 17 // 地面と接触している時のみ行う処理のフラグをfalse 18 jumpFlag = false; 19 20 // 地面と接触しているかどうかのフラグをfalse 21 isGrounded = false; 22 23 // 操作したい物体のRigidbodyを取得 24 thisRigidbody = transform.GetComponent<Rigidbody>(); 25 } 26 27 void FixedUpdate() 28 { 29 if (jumpFlag) 30 { 31 // 地面と接触している時のみ行う処理の実行 32 Debug.Log("Jump"); 33 34 Vector3 moveVector = new Vector3(0.0f, 5.0f, 0.0f); 35 thisRigidbody.AddForce(moveVector, ForceMode.Impulse); 36 37 jumpFlag = false; 38 } 39 } 40 41 void Update() 42 { 43 // 操作したい物体が地面と接触している状態でスペースキーが押された時のみ行う処理 44 if (Input.GetKey(KeyCode.Space) && isGrounded) 45 { 46 jumpFlag = true; 47 } 48 } 49 50 // 操作したい物体が地面と接触した瞬間に呼ばれる 51 private void OnCollisionEnter(Collision collision) 52 { 53 Debug.Log("OnCollisionEnter"); 54 55 // 地面と接触しているフラグをtrue 56 isGrounded = true; 57 } 58 59 // 操作したい物体が地面と接触している間呼ばれる 60 private void OnCollisionStay(Collision collision) 61 { 62 Debug.Log("OnCollisionStay"); 63 } 64 65 // 操作したい物体が地面から離れた瞬間に呼ばれる 66 private void OnCollisionExit(Collision collision) 67 { 68 Debug.Log("OnCollisionExit"); 69 70 // 地面と接触しているフラグをfalse 71 isGrounded = false; 72 } 73} 74

試したこと

操作したい物体をFixedUpdate内で移動させる時に、AddForceメソッドではなくtransform.Positionを設定して物体を移動させた場合を試したのですが、その時はOnCollisionStayではなくOnCollisionExitが呼ばれ、正常に動作しました。

補足情報(FW/ツールのバージョンなど)

Unity Version 2019.3.1f1 Personal

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。
まずはUnityの仕様で難しい点があるのでそこの説明をさせて頂きます。

物体を動かした後に地面から離れているはず

AddForceで物体に力を加えた場合に実際に物体が移動するのは力を加えた次のフレームからです。
その為、AddForceをおこなったフレームはまだ地面に接触しているのでOnCollsionStayが呼び出されるのは正常です。
引用部分は残念ながら間違いという事になります。

試した事の「AddForceメソッドではなくtransform.Positionを設定して物体を移動させた場合」はそのフレームで移動しているのでOnCollsionStayは呼ばれないのは合っています。

これに関してはDebug.Logやデバッガを使って物体の位置を確認すると良いと思います。

・解決策
現状はAddForceが二回行われてジャンプ力2倍になる問題が出ていると思いますが下記どちらかで解決するかと思います。
まずは上の方を試して下さい。

UpdateInput.GetKeyInput.GetKeyDownに変更する。
isGrounded = false;FixedUpdateif (jumpFlag)条件式内に移す。

投稿2020/02/19 03:50

編集2020/02/19 04:45
Hawn

総合スコア1222

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

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

s_yossun

2020/02/19 12:31

こんにちは。 回答ありがとうございます、返事が遅れてすみません。 つまり正常に動いているという事ですね、解決策までありがとうございます。 あと少しだけ分からない事があるので質問してもいいですか? AddForceで物体に力を加えた場合に実際に物体が移動するのは力を加えた次のフレームからとの事ですが、Debug,Logで操作したい物体のY座標を表示して確認した所、FixedUpdate内でAddForceにより物体に力を加えた直後のFixedUpdate内でのY座標は確かに座標は動いていませんでした。 ですが、同じフレームで呼ばれたOnCollisionStay内で確認したY座標は座標が動いていました。 FixedUpdateとOnCollisionStayの間で物体の移動が行われているけれど、地面などとの当たり判定は移動の前に行われている、つまり、FixedUpdate→当たり判定→物体の移動→OnCollisionStayの順で処理が行われているという事でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問