Version: 2018.4
言語: 日本語
Unity 5.0 のプラグイン
Unity 5.0 のシェーダー

Unity 5.0 の物理挙動

Unity 5.0 の特色には PhysX3.3 SDK へのアップグレードがあります。4.x のプロジェクトで何かしらのアクションを起こす前に急いでこの記事に目を通してみてください。そうすれば新しいコードベースから何が期待できるのかのイメージを得られるはずです。High Performance Physics in Unity 5。PhysX3 と PhysX2 には100%の互換性があるわけではないので、ユーザーがアップグレードする前にいくつか必要な行動があることには十分注意してください。

アップデートの全体的な外観

Unity 5.0 の物理挙動は以前のバージョンと比べて最大2倍まで速く動作することが可能です。良くご存じのコンポーネントのほとんどは変わらずに存在していますし、依然と変わらず動作していることも分かるかと思います。もちろん、挙動を一致させるのが不可能なものがあったり、すでに存在しているコードベースの制限によって奇妙な挙動になるものもあるので、変更を加えなければいけませんでした。もっとも重要な変更があったのは、Cloth コンポーネントと WheelCollider コンポーネントの2つです。それぞれについて、以下に説明します。次に、互換性が効かない原因となる物理コード全体の細かな変更について説明します。

プロジェクトに影響を与える可能性のある変更

Adaptive Force はデフォルトでは無効になりました

Adaptive Force は巨大なスタックのシミュレーションを手助けするために導入されましたが、デモでのみよく挙動することが分かりました。実際のゲームでは不適切な挙動の原因になる場合がありました。設定はエディターの Physics プロパティーで以下のように選択することで切り替えられます。 Edit -> Project settings -> Physics -> Enable Adaptive Force

Smooth Sphere Collision は Terrain と Mesh の両方から削除されました

PhysX3 には PhysX2 と同じ問題を誘発するという特徴があります。主要な欠点のない解決策になると誤解されるので、切り替えができないようにしました。

Spring は PhysX3 でより大きく伸縮します

アップグレード後には Spring のパラメーターの調整が必要な場合があります。

Terrain 物理マテリアルの設定が変更されました

Terrain の物理マテリアルを指定するためには TerrainCollider.sharedMaterial と TerrainCollider.material を使用してください。TerrainData を介して物理マテリアルを設定する古い方法は動作しなくなりました。おまけとして、それぞれのコライダーの基礎ごとに Terrain 物理マテリアルを指定することができるようになりました。

シェイプキャストとスイープが変更されました

  • シェイプスイープはそれらが衝突したすべてのシェイプを報告します(すなわち、CapsuleCast と SphereCast は、プリミティブ型を完全に含んだものであっても衝突したすべてのシェイプを返すということです)
  • Raycast はその原点を含むシェイプを除外します

複合コライダーイベント

複合コライダーを使用する場合、OnCollisionEnter はそれぞれの接触ペアごとに呼び出されるようになりました。

トリガーは凸状でなければなりません

現バージョンより、トリガーは凸状のシェイプでのみ使用できます (PhysX の制限)。

  • TerrainCollider は IsTrigger フラグをサポートしなくなりました。
  • MeshCollider は凸状の場合にのみ IsTrigger を使用できます。

動的なボディは凸状でなければなりません

動的なボディ (すなわち、IsKinematic が false に設定されている Rigidbody がアタッチされているもの) に凹状のメッシュコライダーは使用できません (PhysX の制限)。

凹状のメッシュを衝突させたい場合、静的コライダーとキネマティックなボディにのみ設定できます。

ラグドールジョイント

ラグドール用のジョイントのセットアップは調整が必要な可能性があります。

同じことが、ジョイント一般にも当てはまります。

