Добавление сценариев функциональности к приложениям.NET

У меня есть немного игры, записанной в C#. Это использует базу данных в качестве бэкенда. Это - торговая карточная игра, и я хотел реализовать функцию карт как сценарий.

То, что я имею в виду, - то, что у меня по существу есть интерфейс, ICard, который реализует класс карты (public class Card056: ICard) и который содержит функцию, которая вызвана игрой.

Теперь, для создания вещи maintainable/moddable я хотел бы иметь класс для каждой карты как исходный код в базе данных и по существу скомпилировать его на первом использовании. Таким образом, когда я должен добавить/изменить карту, я просто добавлю его к базе данных и скажу моему приложению обновляться, не нуждаясь ни в каком развертывании блока (тем более, что мы говорили бы приблизительно 1 блок на карту, что означает сотни блоков).

Это возможно? Зарегистрируйте класс от исходного файла и затем инстанцируйте его и т.д.

ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);

Язык является C#, но дополнительная премия, если возможно записать сценарий на каком-либо языке.NET.

72
задан Ijas Ameenudeen 20 January 2019 в 13:47
поделиться

7 ответов

решением для Сценария Oleg Shilo C# (в Проекте Кода) действительно является большое введение в обеспечение способностей к сценарию в Вашем приложении.

другой подход А должен был бы рассмотреть язык, который конкретно создается для сценариев, такой как IronRuby, IronPython, или Lua.

IronPython и IronRuby оба доступны сегодня.

Для руководства по встраиванию IronPython читает , Как встроить поддержку сценария IronPython в Ваше существующее приложение на 10 легких шагах .

, Lua является языком сценариев, наиболее часто используемым в играх. Существует компилятор Lua для.NET, доступной от CodePlex - http://www.codeplex.com/Nua

, Что кодовая база является большим чтением, если Вы хотите узнать о создании компилятора в.NET.

А различный угол в целом должен попробовать PowerShell. Существуют многочисленные примеры встраивания PowerShell в приложение - вот полный проект по теме: Туннель Powershell

40
ответ дан Eduardo Molteni 24 November 2019 в 12:45
поделиться

Если Вы не хотите использовать ДОЛЛАР, Вы можете Шиканье использования (который имеет интерпретатор) , или Вы могли рассмотреть Script.NET (S#) проект на CodePlex. С решением для Шиканья можно выбрать между скомпилированными сценариями или использованием интерпретатора, и Шиканье делает хороший язык сценариев, имеет гибкий синтаксис и расширяемый язык через его открытую архитектуру компилятора. Script.NET выглядит хорошим слишком, тем не менее, и Вы могли легко расширить тот язык, а также проект с открытым исходным кодом и используете очень дружественный Генератор Компилятора ( Irony.net ).

6
ответ дан Nathan 24 November 2019 в 12:45
поделиться

Вы могли бы быть в состоянии использовать IronRuby для этого.

Иначе я предложил бы, чтобы у Вас был каталог, куда Вы помещаете предварительно скомпилированные блоки. Тогда Вы могли иметь ссылку в DB к блоку и классу, и использовать отражение для загрузки правильных сборок во времени выполнения.

, Если Вы действительно хотите скомпилировать во времени выполнения, Вы могли бы использовать CodeDOM, тогда Вы могли использовать отражение для загрузки динамического блока. статья документации Microsoft, которая могла бы помочь .

7
ответ дан Elanis 24 November 2019 в 12:45
поделиться

Я предложил бы использовать LuaInterface, поскольку он полностью реализовал Lua, где кажется, что Nua не завершен, и вероятный не реализует некоторую очень полезную функциональность (сопрограммы, и т.д.).

, Если бы Вы хотите использовать некоторые внешние предварительно упакованные модули Lua, я предложил бы использовать что-то вроде 1.5.x в противоположность 2.x ряд, который создает полностью управляемый код и не может представить необходимый API C.

5
ответ дан harningt 24 November 2019 в 12:45
поделиться

Вы могли использовать любой из языков ДОЛЛАРА, которые позволяют действительно легко хост Ваша собственная платформа сценариев. Однако Вы не должны использовать язык сценариев для этого. Вы могли использовать C# и скомпилировать его с поставщиком кода C#. Пока Вы загружаете его в его собственном AppDomain, можно загрузить и разгрузить его к содержанию основы.

5
ответ дан Jesse Ezell 24 November 2019 в 12:45
поделиться

Главное приложение, которое продает мое подразделение, делает что-то очень похожее для обеспечения клиентского удовлетворения требованиям заказчика (что означает, что я не могу отправить источник). У нас есть приложение C#, которое загружает динамические сценарии VB.NET (хотя любой язык.NET мог легко поддерживаться - VB был выбран, потому что команда удовлетворения требованиям заказчика произошла из среды ASP).

Используя CodeDom.NET мы компилируем сценарии от базы данных, с помощью VB CodeDomProvider (раздражающе, это принимает значение по умолчанию к.NET 2, если Вы хотите поддерживать 3,5 функции, необходимо передать словарь с "CompilerVersion" = "v3.5" его конструктору). Используйте CodeDomProvider.CompileAssemblyFromSource метод для компиляции его (можно передать настройки, чтобы вынудить его скомпилировать в памяти только.

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

4
ответ дан Peter Mortensen 24 November 2019 в 12:45
поделиться

Да, я думал об этом, но я скоро выяснил, что другой Предметно-ориентированный язык (DSL) будет немного слишком много.

По существу, они должны взаимодействовать с моим gamestate возможно непредсказуемыми способами. Например, карта могла иметь правило, "Когда это чешет, вводят игру, все Ваши немертвые фавориты получают +3 нападения на летающих врагов, кроме тех случаев, когда враг благословлен". Поскольку торговые карточные игры являются базирующимся поворотом, менеджер GameState запустит события OnStageX и позволит картам изменить другие карты или GameState любым способом потребности карты.

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

Вот почему я хотел остаться с "реальным" языком.NET, чтобы по существу быть в состоянии просто запустить событие и позволить карте управлять gamestate любым способом (в рамках безопасности доступа к коду).

4
ответ дан Peter Mortensen 24 November 2019 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: