レースゲームでのオーバーステアリングの大災害を防ぐ


9

AndroidでGTA IIIをプレイしたとき、これまでプレイしたほぼすべてのレーシングゲーム(多分マリオカートを除く)で私を困らせていることに気づきました。直進は簡単ですが、カーブは本当に難しいです。車線を変更したり、誰かを追い越したりすると、車は前後に旋回し始め、修正しようとするとさらに悪化します。私ができる唯一のことは、ブレーキを踏むことです。これはある種のオーバーステアリングだと思います。

それがとても苛立たしいのは、現実には私には決して起こらないことです(ありがとう:-))、車内でのゲームの90%は私には現実的ではないと感じます(おそらく本当に良い物理エンジンを持っているにもかかわらず)。私はこれについて数人の人々と話しました、そしてあなたはレーシングゲームを「得る」か、そうでないかのようです。多くの練習をして、いくつかのゲーム(たとえば、Need for Speedシリーズから)で、非常に慎重に運転し、たくさんブレーキをかけて(そして、通常、指にけいれんを起こして)、ある程度うまくいくことができました。

ゲームデベロッパーとして、オーバーステアリングの共振による大惨事を防ぎ、運転を適切に感じさせるために何ができますか?(カジュアルなレーシングゲームの場合、100%リアルな物理学を目指しているわけではありません)

また、スーパーマリオカートのようなゲームでは、オーバーステアリングがそれほど多くないように、まったく異なる動作をするのでしょうか。

一つの問題は、キーボードやタッチスクリーン(ホイールとペダルではなく)でプレイする場合、デジタル入力しか持っていないことだと思います:ガスが押されているかどうか、左/右に操縦しているかどうか、そして適切に操縦するのははるかに難しいです。与えられた速度。もう1つは、速度の感覚がよくなく、実際に(安全に)運転するよりもはるかに速く運転することです。私の頭の上から、1つの解決策は、ステアリング応答を速度に応じて変化させることかもしれません。


3
ターゲットオーディエンスが誰であるかについても考慮する必要があります。ゲーマーを運転する愛好家であれば、現実を「修正」することで彼らを遠ざけるだけです。あなたはおそらく車をレースしないし、レースの高速であなたが経験している問題が実際のレースドライバーにとって問題である非常に現実的なものであることを理解していない。本当の「修正」は、よりカジュアルにすることであり、それがマリオカートが違うことをしていることです。彼らは物理学に緩く、フィッシュテイルを作成するために必要な力をモデル化していないため、ハードコアなドライビングゲームのファンには興味がありません。
DampeS8N

これに簡単にアクセスできるかわかりませんが、役立つと思いました。私はずっと前にFSXと呼ばれるPSXゲームをプレイしました。彼らはいくつかのゲームを作りましたが、それが最初のゲームでした。とにかくそれはシミュレーションでしたが、オプションにはステアリングとブレーキングアシストオプションがあり、スライダーを使って増減できます。たとえば、ブレーキアシストが非常に高い場合、曲がり角が速すぎると車は自動的にブレークし、ステアリングも(必要なアシストの量に応じて)変わるため、確認する必要があるかもしれません。それは解決策です。
2012

回答:


7

1つの解決策は、少しごまかしてプレーヤーが何をしたいのかを推測することです。プレーヤーがまっすぐなセクションにいて左を押すと、レーンを切り替えたいと考えることができます。彼がカーブまたは交差点に近いとき、彼は確かに方向転換したいと思います。プレーヤーはカーブでの正確なステアリング角度を制御することができないため、プレーヤーに疑念の恩恵を与え、適切なタイミングでターンボタンを押すと常に理想的な角度でカーブをドライブさせることができます(限り、物理的に可能な限り-200 km / hのヘアピンカーブでドライブしようとするプレーヤーは、芝生の上を短時間飛行することで罰せられるに値します)。

もちろん、これは、プレーヤーが実際に直線セクションで方向転換したい場合、または交差点の直前で車線を変更したい場合に、トリッキーになる可能性があります。

別の解決策は、キーをタップすることとキーを保持することの間に違いを持たせることです。プレイヤーがターンキーを長く持つほど、回転角度が高くなります。ステアリングホイールがある場合、ハンドルを完全に回すには時間がかかるので、これは現実的ではありません。

