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.