トラクタービームを実装するには?
私は、プレイヤーがトラクタビームのようなものを使用してオブジェクトを拾い、それらを持ち運ぶことができるゲームに取り組んでいます。 ビームの中心に向かってオブジェクトを引き付けることは難しくありません。しかし、オブジェクトが中心に十分近づいたら、プレイヤーが動いている間、オブジェクトをそこに置いておく必要があります。これが問題です。それを行うには2つの方法が考えられますが、どちらにも問題があります。 プレーヤーの位置が変更されるたびにオブジェクトの位置を更新し、ビームの中心に配置します。 オブジェクトの速度を更新して、ビームの中心を直接指すようにすると、遠ざかるほど速度が上がります。 移動と回転はどちらの方法でも問題なく機能しますが、運ばれたオブジェクトが他のオブジェクトと衝突すると、物理学は正しくありません。 最初のアプローチでは、物理学は完全に無視されます。運ばれたオブジェクトは、何でも邪魔にならないように押し出します。位置の変更は、速度に基づいて、世界の物理学の一部としてのみ行われることになっているためです。 2番目のアプローチでは、物理学は基本的には本来あるべき振る舞いをしますが、過剰反応します。問題は、回転して移動しているときでも、運ばれたオブジェクトをビームの中心に保つために、高い速度値を使用する必要があることです。したがって、運ばれたオブジェクトが別のオブジェクトに触れると、衝突によって速度が大きくなりすぎます。 これを適切に実装するにはどうすればよいですか?現在の私の推測では、2番目のアプローチを使用して、運ばれたオブジェクトの特別な処理をワールドフィジックスに追加し、衝突時またはプレーヤーが持ち運びを停止したときに速度を正解値に下げることです。しかし、それはかなり洗練されていない回避策のようです。 編集:いくつかの疑似コードを追加して、それが現在どのように機能するかを示します(上記の2番目のアプローチになります) void attract_object(object, ticks) { Vector distance = beam_center - object.center; // If the object is not close to the beam center, attract it slowly if (magnitude(distance) > 10) { object.velocity += distance.normalized() * ticks * 0.1; return; } // Here comes …