前提・実現したいこと
こちらのサイトを参考に、
Rigidbodyのスリープモードについて検証してみましたが、
書かれている内容と異なる点があったように思えました。
・質問1
一見それほど問題はなさそうですが、力を与えられない変更、 例えばそのスリープとなっているオブジェクトの下の床が消えたといった場合に、 オブジェクトは物理演算を行わないのでそのまま宙に浮いたままになったりします。
こちら検証したかったのですが、再現できませんでした。どのようにすれば再現できますか?
もしくは仕様が変更されたのでしょうか?
・質問2
質問1が仕様変更したのだとすると、今の所、Rigidbodyがスリープモードになったときに困る不具合として、
「OnCollisionStayが呼ばれなくなる」と、
「Rigidbodyをアタッチしていないオブジェクトが動いて、Rigidbodyに動いているオブジェクトに接触しても、衝突せずにすり抜ける」
ぐらいなのですが、
他に何か思い当たるものがあれば教えていただきたいです。
・質問3。
トランスフォーム移動でも、スリープを解除するように思えるのですが、
それを証明するようなコードの書き方を教えていただけませんか?
試したこと
質問1に関して。
C#
1 void Update() 2 { 3 Debug.Log(rb.IsSleeping()); 4 } 5 6 void OnCollisionStay(Collision col){ 7 Debug.Log("stay"); 8 }
重力を効かせたRigidbodyをアタッチしたオブジェクトに、上記スクリプトのログを取りましたが、
スリープがtrueになったとき、OnCollisionEnterが呼ばれなくなるなるのは確認できましたが、
このとき、このスリープしているオブジェクトの下の床オブジェクトを削除したら(シーンビューから選択して削除)、
スリープしているオブジェクトのIsSleepingはfalseになり、スリープが解除され、下に落下しました。
検証方法が間違っている、もしくは、参考サイトの現象の仕様が変更されたのか、教えていただきたいです。
質問2に関して。
下記2点を検証して、そのような挙動になりました。
・「OnCollisionStayが呼ばれなくなる」
・「Rigidbodyをアタッチしていないオブジェクトが動いて、Rigidbodyに動いているオブジェクトに接触しても、衝突せずにすり抜ける」
他に考えられる不具合な現象があれば教えていただきたいです。
質問3に関して。
C#
1 void Update() 2 { 3 if(rb.IsSleeping()){ 4 this.transform.Translate(0.5f, 0, 0); 5 Debug.Log(rb.IsSleeping()); 6 } 7 }
これを実行すると、カクカクした動きになる(毎フレームトランスフォーム移動していないような動きになる)のですが、
トランスフォーム移動直後のIsSleepingのログは常にtrueを返します(スリープしたまま)。
何か、トランスフォーム移動でもスリープが解除されていると証明できるコード(できればログで証明できるコード)を
教えていただけませんか?
補足情報(FW/ツールのバージョンなど)
Unity 2018.3.8f1
回答1件
あなたの回答
tips
プレビュー