Наскільки сильно повинен одноігровий движок відхиляти недійсні дані?


11

У грі для одного гравця, намагаючись створити сутність із компонентів, визначених у зовнішніх сценаріях, що, на вашу думку, є більш бажаним, коли один із компонентів буде неправильно сформований:

  • Чи повинен двигун пропустити цей компонент і дозволити суб'єкту жити в ігровому світі лише з добре написаними компонентами?
  • Або він взагалі не повинен додавати сутність у світ, якщо одна із складових непрацює?

Зауважте, я не говорю про реєстрацію помилок - які повинні бути зрозумілі - лише про те, що має статися з сутністю.


Ми говоримо про однокористувацького чи багатокористувацького?
o0 '.

@Lohoris Один гравець.
Пол Манта

2
Як більшість відповідей уже наводили на думку, хто ваша аудиторія? Ви робите модифіковану гру чи ви говорите про цілі внутрішнього розвитку?
Тетрад

@Tetrad Я хотів би, щоб гра була максимально зручною для мод.
Пол Манта

Відповіді:


11

Якщо ви говорите про змінну гру, то, можливо, ви захочете виконати одну з ваших пропозицій вище. Але якщо ви стурбовані перекочуванням власних помилок, я б сказав, не робіть цього. Я став прихильником Fail-Fast . Якщо це помилка, яку ви створили і яку потрібно усунути перед випуском, ви повинні зробити помилку очевидною. Стаття, з якою посилається внизу сторінки вікі, добре читається з цього приводу з тим, чому невдача швидка - це добре, а коли слід і не слід використовувати.


2
Я думаю, що це чудова дихотомія, яка розрізняє помилки користувача та помилки розробника. Має сенс з тієї самої причини, що помилки компілятора, як правило, досить легко виправити, але помилки виконання / семантичні помилки - це чорт.
поштовх

Якщо двигун включає спосіб зміни сутності після запуску гри, ви повинні принаймні дати собі можливість виправити помилку, перш ніж вийти з ладу.
Блекі

7

Відмінність між користувачем та розробником не завжди зрозуміла в розробці гри. Стандартні методи програмування на кшталт "невдалого виходу з ладу" не завжди є вигідними, тим більше що зростають розміри команди.

Наприклад, можливо, ваш технічний художник накрутив шейдер для контуру націлювання - зламав запасний варіант, скажімо так, що це завантаження лише в системах SM4, і він цього не помітив, оскільки у нього є вершина лінійної системи. Це призводить до того, що деякі анімації не завантажуються. Ці анімації посилаються на певне заклинання, яке написав ваш бойовий конструктор. Нарешті, ваш дизайнер рівня намагається встановити нерести на місце, і всі нерести, можливо, можуть віддати це заклинання - але тепер вона не може розмістити жодного з них у світі, оскільки їх заклинання не дійсні, оскільки ефекти не є Неправильно, оскільки шейдери не завантажуватимуться, оскільки дизайнери завжди мають найгірші комп’ютери.

Тож ваша демонстрація не готова до 2:00, і ваші інвестори задаються питанням, чому ви навіть не можете отримати єдиного ворога в грі, і ваш проект закривається.

Або ви вибираєте варіант, коли ви реєструєте невдачу, але продовжуєте намагатися, і гра грає чудово, за винятком того, що деякі заклинання ворогів не з'являються - але інвестори не знають, як вони повинні виглядати в будь-якому випадку, тому вони не повідомлення.

З цієї причини я майже завжди виступаю за перший варіант - породжуйте стільки сутності, скільки можете. Є випадки невдачі - наприклад, якщо дані ніколи не слід редагувати, за винятком людей, здатних займатися побудовою (наприклад, програмістів і технічних виробників) і завжди перевіряються на 100% при навантаженні, або якщо ви абсолютно впевнені, що відповідальність за це проблема полягає в особі, яка користується редактором, - але це не звичайні випадки, і вони вимагають великої кількості технічної інфраструктури, в яку ви, можливо, не готові інвестувати.


1
Я хотів би подумати, що запропонований вами сценарій можна запобігти за допомогою хороших систем управління джерелами. У вашому сценарії художник "зламав збірку". Усі, хто працює зі зламаним шейдером, повинні мати можливість повернути шейдер до попередньої версії, поки проблема не буде вирішена.
Джон Макдональд

1
@John Хоча хороший контроль над джерелами є необхідним, а іноді необхідний відкат, щоб відновити решту проекту в робочому стані до тих пір, поки відмова не буде вирішена локально, це рідко корисно як механізм запобігання, і на нього не можна покладатися як на таке .

@John: На великих проектах будівництво може зайняти години (або цілий день). Тож вам насправді потрібен двосторонній підхід - вам потрібно не просто управління джерелом, а двійковий контроль, щоб непрограміст міг повернутися до всіх попередніх збірок. Але, звичайно, це має свої ризики та витрати, адже зараз ви розробляєте новий контент проти іншого застарілого контенту, з виконуваними файлами, які можуть мати інші погані помилки. І навіть пошук потрібної конструкції для відкочування може зайняти 30+ хвилин - якщо ваші дизайнери повинні зупинитися на півгодини і поспілкуватися з складаннями, це витрачаються великі гроші.

@Joe Wreschnig: Це має сенс. Тому я думаю, що має бути момент, коли швидкий збій - це вже не актив. Або у типах людей, які його використовують, або в проектах певного розміру. Я думаю, що люди в команді повинні вирішити, що для них працює.
Джон Макдональд,

2
Я не впевнений, що швидкий важкий збій - це справді питання, що коли-небудь є надбанням. Навіть для однієї особи "команди", можливо, я не хочу мати справу з шейдером коду, тому що я дійсно повинен досягти цього рівня. Звичайно написати хорошу обробку помилок і реєструвати всі помилки, але я майже завжди мають краще уявлення про те, що важливо прямо зараз прямо зараз , ніж я зробив , коли я писав код помилки шість місяців тому.

1

Користувач повинен мати можливість попереднього перегляду об'єкта, який він імпортує, і заздалегідь знати, чи є помилки.

Вам слід якось вирішити, які помилки повинні бути фатальними, не дозволяючи їх додавати в гру, а які можна відхиляти як попередження .

Звичайно, якщо імпортне підприємство з якихось причин може якось безповоротно змінити дані збереженої гри, вам краще буде потрібно, щоб вони були бездоганними.


0

Я б припустив, що при розробці не слід шуміти щодо недійсних даних. тобто записувати все десь воно буде прочитане. Однак якщо ваш двигун може проігнорувати це і продовжити, він повинен це зробити. Ви можете мати таку логіку

void setValue(int value) {
    if (value < MIN_VALUE) {
       log(value + " is too low, using " + MIN_VALUE);
       value = MIN_VALUE;
    }
    if (value > MAX_VALUE) {
       log(value + " is too high, using " + MAX_VALUE);
       value = MAX_VALUE;
    }
}

Навіть у грі для багатьох гравців це прийнятно, якщо ви не припускаєте, що один гравець намагається обдурити систему.

Після випуску програмного забезпечення ви, ймовірно, захочете вимкнути цей журнал за замовчуванням, якщо припущення, що гравці не збираються читати ці журнали.


Припускаючи, що в журналах не виникає проблем з продуктивністю, вам слід продовжувати входити в версії версій і надсилати звіти назад команді розробників. (Звісно, ​​інформування гравців, звичайно.)

Ви повинні мати можливість записувати більш стислі журнали для випуску. У розвитку ти можеш бути більш багатослівним.
Пітер Лорі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.