레이싱 게임에서 오버 스티어링 재앙 방지


9

안드로이드에서 GTA III을 플레이 할 때 내가 플레이했던 거의 모든 레이싱 게임에서 마리오 카트를 제외하고는 짜증나는 일이 나타났습니다. 곧바로 운전하는 것은 쉽지만 커브는 정말 어렵습니다. 차선을 바꾸거나 누군가를 지나갈 때, 차가 앞뒤로 회전하기 시작하고, 그것을 고치려고 시도하면 오히려 악화됩니다. 내가 할 수있는 유일한 것은 브레이크를 치는 것입니다. 나는 이것이 일종의 오버 스티어링이라고 생각합니다.

그것이 너무 짜증나게 만드는 것은 그것이 현실에서 나에게 결코 일어나지 않는다는 것입니다 (신에게 감사합니다 :-)). 내부에 차량이있는 게임의 90 %는 나에게 비현실적입니다 (아마도 좋은 물리 엔진을 가지고 있음에도 불구하고). 나는 이것에 대해 두 사람과 이야기했는데, 당신은 레이싱 게임을 '얻는'것 같거나 그렇지 않은 것 같습니다. 많은 연습을 통해, 나는 조심스럽게 운전하고, 많이 제동하고 (그리고 보통 내 손가락에 경련을 일으켜서) 일부 게임에서 (예를 들어 Need for Speed ​​시리즈의) 반제품을 얻었습니다.

오버 스티어링 공명 재앙을 ​​방지하고 운전 느낌을 제대로 느끼기 위해 게임 개발자로서 무엇을 할 수 있습니까? (캐주얼 레이싱 게임의 경우 100 % 현실적인 물리학을 위해 노력하지 않습니다)

또한 슈퍼 마리오 카트와 같은 게임이 과도하게 조종되지 않도록 정확히 어떻게 다른지 궁금합니다.

한 가지 문제는 키보드 나 터치 스크린 (휠과 페달 제외)으로 게임을하는 경우, 가스 입력 여부, 왼쪽 / 오른쪽 스티어링 여부 등의 디지털 입력 만 있고, 적절하게 조종하기가 훨씬 어렵다는 것입니다. 주어진 속도. 다른 것은 당신이 아마 속도 감각이없고, 실제로 (안전하게)하는 것보다 훨씬 빠르게 운전한다는 것입니다. 내 머리 꼭대기에서 한 가지 해결책은 속도에 따라 조향 응답을 변화시키는 것일 수 있습니다.


3
또한 대상 고객이 누구인지 고려해야합니다. 열광적 인 게이머라면 현실을 '고정'하여 소외시킬 것입니다. 당신은 아마 자동차를 경주하지 않으며, 경주의 고속에서 당신이 겪고있는 문제는 실제 경주 운전자에게 문제가되는 매우 사실이라는 것을 이해하지 못합니다. 진짜 '수정'은 좀 더 캐주얼 한 것이며 마리오 카트가하는 일입니다. 그들은 물리학이 느슨하고 어류를 만드는 데 필요한 힘을 모델링하지 않으므로 하드 코어 운전 게임 팬에게는 관심이 없습니다.
DampeS8N

나는 당신이 이것에 얼마나 쉽게 접근 할 수 있는지 모르겠지만 도움이 될 것이라고 생각했습니다. 나는 오래 전에 Formula One이라는 PSX 게임을했는데 몇 가지를 만들었지 만 첫 번째 게임이었습니다. 어쨌든 그것은 시뮬레이션 이었지만 옵션에는 증가 또는 감소 할 수있는 슬라이더가있는 조향 및 파괴 보조 옵션이 있습니다. 예를 들어, 어시스트가 매우 높은 경우, 너무 빨리 회전하면 자동차가 자동으로 고장 나서 원하는만큼의 어시스트에 따라 자동으로 조종됩니다. 그 해결책을 위해.
wardd December

답변:


7

한 가지 해결책은 약간의 부정 행위와 플레이어의 행동을 추측하는 것입니다. 플레이어가 직선 섹션에 있고 왼쪽을 누르면 차선을 전환한다고 가정 할 수 있습니다. 그가 커브 나 교차점에 가까워 졌을 때, 그는 분명히 돌고 싶어합니다. 플레이어는 커브에서 정확한 조향 각도를 제어 할 수 없으므로 플레이어에게 의심의 이점을 줄 수 있고 올바른 순간에 턴 버튼을 누를 때 항상 이상적인 각도로 커브를 돌게 할 수 있습니다. 육체적으로 가능합니다-200km / 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.