Unity 5.0 の特色には PhysX3.3 SDK へのアップグレードがあります。4.x のプロジェクトで何かしらのアクションを起こす前に急いでこの記事に目を通してみてください。そうすれば新しいコードベースから何が期待できるのかのイメージを得られるはずです。High Performance Physics in Unity 5。PhysX3 と PhysX2 には100%の互換性があるわけではないので、ユーザーがアップグレードする前にいくつか必要な行動があることには十分注意してください。
Unity 5.0 の物理挙動は以前のバージョンと比べて最大2倍まで速く動作するでしょう。良くご存じのコンポーネントのほとんどは変わらずに存在していますし、依然と変わらず動作していることも分かるかと思います。もちろん、挙動を一致させるのが不可能なものがあったり、すでに存在しているコードベースの制限によって不気味な挙動になるものもあるので、変更を加えなければいけませんでした。もっとも重要な変更があったのは、Cloth コンポーネントと WheelCollider の2つです。それぞれについての説明を以下に用意しました。その後には、互換性が効かない原因となる Physics コード全体の細かな変更について説明してあります。
Adaptive force は巨大なスタックのシミュレーションを手助けするために導入されましたが、デモでのみ優秀だったことが分かりました。実際のゲームでは不適切な挙動の原因になり得たのです。設定はエディターの Physics プロパティーから以下のように選択することで切り替えられます: Edit -> Project settings -> Physics -> Enable adaptive force
PhysX3 には PhysX2 と同じ問題を誘発するという特徴がありますので、主要な欠点を抜きに解決策になると誤解されるような切り替えができないようにしました。
アップグレード後には Spring のパラメータを調整したいと思うかもしれません。
Terrain の physics material を指定するためには TerrainCollider.sharedMaterial と TerrainCollider.material を使用してください。TerrainData を介して physics material を設定する古い方法は動作しなくなりました。おまけとして、それぞれのコライダーの基礎ごとに terrain physics material を指定することができるようになりました。
複合コライダーを使用する場合、OnCollisionEnter はそれぞれの接触ペアごとに呼び出されるようになりました。
現バージョンより、トリガーは凸状のシェイプでのみ使用できます(PhysX の制限)
ダイナミックボディ (すなわち、IsKinematic が false に設定されている Rigidbody がアタッチされているもの) に凹状のメッシュコライダーは使用できません(PhysX の制限)。
凹状のメッシュを衝突させたい場合、static コライダーに kinematic なボディを使用するしかありません。
ラグドール用のジョイントのセットアップは調整が必要な可能性があります。
これらの提案は通常、同じようにしてジョイントにも適用します。
最新の情報は、ジョイントとラグドールの安定性 を参照してください。
“Angular Y Limit” や “Angular Z Limit” に小さい値を使用するのは避けてください。あなたの設定に依存する最低角度は安定させるために 5 から 15 度くらいに設定するべきです。小さい角度を使用する代わりに angle を 0 に設定してみてください。角度がロックされ、安定したシミュレーションが提供されます。
“Enable Preprocessing” を false に設定して(チェックしないで)ください。preprocess (事前処理)を無効にしておくことでジョイントが “爆発” しないように補助します。ジョイントは、ジョイントしている位置の制限許容量を超える力が加えられた場合 “爆発します”。これは、ラグドールが一部だけ壁の中にスポーンされるなど、つながっているリジッドボディが静的ジオメトリによってバラバラにされた場合に起こる可能性があります。
ラグドールの安定性と伸縮:部分的に壁の中にスポーンされる、または莫大な力で押されるなど、ラグドールが極端な状況に置かれた場合、ジョイントソルバーはリジッドボディ同士をつなぎとめておくことはできません。これによってそれらが伸縮したり、“ボディパーツが点在する” ことになる可能性があります。“ConfigurableJoint.projectionMode” 、または “CharacterJoint.enableProjection” を使用することでジョイントの見積もりを有効にしてください。
ジョイントによって繋がったボディが小刻みに震える場合、Edit -> Project Settings -> Physics -> “Solver Iteration Count” を増やしてみてください。10から20を試してください。
決して他のボディに繋がっている kinematic なボディの Transform を直接使用しないでください。そうすると、PhysX によるボディと一致した内部的な速度計算ステップをスキップしてしまい、それゆえにソルバーが満足のいかない結果を出すことになります。我々は 2D プロジェクトでリグのルートボーンで transform.direction を経由する代わりに、キャラクターを反転するために Transform への直接アクセスを使用しているものをいくらか見てきました。MovePosition / MoveRotation / Move を代わりに使用する場合、これはより良く振る舞います。
Unity 4 で使用していたロックメカニズムはロックされた回転の変更を基本的に廃棄し、角速度をポストソルバーステップでリセットしていました。これは、ソルバーが毎フレーム回転を調整しようとしながら、ボディが sleep 状態になろうとするという問題があること以外は、おおむね良好に動作していました。そして、これと関連するケースも近年いくらか発見されています。PhysX3 インテグレーション上で動作させるときロックされた回転角度の自由のために無限慣性テンソルコンポーネントを設定できるという PhysX 3.3 の新しいクールな特徴を利用しました。ボディが適切に sleep 状態になるように、これがソルバーでサポートされるようになりましたが、これは慣性なのでローカル座標で適用されます。
新しい WheelCollider は PhysX2 のコードと比べ、根本的にまったく新しいビークルライブラリである PhysX3 Vehicles SDK で提供されました。
新しい WheelCollider についてはこちらを参照してください。
Unity 5 では PhysX SDK で新しく提供される、完全に書き直されたクロスソルバーが使用されます。このクロスソルバーはキャラクターの着用を考慮してデザインされており、パフォーマンスや安定性について古いバージョンと比べて大幅な改善が施されています。Unity 5 は Unity 4 における SkinnedCloth と InteractiveCloth コンポーネントを Cloth コンポーネント一つに置き換えており、これは SkinnedMeshRenderer と連携して動作します。機能は以前の SkinnedCloth コンポーネントと似ていますが、独断でノンスキンのメッシュを SkinnedMeshRenderer に割り当てることが可能になっていますので、クロスのシミュレーションをどんなメッシュでも扱うことが可能です。
しかし、古い InteractiveCloth で利用可能だったいくつかの機能は新しいバージョンの PhysX ではサポートされなくなりましたので、以下の機能をよいパフォーマンスで実装するのは困難です。特に、