Какой подход я должен использовать для сценариев C # - PullRequest
6 голосов
/ 19 ноября 2011

Я пишу систему частиц. (для игры и редактора частиц) В этой системе есть модификаторы от 0 до n. Они модифицируют частицы в системе частиц каждый кадр.

Например, у вас может быть предопределенный модификатор под названием «GravityModifier», который выполняет только каждую частицу в каждом кадре: «частицы.Велочность.Y + = 9.81» или что-то в этом роде.

Теперь я хочу, чтобы пользователь мог писать дополнительные модификаторы во время выполнения (в редакторе). Я хотел бы иметь возможность просто использовать C # для этого. А поскольку системы частиц записываются в файлы JSON, пользовательские сценарии модификаторов следует записывать в файл в виде исходного кода (возможно, в кодировке base64).

-

Мой вопрос: Предположим, игра хочет загрузить такой системный файл частиц. Как мне скомпилировать пользовательские модификаторы в исполняемый код?

Еще одна очень важная вещь, на которую следует обратить внимание при ответе на этот вопрос: обратите внимание, что это будет система частиц для игры. Скомпилированный код будет вызываться более 3000 раз за каждый кадр. (в основном на скорости 60 кадров в секунду) Поэтому очень важно, чтобы скомпилированный код не выполнялся намного дольше, чем другие игровые функции. Было бы неплохо, чтобы скрипты-модификаторы были скомпилированы в делегаты в форме: делегат void ModifyParticle (ref Particle p);

Возможно ли это? Если да, то как?

Ответы [ 5 ]

6 голосов
/ 19 ноября 2011

Существует CTP компилятора 'Roslyn' C # в качестве служебного API , где вы можете выполнять код C #, определенный во время выполнения, такой как REPL и т. Д. Вот статья MSDN, охватывающая его
http://visualstudiomagazine.com/articles/2011/11/16/the-roslyn-scripting-api.aspx

Mono уже некоторое время имеет эту функциональность в своей библиотеке Mono.CSharp , так что ее можно использовать в качестве альтернативы.

5 голосов
/ 19 ноября 2011

Да,

Это возможно и довольно просто при использовании библиотеки CSScript .

2 голосов
/ 19 ноября 2011

Проверьте Roslyn , это грядущий (но все еще очень ранний бета-тест) предварительный просмотр функции компилятора как службы в C # в следующей .NET Framework.

0 голосов
/ 19 ноября 2011

Использование встроенного компилятора от Microsoft в .NET CSharpCodeProvider:

Как программно скомпилировать код с использованием компилятора C #:

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

http://support.microsoft.com/kb/304655

Просто скомпилируйте и загрузите двоичные файлы при запуске игры.

Дополнительные примеры того, как скомпилировать dll и загрузить / выполнить ее непосредственно, можно найти по адресу http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx и его контент, добавленный сообществом.

0 голосов
/ 19 ноября 2011

Как насчет Луа вместо этого?См. здесь Lua - фантастически простой язык сценариев, идеально подходящий для сценариев внутриигровых действий.Довольно много игр для iPhone используют Lua в Objective-C, и есть немало, которые используют Lua и через .Net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...