前提・実現したいこと
趣味で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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/19 12:31