内部重力のある船/宇宙ステーションをシミュレートしようとしています。
これを達成するために、プレーヤーと船のすべてのコンテンツを船の子にしています。船自体にはコライダーがありますが、剛体コンポーネントはありません。アイデアは、船が移動すると、その内容もすべて移動するということです。これまでのところかなり簡単です。
船内の重力をシミュレートするために、プレイヤー コントローラーとすべての剛体のデフォルトの重力がオフになっています。標準の代わりに、各フレームに力が親船の負のアップ ベクトルに沿って適用されます。
この種の作業はうまくいきますが、これを確実にする前に解決しなければならない大きな問題が 1 つあります。すべての剛体は、船の内部を非常にゆっくりと滑ります。
これはおそらく床の更新された位置が重力と組み合わされてある種のせん断力が発生したためであることは承知しています。オブジェクトは常に船の回転に逆らってスライドします。
物理マテリアルから質量へのドラッグなど、すべての物理特性をいじってみました。どれもうまくいきませんでした。RB が動いていても、床が動いているという基本的な事実によるものだと確信しています。床がその一部であるオブジェクトの子です。
ある種のダクトテープではない、これに対する解決策を誰かが持っていますか? すべてをキネマティックにして、特定の外部衝突などが発生したときにのみ「目覚める」ようにすることもできますが、それは非常に面倒になる可能性があります。これが可能な限り汎用的な方法で機能する必要があります。
いくつかのコード:
船の上
void Update ()
{
transform.Rotate(new Vector3(Time.deltaTime * 0.125f,Time.deltaTime*0.5f,0));
}
void FixedUpdate()
{
Vector3 tempVec;
foreach(Rigidbody rb in rigidBodies)
{
//Gravity!!
tempVec = transform.up * -9.81f * rb.mass * Time.deltaTime;
rb.AddForce(tempVec, ForceMode.Acceleration);
}
}
また、剛体の動きに船が追従するバージョンも作成しました。直接のペアレンティングはできなかったので、物理プロキシに一致するようにフレームごとに手動でトランスフォームを設定するだけで済みました。これでも上記と同じ効果が得られましたが、最終的には船をどのように動かしたいかということになるでしょう。