Czy istnieje interfejs API Lua współpracujący z C # na PC i XBox 360 Development? [Zamknięte]

18

Czytam książkę o tworzeniu gier, w której pokazują, jak tworzyć skrypty do gry w Lua. Programują Luę i używają jej z C ++, ale zastanawiałem się, czy istnieje biblioteka lub API do używania Lua z C #: konkretnie z XNA do tworzenia gier na PC i XBox 360?

alFador
źródło
5
Rodzaj małego nitpick, ale to Lua (nazwa), a nie LUA (akronim, to lub
krzyczysz
Ze strony Lua „About”: „Lua służy do rozszerzania programów napisanych nie tylko w C i C ++, ale także w ... C # ...”. Pierwszym wynikiem Google dla „lua in C #” był interesujący artykuł GameDev.net ( gamedev.net/reference/articles/article2275.asp ) zatytułowany Korzystanie z Lua z C #.
reverbb 14.12.10 o
Wiele deweloperów .net używa do pisania skryptów ironpython lub ironruby.
Zgrane

Odpowiedzi:

6

Wskazałbym to (http://www.xnua.com/xna_lua_xnua), ale nie był aktualizowany przez długi czas.

C # jest świetnym językiem i może w pewnym sensie być używany jako język skryptowy w twojej grze c #. Nick Gravelyn stworzył kilka ciekawych samouczków na temat silnika kafelkowego (http://blog.nickgravelyn.com/downloads/#tileengine) i użył niestandardowego silnika skryptowego do uruchomienia okna dialogowego. Ma również podstawowy przykład, gdy dowiedział się o słowie kluczowym „plon”: http://blog.nickgravelyn.com/2010/02/the-magic-of-yield/

ElementCy
źródło
3
Kilka dobrych punktów tutaj. Jedną z rzeczy do przemyślenia jest to, dlaczego chcesz język skryptowy, gdy gra jest napisana w języku c #? Silniki C ++ mogą zyskać dużo zwinności dzięki używaniu języka skryptowego, ponieważ C ++ zwykle zajmuje dużo czasu. Pod tym względem C # jest szybki. Jeśli z jakiegoś powodu chcesz skompilować skrypty w czasie wykonywania, zawsze możesz użyć CodeDom (lub innych metod generowania kodu) do skompilowania pliku CS w czasie ładowania, ale działałoby to tylko na PC. Rozdział na ten temat znajduje się w książce „Game Engine Toolset Development”
Cubed2D
^^ Opracowanie zestawu narzędzi do gier silnikowych to fajna książka :). Teraz jest trochę przestarzały, ale koncepcje są nadal solidne. Problem z powiązaniami języka skryptowego .NET polega na tym, że aby można je było uruchomić na Xbox 360, trzeba je interpretować. Bez System.Reflection.Emit nie można wiele zrobić w zakresie generowania kodu. Miałem wrażenie, że te możliwości pojawią się na Xbox 360 w najbliższej przyszłości, ale w oparciu o dyskusję na komentarzach w mojej odpowiedzi poniżej, prawdopodobnie tak nie jest. Dlatego wydajność skryptu na Xbox 360 prawdopodobnie nie będzie tak świetna :(.
Mike Strobel
@ Cubed2D: Lua jest rodzajem branżowego standardu dla gier skryptowych, a dla nieprofesjonalnego programisty jest to łatwiejsze do zrozumienia.
RCIX
@Tak jak masz prawo, może kompilować lub generować kod na 360. Gdybym zamierzał to zaimplementować, po prostu nie obsługiwałbym skryptów c # na 360, i miałbym to jako funkcję zestawu narzędzi na PC. Po prostu popraw projekt vs, aby uwzględnić folder skryptów w kompilacji 360 i zignoruj ​​na komputerze PC. @RCIX tylko dlatego, że wszyscy to robią, nie znaczy, że powinieneś. Jeśli chcesz użyć Xna, będzie to więcej kłopotów niż wartości. Są lepsze sposoby na ujawnienie parametrów, które można modyfikować, dla nieprogramujących w świecie .net próbujących zaimplementować lua (co zakładam, że masz do czynienia z komentarzem nieprogrupowskim)
Cubed2D
@ Cubed2D: To dobra uwaga, ale tak naprawdę zależy od platformy docelowej. jeśli piszesz tylko na PC, możesz użyć LuaInterface i natywnej biblioteki dll lua i nie musisz pisać implementacji. Poza tym, chodzi o to, że ponieważ ma takie obserwacje w świecie tworzenia gier, ma naturalnie rozwinięte funkcje, które sprawiają, że jest dobra dla tego środowiska. Co więcej, zacząłem programować od Lua i założę się, że wiele osób to zrobiło, więc zrozumiałe jest, dlaczego ludzie chcą z niego korzystać.
RCIX
2

Jeśli szukasz skryptów w C #, zdecydowanie spójrz na IronPython . To nie jest po prostu API Pythona dla C #, to w rzeczywistości całkowicie oddzielna implementacja Pythona, która kompiluje się do tego samego zestawu CLR (z tą samą wydajnością) co C #, ale może być interfejsowana jako język skryptowy. Każde opakowanie Lua dla C # byłoby znacznie wolne ze względu na obciążenie Marshalling.

Sean Edwards
źródło
2

Jak powiedział Sean, warto spojrzeć na IronPython. IronPython jest w rzeczywistości jedną z niewielu dynamicznych implementacji językowych dla platformy .NET ukierunkowanych na Dynamic Language Runtime (DLR). Istnieje co najmniej jeden projekt open source mający na celu wdrożenie Lua na DLR (jak ten ), ale nie jestem pewien, czy są jakieś implementacje w trakcie realizacji. Dobrze zaimplementowany zestaw powiązań DLR dla Lua powinien zapewniać wydajność na równi z IronPython i IronRuby i byłby znacznie szybszy niż opakowanie Lua. Dla porównania IronPython ogólnie działa lepiej niż CPython (czasami znacznie lepiej).

Uwaga: Jako ElementCy stwierdza poniżej, języków DLR nie są zazwyczaj obsługiwane na Xbox 360. Jednak nie jest „interpretować tryb” w DLR. Nie wiem wystarczająco dużo, aby to powiedzieć, ale może być możliwe, aby IronPython (lub inne implementacje języka DLR) działał na Xbox 360 w trybie interpretowanym, choć wydajność na pewno ucierpiałaby. Może warto zapytać kogoś z zespołu DLR, czy wie, że to możliwe. Jeśli nie, Xbox 360 powinien otrzymać wsparcie Reflection.Emit w ramach nadchodzącej obsługi Silverlight. Jeśli i kiedy tak się stanie, wyobrażam sobie, że uruchomienie DLR i uruchomienie na Xbox 360 nie będzie problemem.

Mike Strobel
źródło
4
Jedyny problem z IronPython, nie będzie działał na xbox360. Jest dobrze, jeśli chcesz używać go tylko na PC. IronPyton używa System.Reflection.Emit dużo, a to nie jest dostępne w .NET Framework na Xbox.
ElementCy,
To bardzo dobra uwaga. Zaktualizowano
Mike Strobel
2
Nie sądzę, że xbox dostaje Reflection.Emituj w najbliższym czasie, ponieważ winPhone ma zarówno XNA, jak i Silverlight i nie obsługuje tej przestrzeni nazw
Cubed2D
1
Możesz mieć racje. WP7 tak naprawdę nie obsługuje Silverlight, ale „Silverlight Mobile Compact Framework”, który jest oparty na .NET CF zamiast .NET. Wierzę, że Xbox 360 działa również .NET CF zamiast pełnego .NET Framework, więc prawdopodobnie skończy się na podobnej implementacji jak WP7. No cóż.
Mike Strobel,
2

Najlepszym rozwiązaniem, jakie mogę ci dać, jest po prostu skrypt w C #. Możesz je skompilować w czasie wykonywania, gdy celujesz w okna i skompilujesz je wcześniej dla Xboksa. (jako dll)

To byłoby najłatwiejsze rozwiązanie. Możesz to również zrobić w VB.NET lub dowolnym języku .NET. (nie jestem pewien co do skryptów) Zasadniczo mówię, aby mieć twoje skrypty we własnej bibliotece DLL. Możesz je skompilować w czasie wykonywania w systemie Windows. (czy naprawdę chcesz, aby robili to na Xbox 360 ?, nie możesz tam aktualizować swoich gier, przynajmniej nie sądzę)

Rozumiem twoją frustrację, chciałem też użyć Lui.

Podsumowując: 1) Zbuduj go w środowisku uruchomieniowym w systemie Windows 2) Zbuduj go wcześniej na Xbox 360

