Це залежить від того, як ви хочете спроектувати свою модову систему. Я вивчу два з них.
SDK
Швидше за все, вам потрібно буде, щоб ваші модери використовували ту саму мову, що і ви, і завантажуєте моди за допомогою відображення (або подібної, залежно від мови вибору). Це, очевидно, обмежить вас мовами, які можуть зробити пізнє зв’язування - і є багато хороших, хто може це зробити (навіть C може зробити пізнє зв’язування за допомогою хитрої LoadLibrary
хитрості). Ви навіть можете зробити деякі метамоддінги, де мод може розміщувати інші моди (наприклад, сценарії модів).
Перша проблема такого підходу - це приховування внутрішнього стану. Беручи до прикладу C #, моддер може просто використовувати відображення для доступу до приватних членів, C також може це зробити (хоча більше зусиль потрібно).
Друга проблема - хостинг. Люди не дуже люблять іноземний код, що працює в їхній системі, не маючи пісочної скриньки. Як найгірший сценарій, ви можете написати мод, який налаштовує насіннєву скриньку; якщо це було встановлено в Інтернет-провайдера, це може завдати серйозної шкоди їхній репутації.
Сценарій
Модери використовуватимуть таку мову, як Lua, для створення модів. Вам буде потрібна мова, яка могла б викликати нативний код (для взаємодії з Lua); або вам доведеться написати власну мову сценаріїв на вибраній вами мові.
Перша проблема тут полягає в тому, що більшість мов сценаріїв інтерпретуються, що може бути неприйнятним для систем реального часу (хоча, див. LuaJIT); наприклад, ігри.
За іронією долі друга проблема все ще існує; Взявши приклад Луа, я був дуже розчарований, що функція "обстрілу", включена в основну бібліотеку / за замовчуванням - робить її цілком марною як середовище з піском (без великих зусиль, удачі та обслуговування), важко зобразити, як я зливий на це, але я дуже сподіваюся, що вони випили якісь міцні коктейлі, коли включили ці антифункції . Очевидно, ви могли легко уникнути цього, якби прокатали свою власну мову (див. UnrealScript).
Нарешті, вартість взаємодії з двигуном сценаріїв може бути непомітною - знову ж таки, взяття Луа як приклад у поєднанні з C #: C # має значні накладні витрати при виклику власних функцій (через P / Invoke), а Lua - це досить «балакучий» API. Це може призвести до проблем, якщо спосіб розробки "сценарію SDK" вимагає багато спілкування між вашою основною мовою та вашою мовою сценаріїв (зауважте, що у C насправді немає цієї проблеми). Знову ж таки, ви можете ухилитися від цього, написавши свою власну мову сценаріїв (а у випадку, якщо C # компілює її в MSIL) та виконаєте її якнайшвидше у вашому [віртуальному] середовищі.
Оскільки сценарій, по суті, працює в абсолютно іншій системі до вашого основного коду, ви можете повністю контролювати доступ до внутрішнього стану (якщо тільки вони не виконують химерні речі з раніше згаданими функціями оболонки).
Висновок
Я трохи переглядав тему, однак те, що ви можете в основному зібрати з цієї стіни тексту, - це те, що ви повинні мати змогу зробити гнучку гру будь-якою мовою (я б ризикну сказати, що ви можете ) - але на деяких мовах може призвести до більшої роботи. Я трохи анальний щодо безпеки? Так, вам слід бути занадто, коли мова заходить про код користувача.