Всё под катом.

Буквально, только что нашёл весьма весомый баг в игре. При помощи него можно не то что бесшумно перемещаться, можно даже "летать" подобным образом. Как сказал Марк Грегори (продюсер, у которого я брал интервью):

- "Полёты" - физический баг UDK и NVIDIA. Что мы не можем контролировать.
(Оригинал: Ok flying is a pyshics bug with UDK and NVIDIA pyshics. Nothing we can control).

Допустим, возможность полёта на предметах, которые вы держите, можно спихнуть на проблемы движка, но что насчёт бесшумности...

- Солдат отреагировал на то, что вы врезались в него предметом, который вы тащили.
(Оригинал: Also that soldier reacted because you bumped into him with the object you were carrying).

Как раз таки на то, что я врезался в него предметом, реакции не было...

- Он должен так реагировать, потому что вы ударили его в шею. А надо было в заднею часть головы.(Оригинал: As he should as you hit him on a angle. Has to be a direct shot to back of the head).

Всё таки мне кажется, что я ему ни в шею бил... а как раз в заднею часть головы.

-Зачем вам прыгать? Это же стелсовая игра. Вы выбираете как действовать. Вы выбираете как использовать физику игру, мы не вынуждаем вас этого делать.
(Оригинал: Why do you need to jump? It's a stealth game. You're choosing to do that. You're choosing to exploit the games physics we're not forcing it on you).

На этом ответе я решил прекратить беседу...

