🐙

Unity 物理演算 メモ

2024/02/21に公開

メモしたのを書きなぐります

・Bounce Thresholdで跳ね返りの調整
参照サイト

・Default Contact Offsetで接触判定の距離調整
参照サイト

・Default Solver Iterations、Default Solver Velocity Iterationsでジョイントの不安定を緩和
参照サイト参照サイト

・Queries Hit BackfacesでMeshColliderの裏面の三角形でヒットを検出
参照サイト

・Enable Adaptive Forceで、積み重なったオブジェクトを通じて力が伝達される方法に影響し、より現実的な動作を得られます
参照サイト

・Contacts Generationで、当たり判定の仕方を設定。新しめのバージョンだとPersistent Contacts Manifold の方が良い
参照サイト

・Enable Unified Heightmapsで、ッシュ衝突と同じ方法で Terrain (地形) の衝突を処理します。
参照サイト

・Solver Typeを調整して、ジョイントのオーバーストレッチに対する抵抗力を改善
参照サイト

・物理演算を指定秒数進めるAPIのSimulate
巻き戻しや未来予測なども可能
参照サイト

・Collision Detectionの早見表
参照サイト

・Effector2Dを使用して、様々な物理シュミレーションを行う
エッジに沿って動かしたり、部分的に吸引したり・離したり、範囲内のオブジェクトに対して、指定の方向から力を与えたり、浮力や水の流れの表現、一部分の当たり判定無効にしたりすることができる
参照サイト

・コライダー同士を結合するComposite Collider 2D
簡単に洞窟で探索するゲームも作成できる
参照サイト

・Distance Joint 2DとHinge Joint(2D)とSlider Joint(2D)で振り子、バネ・チェーン、ドアの開閉を作成する
参考動画参考動画

・Constant Force(2D)で、手軽にxyz軸の外力(移動・回転)を加えることができる。
また、加速度のように徐々に変化する。
参考動画

・Generate Colliders
3DCGツールで設定したコライダーを、Unityに反映させる。
Generate Collidersオフ

Generate Collidersオン

参照サイト

・テクスチャのインポート設定 Generate Physics Shape
有効にすると、Spriteの形からコライダーを生成する。
ただオンでもオフでも、Polygon Collider2Dを確認したらSpriteの形によってコライダー生成していた。

参照サイト

・Unityの物理演算
■オブジェクト指向プロジェクトのためのビルトインの物理演算エンジン
従来からある物理エンジン
ビルトインの 3D 物理 (Nvidia PhysX エンジンインテグレーション)
ビルトインの 2D 物理 (Box2D エンジンインテグレーション)
■データ指向プロジェクトの物理エンジンパッケージ
DOTSを使用する際、使用する物理エンジン
従来からある物理エンジンよりも挙動がリアルで、パフォーマンスもほぼ同じである
Unity Physics
Havok Physics for Unity
参照サイト参照動画

・物理ベースで動くリジッドボディゲームオブジェクト
物理ベースで動くリジッドボディゲームオブジェクトは、ほとんどの場合においては、リジッドボディを持つゲームオブジェクトは、Transform プロパティではなく Rigidbody プロパティを使用して動かすことが推奨されます。Rigidbody プロパティは物理演算システムから力とトルクを適用し、それよってゲームオブジェクトの Transform が変更されます。それに加えて Transform を直接変更すると、Unity は物理シミュレーションを正しく計算できず、望ましくない動作が発生する可能性があります。これは ジョイント を持つリジッドボディでは特に顕著です。
リジッドボディをスクリプトで制御する場合、使用する主なクラスは AddForce(ゲームオブジェクトに力を加える) と AddTorque(ゲームオブジェクトにトルクを加える) です。
参照サイト

・物理ベースで動かないリジッドボディゲームオブジェクト
場合によっては、“物理演算システムによって検出されるが制御はされない” ゲームオブジェクトが必要になることもあります。例えば “コライダー によって検出されるが、動きや位置は Transform で制御される” ゲームオブジェクトが必要な場合などです。

Unity では、物理ベースではない動きを キネマティックモーション (運動学ベースの動き/キネマティックな動き) と呼びます。Rigidbody コンポーネントには Is Kinematic というプロパティがあります。これを有効にすると、添付されたゲームオブジェクトは、“物理ベースではない” と定義され、物理演算エンジンの制御から外されます。これにより、そのゲームオブジェクトを、Transform を使用してキネマティック方式で (Unity の物理シミュレーションの計算に変更をオーバーライドされない形で) 動かせるようになります。

キネマティックなリジッドボディは、物理ベースのリジッドボディゲームオブジェクトに物理ベースの力を加えることができますが、物理ベースの力を受けることはできません。例えば、キネマティックなリジッドボディが物理ベースで動くリジッドボディに衝突してそれを “押す” ことはできますが、物理ベースで動くリジッドボディがキネマティックなリジッドボディを “押す” ことはできません。

Discussion