Właśnie to polecam.

Michael Coleman
źródło
1
  1. Interpreter Lua jest niezarządzany, AFAIK, więc nie można go uruchomić na Xboksie na Xboksie

  2. Możesz użyć interpretera JavaScript o nazwie Jint, który nie opiera się na DLR i działa na Xbox ( http://jint.codeplex.com/ )

wizzard0
źródło
Powiedziałbym, że pierwszy punkt jest nieprawdziwy, ponieważ jest tutaj kilka linków, które mają Lua <-> C #.
Kaczka komunistyczna
Możesz zarządzać kodem zarządzanym tylko na konsoli Xbox. Most Lua <-> C # jest niezarządzanym kodem pozwalającym na wywołanie Lua z kodu zarządzanego; dopóki MS nie umieści go w XNA lub Xbox 360 OS, nie można go tam uruchomić.
0

Technicznie nie odpowiada na twoje pytanie (nie działa na Xboksie ), ale LuaInterface pozwala stosunkowo bezboleśnie integrować Lua z C #.

RCIX
źródło
0

Aby zaktualizować to pytanie, spędziłem ostatni dzień na obszernym wyszukiwaniu i odkryłem, że użycie UniLua (stworzonego do użytku z jednością, czystą implementacją C #) jest najlepszą i najskuteczniejszą opcją uzyskania Lua na Xbox. Rozebrałem go, wyjąłem cały materiał Jedności i działa świetnie.

Dodałem także pewne funkcje znalezione w LuaInterface, przeciążając operatora [] dla LuaState i tym podobne.

CFWLua

Mam nadzieję, że to się przydało.

Bradley Galloway
źródło