C++ is not like C#, especially with the UE4 macros, conventions and added complexity; its not for the feint of heart (not saying you are, but until you do a big project with UE4 C++ you should want to do nothing more than a Hello World and work up the chain).
[/]
Yeah, perhaps I’m skipping the ‘Hello World’ part. :).
I always wonder how people with absolutely no affinity for visual stuff can even end up developing games. What I understand even less though, with your programming background you should be absolutely ecstatic you can use something as expressive as C++ and have access to the engine code. Even if you don’t understand a thing (hell I don’t understand 99% of it either, but I sure find it exciting). Anyway, you seem to have made up your mind that blueprints are too visual and C++ is too codey or something, so have you checked out the following intermediary solutions?
https://mono-ue…io
Granted, the Mono effort seems to have stopped, but Skookum looks great for someone like you. It’s been in development for a long time though, and they’ve gone rather quiet, but a release can’t be far away now. Maybe you can get on the beta. Just be aware that by avoiding blueprints completely you’ll be missing out big time. They are just too integral to ignore. Even if you went with C++ you very much want to use blueprints in tandem. Both are meant to work together.
[/]
Visuals are too much overrated imho. I don’t know why everything has to be “visual” nowadays.
Also, I don’t think most former C++ developers who went C# want to go back to C++, so I don’t understand why you’re surprised at all.
BTW, Skookum seems good enough. Thanks for the recommendation. There are things to consider though, specially because I’ve learned my personal quota of ‘obscure stuff that serves nothing nowadays’, I’m not saying that Skookum is going to fail or something, but I surely have to think twice before investing time learning something that so far doesn’t seem very widely adopted, I mean, is that knowledge valuable if I end up not using it at all?
Unreal4 C++ is like C++ on training wheels, don’t be afraid of it, get a good book, look at the unreal template’s codem, figure it out, if you already know C# then it will just be annoying but not hard to master.
This is been said before, the choice of C++ is because is the game industry standard, if you wanna become someone in this industry you have to learn C++, i wouldn’t even consider using Unreal if it wasn’t for it, as it would be a big waste of time, hence the reason i do most stuff in C++ including game jams.
[/]
Not in the game industry knows C++, that’s for sure. Perhaps most programmers in AAA industry, but surely not . I don’t want to be a ‘programmer’, so, being able to read and understand C++ properly is more than enough for me imho.
Not sure what you mean there.
The idea is that you should use technology you’re the most comfortable/productive with, not the “newest/shiniest/most popular” one.
After significant amount of C++ experience, C# is extremely unpleasant to work with. C# is limiting and occasionally tries to babysit you. For example:
-
because it is garbage collected, you can’t actually delete any object that is not GameObject/unity object based. You set it to null, and politely wait for GC to pick it up someday.
-
However, unity does not garbage collect scene objects.
-
But because it is technically garbage collected you can’t apply RAII and implement automatic object destructions and trigger object destruction when variable goes out of scope. Anything that HAS to be destructible is used in very awkward way through IDisposable interface.
-
No multiple inheritance.
-
No protected inheritance. Interfaces are inheritance.
-
No const parameters in functions. No const references.
-
No const functions. I wanna ensure that this function can’t change my class instance, dammit.
-
Any attempt to use value type and ref parameters will result in huge amount of pain. Usually language will demand that you initialize every single field even if you’re not using it.
-
I believe there’s trouble if you’ll try to pass out parameter to another function with “out” parameter. You’ll need to create temporary.
-
Type deduction for generics is inferior.
-
No type aliases or typedefs. Having to type “TMap<String, TList<MyStructureStorageType>>” every time is great.
-
“var” does not work in class declaration. “TMap<String, TList<MyStructureStorageType>> myMap = new TMap<String, TList,MyStructureStoragetype>>();”! Gee, thanks. Always dreamed about having to do that dozen times per any new complex class.
-
No macros means you can’t collapse those pesky getter/setter function into one-liners and have to type out every repeating pattern, increasing chance of human error and typo.
-
You’ll have to use Unity serializer, but it does not support generic types. At all. You’ll need to inherit class from generic type container, then mark it as [System.Serializable].
-
Everything is visible from anywhere. No visibility control. If you add anything to namespace, it will be visible from every other file as part of that namespace. C++ allows precise visibility control with its .h/.cpp scheme. Anything that is in *.cpp is by default pretty much invisibile from any other cpp, which reduces namespace pollution.
-
Defining object equivalence by implementing Equals() is “FUN”. There’s no clear standard on whether operator== means equivalence by reference equivalence or value equivalence so everybody uses whatever they want.
That’s just a few that comes to mind, not to mention that there are engine-specific quirks, like not having access to the serializer out of the box (you’ll need to download unmainatained third party script or buy it for $20 from asset store).
The ONLY good feature C# has is reflection (You’ll hear “don’t use reflection, it is slow!” all the time) and apparently ability to construct functions at runtime in the very awkward way using Expressions namespace. And that’s it. Those two advantages are outweighted by huge number of issues.
So, I’d rather not see Epic team waste their time impelmenting C# binding. You’re free to implement them yourself, just keep in mind that according to EULA you’ll have to release those language bindings for free.
As it was mentioned, epic team put some effort into making your life easier by implementing some helper facilities. So you shouldn’t have much trouble if you already have experience with C#.
Err, no. Unity has number of superior technologies, except that many of them are buggy.
C# is not one of those better technologies.
For example, realtime precomputed global illumination is still experimental in unreal 4, but it is implemented in unity. You bake scene in specfic way and you’ll be able to change light color/intensity on runtime, and changes will propagate across scene, with light bounces. However, on highly modular setup every object might receive random tint (it is significantly worse than lightmass seams) and those realtime baked lights won’t be casting any dynamic shadows.
Also, mecanim can retarget root motion properly, which is not the case with Persona animation retargeting at the moment.
[/]
I agree with much of what you said. However I’m pretty sure that ‘list’ will end up way bigger in the opposite situation :P. Here are some points:
GC - yeah, sucks terribly, I agree, but it’s still much better than not having it imho.
Lack of multiple inheritance really sucks. Workarounds are cheap and crappy.
ref is certain trouble. Sure.
Equals() is sure nonsensical… I’m not sure if there’s no standard though.
I’ve either never experienced/needed the other stuff, or they work great for me, for example /out/ always was great, and lack of type aliases/typedefs i never really needed but i see how they could be useful… autocompletion helps immensely here though, but I agree that it could get too verbose.
Something important you mentioned is the asset store. Everything nowadays ends up in the asset store. It’s the solution to all your problems, there’s no problem in that per se, except when most of these solutions clearly should be built-in.
I’m not a fan of reflection. Sendmessage for example, which is widely used, I find that extremely ugly, or passing a string in GetComponent, it feels to me like bad code that will break soon :P. Most people seems to be OK with that though.