Видео, сделанное мной, по просьбе Марка. Качество конечно то ещё... но на нём видно то, что я хотел показать. Разве что полёта на нём не запечатлено, но возможность данного деяния и так понятна. Я проверял в общем)
<iframe width="720" height="405" src="//rutube.ru/play/embed/7682091" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowfullscreen></iframe>
Комментарии
  • 0Forest_Swamp | 5 мая 2015 г.
    У каждого движка есть свои косяки и по поводу каждого из них можно метать камни в разработчиков. Они не виноваты в том, что чужой движок плохо проработан. С их стороны подача геймплея и атмосферы, а технические проблемы касаются программистов-создателей. Вопросы к ним в первую очередь.

    "потому что вы ударили его в шею" - ударили его под углом (angle). По видео видно, что он стоял боком. Да, ты целился ближе к задней части головы, но это все же боковой удар. К тому же, если прям детально разглядывать каждый кадр, то можно даже предположить, что ты попал ему в плечо, а не в голову. То, что прицел четко на голове не значит, что луч от ствола пушки попадает также на голову. Фишку со стрельбой четко по прицелу я видел только в Warframe, где можно по-читерски выносить врагов просто встав за стенку и стреляя по прицелу, и пофиг на то, что ты видишь, как персонаж стреляет в стену. Это плохо и не реалистично.
    • 0Usernm | 5 мая 2015 г.
      Насчет стрельбы ровно по точке где находится прицел, такой фигни много где хватает. Помню в Fallen earth это портило впечатление. Еще несколько проектов было, где я возмущался по этому поводу, но названий сразу не упомню.
      • 0LotusBlade | 5 мая 2015 г.
        В онлайн шутерах забавная проблема: после нажатия на спусковой курок пуля по-любому достигает цели, если та была прямо в точке прицела. Ты щёлкаешь мышкой после точного наведения, и враг уже не увернётся. Даже если он забежит за стену, или спустится вниз под землю, или прикроется кем-то живым — урона не избежать, потому что используется примитивный триггер. Всегда этому удивляюсь. То есть физически пуль не существует: нам рисуют анимацию отдачи оружия, графический эффект огня/дыма при выстреле и кровь на теле противника — но не сами пули. А даже если пуля и прорисована (ну, дробь, к примеру), то это просто летающая текстурка, без геометрического тела.

        Смешнее всего, когда присутствует диссинхрон звука и выстрела: звука ещё не было, ты увидев врага спрятался за угол, но тот успел нажать выстрел когда ты ещё чуть-чуть был виден. Потом ты слышишь бум, и магическим образом дохнешь за стеной.
        • 0Usernm | 5 мая 2015 г.
          Потому что симулировать пули как геометрические объекты дорого с точки зрения ресурсов сервера, пересылать их координаты по сети еще дороже (не уверен что вообще хоть кто-то это делает). В итоге имеем ворох проблем. Вот например из последнего вспоминается 7 days to die. На определенной дальности стены на клиенте не прорисовываются из экономии ресурсов. При этом снайперская винтовка вполне стреляет дальше чем это расстояние. В итоге можно в сетевой игре найти такую точку, где ты будешь видеть игрока бегающего в воздухе (на самом деле в своей постройке), и спокойно щелкунть его через любое количество стен.
        • 0BlinkRaven | 5 мая 2015 г.
          Да весь Call of Duty и Battleield на этом построены, там пульт как таковых тоже не существует, и рассинхрон часто настолько печален, что уныние от мультиплеера накатывается после первых 5 минут игры.
        • 0SAXAHOID | 5 мая 2015 г.
          А чего вы хотели?
          В сетевом мультиплеере существует такая штука как "пинг", и пинг бывает разный.
          Скажем, у одного игрока он 15 мс (у меня до гугла такой), а у другого 150.
          "Реальная" скорость пули — от 300 до 1000 м/с в зависимости от пушки.
          Игровые расстояния, на которых производится стрельба (поправьте, если ошибаюсь) редко когда выше 100 м. Т.е. чтобы это расстояние преодолеть, пуле нужно всего от 300 до 100 мс. Возьмём для расчёта 200.

          Теперь имеем картину: игрок-150 стреляет из винтовки в игрока-15, который собирается куда-то бежать на расстоянии 100 м от него.
          0 мс: Игрок-15 стоит в точке А, игрок-150 кликает.
          7.5 мс: Игрок-15 успевает связаться с сервером и сервер засекает, что он начал бег.
          15 мс: Игрок-15 "узнает" от сервера, что сместился, и одновременно докладывает ему, что двигается дальше.
          ...
          75 мс: Игрок-150 успевает связаться с сервером и доложить, что кликнул. Сервер делает выстрел и сообщает об этом игроку-15
          82.5 мс: Игроку-15 приходит сообщение о выпущенной пуле, но он, конечно, сам об этом не знает (только клиент).
          ...
          150 мс: Игроку-150 от сервера приходит информация, что тот знает о клике, и новая картина поля боя (т.е. новое положение игрока-15).
          ...
          282.5 мс: Пуля достигает точки, где стоял в моменте 0 мс игрок-15. Но игрока-15 там уже нет, он успел отбежать!
          И что делать? Варианта два: либо считать, что игрок-15 всё ещё там, и убить его, либо сказать, что его там уже нет.
          Первый вариант нечестен для игрока-15, второй — для игрока-150 (который вообще никак не мог предположить, что первый начнёт двигаться/остановится, т.к. у него просто пинг слишком большой, чтобы это можно было организовать реалистично).

          Используют третий вариант: "договариваются", будто пуля достигает цели мгновенно. В таком случае проблема пинга минимизируется (пуля достигнет цели не в 282.5, а в 75 мс, что уже не так критично). Совсем её, к сожалению, исключить невозможно.

          Правда, "забежать за стену" такое не должно позволять — тут уже да, проблемы конкретной реализации.

          Наверняка я ошибаюсь, просветите, если что.
          • 0Pache | 5 мая 2015 г.
            Я не знаю точно, как дело обстоит в UE3/4, однако в большинстве игр огнестрел всех видов работает по системе hitscan, то есть пули как таковой нет - просто происходит проверка, во что там целил игрок. Это как раз исходит из того, что возякаться с обработкой полёта пули бестолку, когда бой идёт на мелких расстояниях.
            • 0SAXAHOID | 5 мая 2015 г.
              Ну вот я и пытаюсь пояснить, почему так делают, на примере пинга
            • 0Usernm | 5 мая 2015 г.
              Кстати вот поэтому у армы есть свои поклонники, там насколько я знаю пули адекватно обсчитываются.
          • 0Usernm | 5 мая 2015 г.
            Было бы желание - можно было бы просчитывать все это на сервере, как world of tanks делает например. Там есть понятие серверный прицел и он отличается от клиентского. Вопрос в балансе между реалистичностью и ресурсами.

            Ну и да, обсчет на сервере обычно ведет к второму варианту и в общем-то это правильно. Плохой пинг должен быть проблемой только для того, у кого он плохой, а не для всех на сервере.

            С точки зрения сервера:
            0 мс - один выстрелил, другой начал движение.
            7.5 мс - фактическое начало движения.
            75 мс - фактический выстрел
            275 мс - фактическое время просчета коллизии. Тут главный вопрос насколько далеко переместился игрок, ушел он с траектории полета пули или нет. А если не ушел, возможно попали в руку, а не в тело и урон другой, ага.

            А когда там обратные ответы до клиента доходят, на самом деле серверу пофиг. Клиент должен корректировать свое состояние относительно сервера.

            Кстати насчет пинга. Есть игрушки на тренировку реакции. Условно горит зеленый кружочек, когда загорается красный - нужно нажать кнопку. Так вот у меня задержка реакции примерно 250-400 мс. Я не самый быстрый по реакции парень, но в целом вряд ли получится сделать этот пинг меньше 100 мс, а ты рассказываешь что 75 мс это неприятно а 300 мс критично.
            • 0SAXAHOID | 5 мая 2015 г.
              У меня задержка 28 была когда-то в такой игре.
              Но разговор не о реакции.
              Я не говорю, что игрок-15 осознанно увернётся от пули. Он может просто начать двигаться в промежутке времени между апдейтами для игрока-150 и до прилёта пули.
              Или ты про "просчитать"? Ну это уже, скорее, технический вопрос. Как игрок-15 будет перемещаться с точки зрения игрока-150? Краткими телепортациями или плавно?
              А разницы на самом деле нет, т.к. даже если плавно — это просто клиент дорисовывает. По такой "дорисовке" предсказать-оценить движения куда сложнее, чем если это идёт в реальном времени или хотя бы с пингом на уровне частоты обновления экрана. По моему мнению, простите, в шутеры сетевые не играю
    • 0dred1792 | 5 мая 2015 г.
      Когда ИИ в игре говорит, мол, "Ты нашёл шокер, используй его для обезвреживания противников, но целься строго в затылок".
      Нигде не оговаривается, что бить током сбоку нельзя. Хотя да, возможно этой мой "косяк")
      Но всё же, шокером вплотную почти бьёшь ведь, и целился я в заднею часть головы, мне это показалось странным.

      Я думал он про шею говорит)
  • 0Arhangel_heart | 5 мая 2015 г.
    В Source вроде как тот же баг.
  • 0Usernm | 5 мая 2015 г.
    Что-то мне подсказывает что полеты - фишка движка по-умолчанию. То есть у нас есть 2 объекта, один находится в другом. Думаю коллайдер просто берет центры масс этих объектов и рисует векторы в противоположных направлениях. А ускорение предметов скорей всего считается от времени работы коллайдера (сколько фреймов объекты были пересечены), чем больше - тем больше скорость на выходе.

    Касаемо полетов что выходит: У нас есть некий объект символизирующий игрока и предмет в руках, который является вторым объектом, причем привязанным к первому на жестком расстоянии. Осталось заставить коллайдер сработать - и полетели.

    Разработчики в общем-то могут и до коллайдера добраться и поведение его немного поменять, хотя бы конкретно для взаимодействие с болванчиком игрока. Ну или более простое решение, которое не отменяет полетов - сделать нарастающую от времени шумность при срабатывании коллайдера с игроком. Взлетел на время большее, чем случайное срабатывание - весь уровень сагрил и привет. Разработчики не стали заморачиваться просто.

    Насчет предмета которым ткнули солдата - опять же разработчики поленились, нужно было событие шума и агра на такое взаимодействие повесить.

    Про прыжки - опять не провесили событие. Если они считают что прыгать в их игре не нужно - могли бы сделать это достаточно громким делом с большой зоной агра. Но видимо их устраивает эта возможность.
    • 0dred1792 | 5 мая 2015 г.
      Обычный прыжок, да что там, даже просто ходить очень шумно. Тебя могут услышать на достаточно приличном расстоянии из-за 1-го неосторожного шага.