そのため、Unity には、力を介して、または状態 (速度、回転、加速度など) を明示的に設定することによって、リジッドボディと対話するオプションが用意されています。良い一般的なルールは、オブジェクトはこれらの方法のいずれかでのみ影響を受けるということです。明示的に作用するオブジェクトと物理エンジンを介して作用するオブジェクトは、ここで出くわしたような「奇妙な」動作をする可能性があります!
提案されたソリューションでは、落下するオブジェクトに力 (ジャンプさせるため) と明示的なセット (ridgidbody を固定速度で落下させるため) の両方を介して作用します。オブジェクトの物理を有効にしている場合は、力の影響も受けます! 可能な限り「最高の」Unity スクリプトを作成することに関心がある場合は、おそらく 1 つのシステム (強制または明示) を選択する必要があります。
いくつかのオプションがあります。
1) これがあなたの行きたい道だと思います。
落下するオブジェクトを Unity 物理エンジンで管理したい場合、ジャンプ コマンドは適切に見えますが (物理オブジェクトに力を加えても問題ないため)、落下速度を明示的に設定するとパラダイムが壊れます (オブジェクトと相互作用しているため)値を設定し、力を適用することによって)。
良いニュースですが、落下するオブジェクトを力で「押す」ことで、必要な落下動作を引き起こすことができます。オブジェクトが特定のしきい値を超えて加速するのを止めるには、次のようなことを行って、それ以上の重力を中和することができます。
if(rigidbody.velocity.y >= max_speed)
rigidbody.AddForce(new Vector3(0.0f,-1*Physics.gravity,0.0f));
もちろん、これは完璧な解決策ではありません。これを行うだけでは、オブジェクトの最大速度に多少の不一致が生じます。しかし、うまくいけば、それがあなたを正しい軌道に乗せ、好みに合わせて調整できることを願っています. (オブジェクトが特定の速度に達した後、そのオブジェクトの重力を「オフ」にすることも検討してください。正直なところ、最も自然に感じるものは何でも構いません。明示的な属性を設定していない限り (まだ見ることができます!)、うまくやっています。 )
2) Unity の物理エンジンをオブジェクトに作用させる必要がない場合 (そうではないように聞こえます)、ジャンプ コマンドで単純にオブジェクトの y 速度にフラットな値を追加することで、落下するオブジェクトの動作を明示的に実行できます。ただし、この乗り物を降りると、Unity 物理エンジンを介しても、オブジェクトに力が作用することは推奨されないことを忘れないでください。
3) オプション 3 は、「ルール」を無視して、投稿で提供した解決策を利用することです。それを「機能させる」には、落下速度をチェックでラップして、ボールが許容範囲よりも速く落下しているかどうかを確認し、そうである場合にのみ明示的な速度を適用するだけです。
オブジェクトの重力を有効化またはシミュレートし、次のことを行います。
if(ridgidbody.velocity.y < -500)
rigidbody.velocity = new Vector3(rigidbody.velocity.x, -500, rigidbody.velocity.z);
次に、物理演算を使用して、ジャンプ、通常の落下、および衝突を管理します。
これはおそらくあなたの「最も速い」解決策です。ただし、ゲームが非常に複雑になると、再び噛み付く可能性があることに注意してください。
それが役立つことを願って、
-ザック