Ігровий движок: гідний спосіб, орієнтований на архітектуру, реалізувати підтримку сценаріїв?


17

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

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

І річ у тому, що я дуже хотів би, щоб сценарії впливали як на логіку гри (зміна параметрів одиниці тощо), так і на речі, пов'язані з переглядом гри, наприклад, спеціальні анімації / діалоги для битв, які можуть залежати від певний сценарій тригера.

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

Я думав про три варіанти:

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

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

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

Отже, я не можу ні визначитися з одним із них, ні придумати кращий спосіб вставити сценарій модуля ... Будь-які пропозиції чи корисні посилання?

Дякую!

Ps спасибі за перенесення питання, не знав, що є спеціалізований розділ для gamedev


Які проблеми у вас є, що введення мови сценаріїв вирішить?
чудовий

Відповіді:


3

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

Поєднайте це з викриттям об'єктів, що містять дані та API для доступу до потрібних компонентів логіки (я маю на увазі, що ви можете скриптувати знаходження AI Path, але оскільки це загальний фрагмент коду, який, ймовірно, буде використаний та повторно використаний, чому б ні вставити його в модуль і потім додати його до API, що піддається мові сценаріїв?). Це повинно дати вам доступність, а також чітко визначені місця, де відбуваються речі.

Знову я зазначаю це тим же твердженням, яке я завжди роблю. Готовий робочий продукт завжди цінніший, ніж хороша теорія програмування :)

Сподіваюся, це допомагає!


2

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

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

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

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

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

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


1

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


1

Lua - популярний вибір для мови сценаріїв загального призначення. Ви можете створити свою власну мову сценаріїв за допомогою Lex та Yacc (ознайомтеся зі статтею у Іграх з програмуванням Gems 3), але я б сказав, що більшість ваших потреб можна опікуватися Lua незалежно від того, великі вони чи маленькі.

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