最新の情報は、ジョイントとラグドールの安定性 を参照してください。

  • Angular Y Limit や Angular Z Limit に小さい値を使用するのは避けてください。設定によって、安定させるために最低角度を 5 から 15 度くらいに設定します。小さい角度を使用する代わりに角度を 0 に設定してみてください。このようにすると、軸を固定し安定したシミュレーションが提供されます。

  • Enable Preprocessing を false に設定して (チェックしないで) ください。preprocess (事前処理) を無効にしておくことでジョイントが吹き飛ばないように補助します。ジョイントは、接続している位置に制約許容量を超える力が加わった場合に吹き飛びます。これは、ラグドールが一部だけ壁の中にスポーンされるなど、つながっているリジッドボディが静的ジオメトリによって引き割かれる場合に起こる可能性があります。

  • ラグドールの安定性と伸縮について - ラグドールが部分的に壁の中にスポーンされる、または莫大な力で押されるなど、ラグドールが極端な状況に置かれた場合、ジョイントソルバーはリジッドボディ同士をつなぎとめておくことはできません。その結果、それらが伸縮したり、「ボディパーツがばらばらになる」ことになる可能性があります。ConfigurableJoint.projectionMode、または CharacterJoint.enableProjection を使用することでジョイントの見積もりを有効にしてください。

  • ジョイントによって繋がったボディが小刻みに震える場合、Edit -> Project Settings -> Physics -> Solver Iteration Count に移動し、値を10から20の間に増やしてください。

  • 決して他のボディに繋がっているキネマティックなボディの Transform を直接使用しないでください。そうすると、PhysX によるボディと一致した内部的な速度計算ステップをスキップしてしまい、それゆえにソルバーが満足のいかない結果を出すことになります。2D プロジェクトの中には、リグのルートボーンで transform.direction を変更することによってキャラクターを反転するために Transform への直接アクセスを使用しているものがあります。しかし、MovePosition / MoveRotation / Move を代わりに使用するほうが、ずっと良く挙動します。

リジッドボディの制約はローカル空間に適用されます

Unity 4 で使用したロック機構は、ロックされた回転の変更を基本的に破棄し、ポストソルバーの処理として角速度をリセットしていました。これは、ソルバーがフレームごとに回転を調整する必要があるため、ボディがスリープする問題があったことを除いて、ほぼうまく機能していました。 いくつかの関連する問題が長年にわたって見られました。PhysX3 の統合に取り組む際に、回転角度の自由度をロックするための無限慣性テンソルコンポーネントを設定できる PhysX 3.3 の新機能を利用しました。これはソルバーでサポートされているため、ボディは適切にスリープ状態になりますが、これは慣性であるためローカル座標で適用されます。

ホイールコライダー

新しいホイールコライダーは、PhysX2 によるコードと比べて根本的にまったく新しい車両ライブラリである PhysX3 Vehicles SDK で提供されています。

新しいホイールコライダーについてはこちらを参照してください

クロス

Unity 5 では、新しい PhysX SDK によって提供される完全に書き直されたクロスソルバーを使用します。このクロスソルバーはキャラクターの服飾を考慮してデザインされており、パフォーマンスや安定性について古いバージョンと比べて大幅な改善が施されています。Unity 5 は Unity 4 における SkinnedCloth と InteractiveCloth コンポーネントを Cloth コンポーネント 1 つに置き換えており、これは SkinnedMeshRenderer と連携して動作します。機能は以前の SkinnedCloth コンポーネントと似ていますが、ノンスキンのメッシュを SkinnedMeshRenderer に任意に割り当てることが可能になりました。そのため、クロスのシミュレーションをどんなメッシュでも扱うことが可能です。

ただし、古い InteractiveCloth で利用可能だったいくつかの機能は優れたパフォーマンスをするように実装するのが難しいため、これらは新しいバージョンの PhysX ではサポートされなくなりました。特に、以下のものがあげられます。

  • クロスを任意のワールドジオメトリと衝突させることができなくなりました。
  • ティアリングはサポートされなくなりました。
  • クロスに圧力をかけられなくなりました。
  • クロスをコライダーをアタッチしたり、シーン内のリジッドボディに対してクロスが力を加えることができなくなりました。
Unity 5.0 のプラグイン
Unity 5.0 のシェーダー