編集:タッチスクリーンでは、ボタンの代わりにスライダーを使用して、ステアリングと速度をアナログで制御できます。画面が圧力に敏感な場合は、圧力を解釈することもできます(ただし、最大圧力について視覚的なフィードバックを提供します。そうしないと、熱心すぎるプレーヤーがディスプレイを壊す可能性があります)。デバイスに方向センサーがある場合、デバイスの傾斜を使用してステアリングを制御できます。


@kotekzot、訂正ありがとうございます。ただし、他のユーザーの投稿に編集を提案することなく、直接依頼することができます。
Philipp

あなたのアイデアは良いです。右ボタンを押すと(0/1)、カーブに応じた角度で車が回転します。車を運転するときのように、「左に曲がる」(0/1)と言いますが、実際には、スロープに応じてハンドルを多少回します。また、特筆すべき点として、角度突然変化するのではなく、徐々に変化します。
GameAlchemist

0

Grand Theft Auto IVとV以外のゲームが実装しているゲームを調査しているときにこの(古い)質問に遭遇しましたが、制御可能なオーバーステアを実現するための適切な答えがあります。私はGrand Theft Auto Vの運転モデル​​をいじくり回しただけの経験がありますが、この情報は、最も現実的な運転モデル​​に適用できるはずです。

ほとんどのドライビングゲームで発生するように見えるのは、車のステアリング出力がプレーヤーの入力に直接リンクされていることです。これは、ある種の(時間的な)スムージングが使用されている場合でも同様です。これは、鈍い感じまたはぎくしゃくした感じを引き起こします-そして、車はコントロールを手放した後、それ自体を修正しません。これは、実際の車とは対照的です。実際の車は、ホイールに力を加えた後に車が中央に集まる傾向があります。一部のゲームでは、処理モデルを変更したり、アーケード処理モデルを作成したりして、これを修正しようとします。

Grand Theft Auto Vで観察できることは、ユーザーのステアリング入力がステアリング出力に直接リンクされていないことです。車両は、現在の速度ベクトルに向かって単独で操縦します。これは、わずかなオーバーステアの状況を強制し、ステアリングホイールを観察したときに表示されます。何も入力しなくても、それらは自分でカウンターステアします。次に、ユーザー入力がこれらの「自然な」修正の上に追加されます。

ただし、このアプローチの欠点は、車がベタベタしすぎて、パワースライドやドリフトに入るには少し頑固だと感じられることです。そのため、このカウンターステア値は、特定の角度に制限できます。

この理論は、ステアリングシステムを再実装し、それを元の動作と比較することで検証できます。

  • 入力を出力に直接リンクする場合、速度ベースのステアリング入力リミッターを適用したとしても、車両の制御は非常に困難です。
  • 自然なカウンターステアを追加する場合、動作はゲームの実装とほぼ同じですが、車は「安定」しています。
  • 15度の制限をカウンターステアに追加すると、動作はほぼ同じになります。

ここで覚えておくべきことは、Grand Theft Auto Vがここでは「理想的」と見なされていることです。ただし、このシステムを実装する他のゲームはまだ見つかっていません。

あなたがいくつかのコードに興味があるなら、ここに私の実装のスニペットがあります。

// Returns in radians
float Racer_calculateDesiredHeading(float steeringMax, float desiredHeading,
    float reduction) {
    desiredHeading *= reduction;
    float correction = desiredHeading;

    // Get the relative velocity vector
    Vector3 speedVector = ENTITY::GET_ENTITY_SPEED_VECTOR(vehicle, true);
    if (abs(speedVector.y) > 3.0f) {
        // Simplify it to an angle
        Vector3 target = Normalize(speedVector);
        float travelDir = atan2(target.y, target.x) - static_cast<float>(M_PI) / 2.0f;
        if (travelDir > static_cast<float>(M_PI) / 2.0f) {
            travelDir -= static_cast<float>(M_PI);
        }
        if (travelDir < -static_cast<float>(M_PI) / 2.0f) {
            travelDir += static_cast<float>(M_PI);
        }
        // Correct for reverse
        travelDir *= sgn(speedVector.y);

        // Limit to some degree, R* uses 15 degrees
        travelDir = std::clamp(travelDir, deg2rad(-15.0f), deg2rad(15.0f));

        // User input deviation
        correction = travelDir + desiredHeading;
    }

    return std::clamp(correction, -steeringMax, steeringMax);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.