7 ms·
Is there something like Unity out there but with JavaScript support? I know a bunch of JS game engines, but they all have no tooling.
by k__ 7y ago
Is there something like Unity out there but with JavaScript support?
I know a bunch of JS game engines, but they all have no tooling.
- heyitsguay 7y agoUnity has Javascript support, and can target WebGL for its builds.
- klodolph 7y agoDepends on what you mean by “JavaScript support”. Do you want to write code in JavaScript? That’s deprecated. Do you want to target WebGL? It works but it’s less than ideal. If you want to make a WebGL app, Unity would not be my choice. The tooling used to fall into the “that works, but it’s cursed” category, because it would compile the C# to CIL with Mono, then compile CIL to C++ with il2cpp, and the C++ to JS with Emscripten. I think. If you think this pipeline is “extremely cursed”, well, you’re not alone. If you want to make a browser game with tooling, there are some better options. Different options for 2D and 3D. You’re going to have to accept some kind of compromise and the ecosystem is a bit difficult to navigate.
- heyitsguay 7y agoWhoa, JavaScript support is deprecated? News to me! I always use C# anyway but still seems like a shame. And yeah, agreed, it's probably pretty clunky compared to what some WebGL-specific frameworks might give you. I don't know if anything out there has quite the UI setup or polish as Unity though. Do you know of any? Edit: Saw your edit. That sounds super cursed.
- klodolph 7y agoDeprecating JavaScript (UnityScript) is a good thing. Language bindings are a nightmare, and the more languages you support, the worse it gets. Consider that you might want to write a class in C++, wrap it in a C# interface, and then use it from UnityScript. Consider that if you write something for the asset store, the consumers may be using C# or JS. If you’re looking for something with good UI and polish, maybe GameMaker Studio fits the bill? I don’t keep tabs on this space. I use Unity when I’m collaborating with people, and use simpler frameworks when I’m working alone.
- DonHopkins 7y agoI totally agree that UnityScript and Boo were terrible ideas and executions that were cursed, and it's a great thing they're deprecated. JavaScript itself though is great. But the standard ways of integrating Unity and JavaScript in the WebGL back-end are extremely inefficient, terribly designed, and leave a lot to be desired. There are much more efficient ways of communicating by judicious use of P/Invoke and insight into how WebAssembly and the C# / Unity JavaScript runtime binding works, which I've studied and leveraged in UnityJS. See some of the links in the other message I posted about UnityJS that discuss the JavaScript/C# JSON messaging bridge I developed, which is based on P/Invoke instead of Unity's terrible "GameObject.SendMessage", and techniques for blitting images and raw arrays of typed numbers back and forth between Unity and JavaScript. The great thing about Unity that makes it worth all the effort of making up for its other weaknesses is its editor, and the ability to extend the editor with custom user interfaces, by widgets and editors in the object property sheets and 3d gadgets and objects in the world itself. The editor and its customizable UI facility is a common ground for artists and programmers to meet, that enables programmers to give artists a huge amount of power and flexibility, and artists to see and totally control what they're creating immediately and interactively. Here's a demo of Unity3D pie menus that shows and explains some custom editors, as well as in-world editing tools. (It's kind of old, so the demo requires the now-obsolete Unity browser plug-in, since it isn't compiled for WebGL.) https://www.youtube.com/watch?v=sMN1LQ7qx9g https://www.youtube.com/watch?v=sMN1LQ7qx9g I've made a general purpose pie menu component in C# for Unity3D, which supports text items, image items, and 3d object items too! I will make it available as free open source software on the Unity3D app store! Here's a silly demo, showing a set of SimCity pie menus: https://www.donhopkins.com/home/PieMenuDemo/PieMenuDemo.html https://www.donhopkins.com/home/PieMenuDemo/PieMenuDemo.html (If you don't have the Unity3D browser plug-in installed, it should show you a link to install it.) They have a full set of useful notifiers so you can tightly integrate them with your application to give rich feedback during tracking (for example, modifying the 3D menu items, or previewing the effect of the menu item and distance parameter in real time, making them more like "direct manipulation"). For example, to show how you can implement feedback like The Sims pie menus with the head in the center that looks at the selected item, I've made a 3d object in the pie menu center with the webcam texture on it, so YOUR head is in the center of the menu, looking at the selected item! (That's why the demo asks for permission to use the webcam.) The pie menu and each item has a title as well as a description. One feature I've added is the ability not only to disable an item, but also to provide an explanation of why the item is disabled! (PacMan in the demo is disabled, for example.) I wish other menus and widgets would do that -- it's frustrating when you can find an item you want, but can't figure out why it's disabled! Another nice thing about them is that you can either configure algorithmically with an API, or with JSON data (which makes it easy to make dynamic data driven menus downloaded from a server or database), or construct them in the Unity3D editor out of objects (which makes it easier for artists to design them)! I've made a custom Unity3D editor that lets you edit the properties, drag and drop textures and objects, edit and rearrange the items, and has some convenience commands, so you can place the 3D item objects in a circle in the 3D world, and call a command that figures out which item is in which direction by their position, and tidies them up. (That is much easier than arranging their order in a linear list of items.) I'm going to play around with more in-world editing features, to make them easier for artists to design them. Source code: https://www.donhopkins.com/home/PieMenuDemo/PieMenuDemo.zip https://www.donhopkins.com/home/PieMenuDemo/PieMenuDemo.zip
- chrisdirkis 7y agoIt was a javascript-like language called UnityScript, that actually compiled to IL, and had a lot of C#/CLR features tacked on top. It was fairly unused, and kinda cursed to boot. Unity also had another language called Boo, which was fake Python which also compiled to the CLR, and we're happy that's dead too. There's some packages like MoonSharp which will let you write Lua for Unity (modulo some bindings), and a few visual scripting tools too. There's also going to be a native visual scripting tool coming out in the next year or so.
- DonHopkins 7y agoOne important distinction is that C# and UnityScript and Boo are build-time compiled languages, not interpreted (or JITted) at runtime like JavaScript typically is. You can't dynamically download and interpret UnityScript code at runtime, or include it in downloadable asset packages. If you make any changes to your app, you have to release a new version of it, and convince users to upgrade, and you can't just push an update out over the web, like you can with JavaScript. This comes into play on the Apple app store. Even if you implemented, say, a Scheme interpreter in C# that could interpret s-expressions at runtime, Apple would not let you publish an iOS app on their app store that downloaded Scheme code and interpreted it. It's not impossible or hard to do, but it's simply against their rules. On Apple's app store, the ONLY language you're allowed to do that with is JavaScript, running in Apple's own Safari web browser's JavaScript engine. That is a hard non-technical constraint that there is no way of programming or negotiating your way out of, and it's not going to change any time soon. The old version of the iOS Safari component, UIWebView, runs in-process, and allows you to call back and forth with native code (it has a nice native Objective C bridge), but it did not have a JIT so it was slow. (Sandboxed iOS apps developed outside of Apple aren't allowed to write to code memory, so JIT compilers are prohibited.) https://steamclock.com/blog/2013/05/apple-objective-c-javascript-bridge/ https://steamclock.com/blog/2013/05/apple-objective-c-javasc... But the new iOS Safari component, WKWebView, runs in a separate process that Apple trusts, and it has the JIT enabled, so its JavaScript engine is extremely fast and robust, and fully compatible with most modern JavaScript libraries. But you can't call native code, because it's running in another process, and doesn't support an Objective C bridge. But you can send messages back and forth (tell it to execute JavaScript code, receive JSON or text messages back from JavaScript, but no directly passing pointers or calling functions). So instead of using a platform specific Objective C <=> JavaScript bridge like the one Apple deprecated, UnityJS has a cross platform C# <=> JavaScript bridge with a JSON protocol, so it works fine with WKWebKit, without breaking Apple's app store rules.
- Cpoll 7y agoPhaser might fit the bill.
- kerng 7y agoSwitching to C# is straight forward - for majority of projects you won't need many language specific features. Most operations are about increasing counters, performing if and switch scenarios, some event messaging, and doing math and state tracking. C# is quite a good choice for those things.
- DonHopkins 7y agoBut debugging C#, especially on mobile and WebGL platforms, is a horrible primitive retrograde nightmare. And it takes a long long time to recompile, with some projects taking a good slice of an hour to build. That not only slows down and locks up both Unity and your entire computer and spins up the cooling fan like a 747 taking off while it's compiling for so long, but it also wastes orders of magnitude more time than what everyone is used to from interactively reloading and debugging JavaScript code, and it totally destroys the flow of getting into the "groove" and iterating extremely quickly and interactively like you can do with web development. The whole point of UnityJS is to enable you to instantly reload your app and see your changes without recompiling, and use the modern high-quality off-the-shelf JavaScript debuggers built into every web browser to debug your WebGL apps live in a web browser, and your iOS and Android apps live while actually running on the device. And also to benefit from the gargantuan ecosystem of standard JavaScript libraries and the communities and companies that support them, instead of rolling your own half-assed bastard stepchild C# imitation libraries that require constant maintenance and quickly go out of date because nobody else uses them. There are many application domains, especially AR and VR and accelerometers and cameras, that are impossible to simulate in the Unity editor, and developing them requires quick turn-around and interactive debugging. That's where UnityJS really shines! Here's a demo of an earlier version of UnityJS integrated with ARKit on iOS for Pantomime: WovenAR Tools with ARKit and Pantomime https://vimeo.com/240612327 https://vimeo.com/240612327
- jayd16 7y ago>But debugging C#, especially on mobile and WebGL platforms, is a horrible primitive retrograde nightmare. And it takes a long long time to recompile, with some projects taking a good slice of an hour to build. A 2gig mobile game should take 20 minutes to build to device tops and that's all from asset compression anyway. Recompiling the code should take no more than a minute unless you're using a potato. The part of the compilation that actually eats your machine because its the only multithreaded part is the shader compilation, again not C#.
- gentleman11 7y agoThreejs has very little tooling, but it is a pleasure to work with if your project is simple. Babylonjs also looked promising Finally, old versions of unity had some js support. You could maybe track down one of them, but the support was removed eventually
- DonHopkins 7y agoThe "js support" called UnityScript in old versions of Unity is horrible. Avoid it like the plague. It's not actually JavaScript, just a thin wrapper around the Mono runtime. So instead of standard JavaScript array.push(obj), you have to use C# APIs like array.Add(obj). And there are all kinds of other incompatibilities too. It's totally incompatible with all known JavaScript tools and libraries, and definitely won't run the output of the TypeScript compiler. So you can be sure that code written for the browser will definitely not work, and don't even try to port JavaScript libraries to it. Not only that, but it's also a compiled language, so has none of the advantages of being able to reload instantly without recompiling for half an hour, or using the excellent JavaScript debuggers built into every web browser to debug and interacting with the code with the console in real time while it runs on the actual device. It's a very good thing that Unity took UnityScript out back behind the woodshed and shot it (along with "Boo", which was to Python as UnityScript was to JavaScript). It wasn't doing anyone any good, and it was a huge burden for Unity to maintain. People who already knew JavaScript but didn't want to learn C# were screwed because it wasn't really JavaScript so their knowledge didn't apply and their time learning it was wasted, and it prevented or delayed them from learning an excellent language like C#, which they should have done in the first place. C# has its place, but it's never going to be as quick to reload and run, and as easy to debug and use interactively, as JavaScript. Another enormous advantage to using off-the-shelf honest-for-goodness authentic JavaScript instead of almost-but-not-quite-entirely-unlike-JavaScript, is that you can easily use all the latest and greatest JavaScript libraries off-the-shelf without any modification. Then you can actually hire somebody who already knows how to use those libraries, too. A great example is SocketIO (but there are MANY other examples). You can just use the latest standard JavaScript library without modification, instead of desperately shopping around for an adequate C# imitation, finding it only runs on Windows, trying and failing to port it to Unity, finding three different attempts by other people to port or reimplement the same library in Unity that failed and aren't maintained or don't work in the current version of Unity or are incompatible with the WebGL/WebAssembly runtime, and finally spending the time to roll your own, which quickly goes obsolete because you're the only one supporting it. It's MUCH better to be able to simply drop in the latest version of SocketIO, or the Stripe API, or D3, or whatever you need, and go to town drawing all kinds of graphs and diagrams by copying and elaborating the great examples on observablehq.com, then use those html canvas images on Unity3D textures of 3D objects and user interface overlays, instead of foolishly trying to reimplement D3 in C#. UnityJS also makes it very convenient to develop hybrid wen apps that are partly Unity3D/WebAssembly/WebGL, but deeply integrated with HTML/JavaScript, so they can send structured messages and data back and forth (including bit-blitting images and buffers of numbers across instead of serializing/deserializing them), and do the text and user interface in HTML/CSS/SVC along side or in overlays, using Angular or React or whatever you like. Hybrid Unity/Web apps are useful, because Unity doesn't have a decent immediate mode 2D drawing API like canvas or D3, or a decent text/graphics layout engine like HTML/CSS/SVG. (I love TextMeshPro, but it just isn't capable of everything that's so easy to do in HTML, or able to leverage higher level HTML templating or formatting or graphics libraries, or even form inputs. And writing a Unity shader or constructing a dynamic 3D mesh to draw a pie chart is such a silly overkill, when you can do it so easily with canvas or D3.)
- TomGullen 7y agoOur tool Construct 3 runs in the browser, and has no programming required event blocks and Javascript support: https://www.construct.net/en https://www.construct.net/en Mix of events/Javascript in it's simplest form looks like: https://s1.construct.net/images/v777/refresh/features/learn-to-code.png https://s1.construct.net/images/v777/refresh/features/learn-... Documentation for Javascript in Construct 3 can be found here: https://www.construct.net/en/make-games/manuals/construct-3/scripting https://www.construct.net/en/make-games/manuals/construct-3/... We're doing special offers for education due to the pandemic: https://www.construct.net/en/education-support https://www.construct.net/en/education-support A key feature for schools is granting access to Construct 3's full features with access codes, meaning students do not need to proivde us with any login details/emails etc which is popular in educational institutes: https://www.construct.net/en/make-games/education/licensing https://www.construct.net/en/make-games/education/licensing
- k__ 7y agoPretty slick. I was a bit put off by the subscription model, but that includes a backend service for multiplayer games? Nice. What are the limits?
- TomGullen 7y agoMore information on the signalling server we provide can be found here: https://www.construct.net/en/make-games/manuals/construct-3/plugin-reference/multiplayer https://www.construct.net/en/make-games/manuals/construct-3/... We also have a build service for paid plans that allows for easy building of your games into deployable signed APKs. If the subscription is a deal breaker, a lot of users do use our free edition which has a 50 event limit if you use it logged in to a Construct.net account (and a few other limits).
- k__ 7y agoCool! Can I simply check-in a project into GitHub? Are there any special file-types (beside sounds and graphics) that would make this problematic? Can I use my favorite editor to write the code?
- mattigames 7y agoC# is not that different from JavaScript but maybe I'm biased, if you still want an easier way than using C# then I would recommend Unity plugins that let you create games without coding such as Playmaker[0] and Bolt[1], after getting comfortable using those they will be more ready to use C#. [0] https://assetstore.unity.com/packages/tools/visual-scripting/playmaker-368 https://assetstore.unity.com/packages/tools/visual-scripting... [1] https://assetstore.unity.com/packages/tools/visual-scripting/bolt-87491 https://assetstore.unity.com/packages/tools/visual-scripting...
- k__ 7y agoI'm simply have deep knowledge of JS and it's easy to use for me, so I prefer tools that support it. But thanks for the suggestions!
- mattigames 7y agoI also have deep knowledge of JS, from the time one had to make it work on Internet Explorer 6, and believe me C# is not that different, maybe if you want a smoother transition just learn a bit of TypeScript first, then C#. Which btw were both co-created by the same guy, Anders Hejlsberg.
- pjmlp 7y agoYes, the best engine in that regard is PlayCanvas, https://playcanvas.com/ https://playcanvas.com/
- westoncb 7y agoJust going to second this: PlayCanvas is the only top quality JS game engine I've come across that comes with a GUI editor for placing objects, lights, etc. I'm a big three.js fan, but if I was building something where I could get a lot of benefit from placing/configuring objects through a visual editor I'd definitely use PlayCanvas for it.
- DonHopkins 7y agoI've been developing UnityJS for scripting and integrating Unity3D with JavaScript, which works not only very well with the WebGL platform, but also on iOS, Android, and desktop. It's a work in progress, so it's low on tooling and documentation right now, but I've been using it successfully for quite some time for a lot of different things, and making a lot of progress towards modularizing it, documenting it, and making it easier for other people to use. Please contact me if you're interested! https://news.ycombinator.com/item?id=19804242 https://news.ycombinator.com/item?id=19804242 Email: don@donhopkins.com Goals: Developing and applying UnityJS, an open source Unity3D C#/JavaScript bridge for rapidly developing and deploying dynamically extensible cross platform Unity3D apps programmed in JavaScript, and efficiently integrating Unity3D with off-the-shelf and bespoke web technologies and services. Seeking to collaborate with people who can see and benefit from the obvious and subtle applications to rapid prototyping, exploratory iterative development, interactive debugging, live programming, deeply integrating web technologies and JSON with Unity3D, scriptable VR and AR platforms, and delivering open-ended extensible 3D browser-like applications on WebGL, mobile and desktop platforms. I've been developing and supporting the open source UnityJS core by integrating both popular free Unity and JavaScript libraries (i.e. JSONDotNet, LeanTween, TextMesh Pro, UnityGLTF, SocketIO networking, Ace code editor, d3 visualization library, etc) and proprietary libraries and extensions (i.e. JauntVR SDK, MapBox SDK, your own SDK, or bespoke code that I develop), so they can all be easily and efficiently scripted and orchestrated together in JavaScript. So far I've applied UnityJS to JauntVR's panoramic VR video player on Android, WovenAR's scriptable AR platform on iOS, and ReasonStreet's interactive financial data driven visualization system on WebGL, and I'm looking for other interesting people to work with on exciting and fitting applications for UnityJS! https://github.com/SimHacker/UnityJS https://github.com/SimHacker/UnityJS https://github.com/SimHacker/UnityJS/blob/master/doc/Anatomy.txt https://github.com/SimHacker/UnityJS/blob/master/doc/Anatomy... Here are some other things I've written about it on HN (in chronological order): https://news.ycombinator.com/item?id=17309132 https://news.ycombinator.com/item?id=17309132 https://news.ycombinator.com/item?id=17384078 https://news.ycombinator.com/item?id=17384078 https://news.ycombinator.com/item?id=18171571 https://news.ycombinator.com/item?id=18171571 https://news.ycombinator.com/item?id=18860467 https://news.ycombinator.com/item?id=18860467 https://news.ycombinator.com/item?id=19748582 https://news.ycombinator.com/item?id=19748582 https://news.ycombinator.com/item?id=20313751 https://news.ycombinator.com/item?id=20313751 https://news.ycombinator.com/item?id=20744552 https://news.ycombinator.com/item?id=20744552 https://news.ycombinator.com/item?id=21932462 https://news.ycombinator.com/item?id=21932462 https://news.ycombinator.com/item?id=21932984 https://news.ycombinator.com/item?id=21932984
- tomc1985 7y agoJust learn C#, why stick to JS?
- PinkMilkshake 7y agoBabylonJS has an official, Unity-like editor that runs in the browser: https://github.com/BabylonJS/Editor https://github.com/BabylonJS/Editor