At first i liked blueprints, but now i hate them.

@KarolLed
@Innos

I think someone more of your experience level (Im assuming both of you dont have any programming experience, just based on what you’ve asked so far) should start out with a more simplified game engine, because Unreal Engine while it may be super robust and can create any game/application you could think of, it also very abstract and takes prior knowledge of atleast some programming/technology terms. Until Uneal’s marketplace starts booming with multiple Game Templates, i think the template type architecture your looking for wont ever be present in the base version of Unreal Engine.

I would like to suggest Scratch or GameMaker to both of you, as they are much more simpler and can produce basic games, to get you started, and they also provide the templates you both have spoken of.

Scratch: https://scratch.mit.edu/
Game Maker: http://www.yoyogames.com/

I’m not yet familiar with Blueprint programming but I thought it is very cool that in Stingray, if you cut and paste a block of nodes into Notepad, you can see the code (Lua). The reverse works as well–code to node.

I have grown to agree with the OP to some degree. After trying to make a complex game work with blueprints we had to move almost everything to C++ and now just use them for data setup and configuration.

The reason C++ devs really dislike blueprints, isn’t that they are bad, but rather Epic is totally neglecting C++ developer support in favor of pushing blueprints. For example, trying to setup EQS in C++. There are no examples I could find, almost no docs (class docs are there IF you know what they are called), and we are stuck trying to guess how to use the C++ API by looking at how the blueprint node is implemented in the C++ sources. That’s not cool.

If there were parity, i.e. every blueprints example had matching C++ example code, there would be a lot less angst.

[=jrboddie;362266]
I’m not yet familiar with Blueprint programming but I thought it is very cool that in Stingray, if you cut and paste a block of nodes into Notepad, you can see the code (Lua). The reverse works as well–code to node.

The same system exists in Blueprint too! Copy the below code and paste it in a graph.


Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_3181"   Begin Object Class=EdGraphPin Name="EdGraphPin_38928"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38927"
   End Object
   Begin Object Name="EdGraphPin_38928"
      PinName="ReturnValue"
      PinToolTip="Return Value
Float"
      Direction=EGPD_Output
      PinType=(PinCategory="float")
      AutogeneratedDefaultValue="0.0"
      LinkedTo(0)=EdGraphPin'K2Node_CommutativeAssociativeBinaryOperator_53.EdGraphPin_38934'
      LinkedTo(1)=EdGraphPin'K2Node_Knot_94.EdGraphPin_38957'
   End Object
   Begin Object Name="EdGraphPin_38927"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Math Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMathLibrary')
      DefaultObject=Default__KismetMathLibrary
      bHidden=True
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMathLibrary',MemberName="GetPI")
   Pins(0)=EdGraphPin'EdGraphPin_38927'
   Pins(1)=EdGraphPin'EdGraphPin_38928'
   NodePosX=992
   NodePosY=448
   NodeGuid=AA5169984A6264D2D7826A8C66E8601B
End Object
Begin Object Class=K2Node_CommutativeAssociativeBinaryOperator Name="K2Node_CommutativeAssociativeBinaryOperator_53"
   Begin Object Class=EdGraphPin Name="EdGraphPin_38936"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38935"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38934"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38933"
   End Object
   Begin Object Name="EdGraphPin_38936"
      PinName="ReturnValue"
      PinToolTip="Return Value
Float"
      Direction=EGPD_Output
      PinType=(PinCategory="float")
      AutogeneratedDefaultValue="0.0"
      LinkedTo(0)=EdGraphPin'K2Node_CommutativeAssociativeBinaryOperator_54.EdGraphPin_38946'
   End Object
   Begin Object Name="EdGraphPin_38935"
      PinName="B"
      PinToolTip="B
Float"
      PinType=(PinCategory="float")
      DefaultValue="2"
      AutogeneratedDefaultValue="0.0"
   End Object
   Begin Object Name="EdGraphPin_38934"
      PinName="A"
      PinToolTip="A
Float"
      PinType=(PinCategory="float")
      DefaultValue="0.0"
      AutogeneratedDefaultValue="0.0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_3181.EdGraphPin_38928'
   End Object
   Begin Object Name="EdGraphPin_38933"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Math Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMathLibrary')
      DefaultObject=Default__KismetMathLibrary
      bHidden=True
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMathLibrary',MemberName="Multiply_FloatFloat")
   Pins(0)=EdGraphPin'EdGraphPin_38933'
   Pins(1)=EdGraphPin'EdGraphPin_38934'
   Pins(2)=EdGraphPin'EdGraphPin_38935'
   Pins(3)=EdGraphPin'EdGraphPin_38936'
   NodePosX=1088
   NodePosY=400
   NodeGuid=0C7A02DD444231E566E4319BEF9E13B3
End Object
Begin Object Class=K2Node_CommutativeAssociativeBinaryOperator Name="K2Node_CommutativeAssociativeBinaryOperator_54"
   Begin Object Class=EdGraphPin Name="EdGraphPin_38948"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38947"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38946"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38945"
   End Object
   Begin Object Name="EdGraphPin_38948"
      PinName="ReturnValue"
      PinToolTip="Return Value
Float"
      Direction=EGPD_Output
      PinType=(PinCategory="float")
      AutogeneratedDefaultValue="0.0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_3202.EdGraphPin_38991'
   End Object
   Begin Object Name="EdGraphPin_38947"
      PinName="B"
      PinToolTip="B
Float"
      PinType=(PinCategory="float")
      DefaultValue="0.0"
      AutogeneratedDefaultValue="1.000000"
      LinkedTo(0)=EdGraphPin'K2Node_Knot_94.EdGraphPin_38958'
   End Object
   Begin Object Name="EdGraphPin_38946"
      PinName="A"
      PinToolTip="A
Float"
      PinType=(PinCategory="float")
      DefaultValue="0.0"
      AutogeneratedDefaultValue="0.0"
      LinkedTo(0)=EdGraphPin'K2Node_CommutativeAssociativeBinaryOperator_53.EdGraphPin_38936'
   End Object
   Begin Object Name="EdGraphPin_38945"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Math Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMathLibrary')
      DefaultObject=Default__KismetMathLibrary
      bHidden=True
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMathLibrary',MemberName="Add_FloatFloat")
   Pins(0)=EdGraphPin'EdGraphPin_38945'
   Pins(1)=EdGraphPin'EdGraphPin_38946'
   Pins(2)=EdGraphPin'EdGraphPin_38947'
   Pins(3)=EdGraphPin'EdGraphPin_38948'
   NodePosX=1264
   NodePosY=400
   NodeGuid=EF1F931D4296CD166000E194B1E9CB73
End Object
Begin Object Class=K2Node_Knot Name="K2Node_Knot_94"
   Begin Object Class=EdGraphPin Name="EdGraphPin_38958"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38957"
   End Object
   Begin Object Name="EdGraphPin_38958"
      PinName="OutputPin"
      Direction=EGPD_Output
      PinType=(PinCategory="float")
      LinkedTo(0)=EdGraphPin'K2Node_CommutativeAssociativeBinaryOperator_54.EdGraphPin_38947'
   End Object
   Begin Object Name="EdGraphPin_38957"
      PinName="InputPin"
      PinType=(PinCategory="float")
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_3181.EdGraphPin_38928'
      bDefaultValueIsIgnored=True
   End Object
   Pins(0)=EdGraphPin'EdGraphPin_38957'
   Pins(1)=EdGraphPin'EdGraphPin_38958'
   NodePosX=1200
   NodePosY=470
   NodeGuid=5978C06741C2FE7EF39A2EB515106282
End Object
Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_3178"
   Begin Object Class=EdGraphPin Name="EdGraphPin_38971"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38970"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38969"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38968"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38967"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38966"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38965"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38964"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38963"
   End Object
   Begin Object Name="EdGraphPin_38971"
      PinName="Duration"
      PinToolTip="Duration
Float

The display duration (if Print to Screen is True). Using negative number will result in loading the duration time from the config."
      PinType=(PinCategory="float")
      DefaultValue="10"
      AutogeneratedDefaultValue="2.000000"
      bAdvancedView=True
   End Object
   Begin Object Name="EdGraphPin_38970"
      PinName="TextColor"
      PinToolTip="Text Color
Linear Color Structure

Whether or not to print the output to the console"
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.LinearColor')
      DefaultValue="(R=0.247604,G=1.000000,B=0.942644,A=1.000000)"
      AutogeneratedDefaultValue="(R=0.000000,G=0.660000,B=1.000000,A=1.000000)"
      bAdvancedView=True
   End Object
   Begin Object Name="EdGraphPin_38969"
      PinName="bPrintToLog"
      PinToolTip="Print to Log
Boolean

Whether or not to print the output to the log"
      PinType=(PinCategory="bool")
      DefaultValue="false"
      AutogeneratedDefaultValue="true"
      bAdvancedView=True
   End Object
   Begin Object Name="EdGraphPin_38968"
      PinName="bPrintToScreen"
      PinToolTip="Print to Screen
Boolean

Whether or not to print the output to the screen"
      PinType=(PinCategory="bool")
      DefaultValue="true"
      AutogeneratedDefaultValue="true"
      bAdvancedView=True
   End Object
   Begin Object Name="EdGraphPin_38967"
      PinName="InString"
      PinToolTip="In String
String

The string to log out"
      PinType=(PinCategory="string")
      DefaultValue="Hello"
      AutogeneratedDefaultValue="Hello"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_3202.EdGraphPin_38992'
   End Object
   Begin Object Name="EdGraphPin_38966"
      PinName="WorldContextObject"
      PinToolTip="World Context Object
Object Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/CoreUObject.Object')
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_38965"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet System Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetSystemLibrary')
      DefaultObject=Default__KismetSystemLibrary
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_38964"
      PinName="then"
      PinToolTip="
Exec"
      Direction=EGPD_Output
      PinType=(PinCategory="exec")
   End Object
   Begin Object Name="EdGraphPin_38963"
      PinName="execute"
      PinToolTip="
Exec"
      PinType=(PinCategory="exec")
   End Object
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetSystemLibrary',MemberName="PrintString")
   Pins(0)=EdGraphPin'EdGraphPin_38963'
   Pins(1)=EdGraphPin'EdGraphPin_38964'
   Pins(2)=EdGraphPin'EdGraphPin_38965'
   Pins(3)=EdGraphPin'EdGraphPin_38966'
   Pins(4)=EdGraphPin'EdGraphPin_38967'
   Pins(5)=EdGraphPin'EdGraphPin_38968'
   Pins(6)=EdGraphPin'EdGraphPin_38969'
   Pins(7)=EdGraphPin'EdGraphPin_38970'
   Pins(8)=EdGraphPin'EdGraphPin_38971'
   NodePosX=1536
   NodePosY=256
   NodeGuid=48AFFC09427A8A4C616580AC2F7922B8
   AdvancedPinDisplay=Hidden
End Object
Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_3202"
   Begin Object Class=EdGraphPin Name="EdGraphPin_38992"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38991"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_38990"
   End Object
   Begin Object Name="EdGraphPin_38992"
      PinName="ReturnValue"
      PinToolTip="Return Value
String"
      Direction=EGPD_Output
      PinType=(PinCategory="string")
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_3178.EdGraphPin_38967'
   End Object
   Begin Object Name="EdGraphPin_38991"
      PinName="InFloat"
      PinToolTip="In Float
Float"
      PinType=(PinCategory="float")
      DefaultValue="0.0"
      AutogeneratedDefaultValue="0.0"
      LinkedTo(0)=EdGraphPin'K2Node_CommutativeAssociativeBinaryOperator_54.EdGraphPin_38948'
   End Object
   Begin Object Name="EdGraphPin_38990"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet String Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetStringLibrary')
      DefaultObject=Default__KismetStringLibrary
      bHidden=True
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetStringLibrary',MemberName="Conv_FloatToString")
   Pins(0)=EdGraphPin'EdGraphPin_38990'
   Pins(1)=EdGraphPin'EdGraphPin_38991'
   Pins(2)=EdGraphPin'EdGraphPin_38992'
   NodePosX=1408
   NodePosY=400
   NodeGuid=75E7E7C944A99986BBE217B012F6FDBE
End Object


That was one hell of a bump…

And I still stand by my previous comment!

[=rjsams;482805]
I have grown to agree with the OP to some degree. After trying to make a complex game work with blueprints we had to move almost everything to C++ and now just use them for data setup and configuration.

The reason C++ devs really dislike blueprints, isn’t that they are bad, but rather Epic is totally neglecting C++ developer support in favor of pushing blueprints. For example, trying to setup EQS in C++. There are no examples I could find, almost no docs (class docs are there IF you know what they are called), and we are stuck trying to guess how to use the C++ API by looking at how the blueprint node is implemented in the C++ sources. That’s not cool.

If there were parity, i.e. every blueprints example had matching C++ example code, there would be a lot less angst.

They already do, because the K2 nodes are all just c++. In a ton of cases you can even use the same function in c++. The right click context menu for most nodes contains a ‘goto code definition’ option for this. In your case there is an actual working example of using EQS in native code, the EQS testing pawn. It runs a query then draws the results so people can visualize a query on a map. I used it to experiment with putting characters into a formation for strategy games. You will still have to make the query asset in the editor, but your context and generator nodes can be written in c++. I think one of those can’t be written in blueprint actually.

K2 nodes are basically black boxes to the blueprint only developers. We have the whole code-base for our game module, custom plugins, and the engine right there in the IDE project. We can search for all uses of a function in Epic’s code. They need documentation, and for Epic to give them new things to access from blueprint. If Epic doesn’t do this blueprint only developers would be stuffed. We are not so helpless.

You get a robust data system mixed with scripting that integrates seamlessly with c++. If you don’t think that owns there is something wrong with you.

BP’s are . Just needs a little more love in the docu’s :slight_smile:

[=;197841]
I just wanna say, that i really hate blueprints.

So don’t use it! What’s the problem?
My brother is a programmer, and he said he’s tired of coding, coding, coding… and that, the visual programming IS THE FUTURE.
Certainly UE4 blueprints is not the best example for it, but one day we will have better visual programming, I assure you.

[=;198249]
3) Non-programmers MUST not programm in any form

******** !!! I am non-programmer and it doesn’t stop me from scripting with other game engines. Hell, I dab at C++ at times (for really small and simple things).

But I would partially agree that BP can become messy and less intuitive when it comes to game logic. So far, out of all scripting in various engines I worked with, I really like DoomScript from Doom 3. If UE4 had something similar + BP (with choice of either using scripting only or in conjunction with BP), then it would be a much better approach.

[=rjsams;482805]
I have grown to agree with the OP to some degree. After trying to make a complex game work with blueprints we had to move almost everything to C++ and now just use them for data setup and configuration.

The reason C++ devs really dislike blueprints, isn’t that they are bad, but rather Epic is totally neglecting C++ developer support in favor of pushing blueprints. For example, trying to setup EQS in C++. There are no examples I could find, almost no docs (class docs are there IF you know what they are called), and we are stuck trying to guess how to use the C++ API by looking at how the blueprint node is implemented in the C++ sources. That’s not cool.

If there were parity, i.e. every blueprints example had matching C++ example code, there would be a lot less angst.

I’m not getting that… It seems they have made a number of improvements in the API… lots of features have been sunset and made easier. They have released more tutorials and they are doing a new stream with tanks and zombies…

[=;198249]

  1. No, my point is, blueprints must die.
  2. Also my point is, to make better high-level interfaces for C++ classes, so it should be very easy to use, easier than blueprints.
  3. Non-programmers MUST not programm in any form, also blueprint form.

yeeeeeeeeeeeeeeee <3 <3 <3

btw, to all people that think “I can make a quick prototype with blueprint and then translate to c++”
you are writing 2 times the same code, the first one cause c++ is not easy enough and the second one cause blueprints is not up to the task.

why unity doesn’t need that? cause it provides an easier, more productive and faster (build time) language.

Epic should consider more developer productivity and be less artists oriented.
That is why all games made with Unreal are the same. They just look good.

[=MaxiHori;486644]

why unity doesn’t need that? cause it provides an easier, more productive and faster (build time) language.

That’s why Unity games looks so bad, because they are made by programmers.
And again, if you guys don’t like blueprints, don’t use them. What’s the big deal?
Or just stay with Unity.

[=MaxiHori;486644]
yeeeeeeeeeeeeeeee <3 <3 <3

btw, to all people that think “I can make a quick prototype with blueprint and then translate to c++”
you are writing 2 times the same code, the first one cause c++ is not easy enough and the second one cause blueprints is not up to the task.

why unity doesn’t need that? cause it provides an easier, more productive and faster (build time) language.

Epic should consider more developer productivity and be less artists oriented.
That is why all games made with Unreal are the same. They just look good.

Have you spend much time with the API’s in C++… They are ! What else would you like to see… Examples would help.

[=MaxiHori;486644]
Epic should consider more developer productivity and be less artists oriented.
That is why all games made with Unreal are the same. They just look good.

UE4 is not quite artists oriented. If you were an artist, you would understand how hard pipeline is to import models in UE4…
Heh, I wish it was so simple like in Unity3d or Stingray… See my last post here: UE4 Roadmap - Feedback & Requests - Epic Developer Community Forums
And also I don’t see problems with it being artists oriented. UE4 is a first engine that can really be used for ArchViz, or VR, and not only for games.
You don’t understand how much business it can bring. For people like me, architects and artists primarily this is a real bliss.

[=dzodzu;486906]
And again, if you guys don’t like blueprints, don’t use them. What’s the big deal?

“Feedback for Epic”

[=teak421;486913]
What else would you like to see… Examples would help.

well proper intellisense and quicker build times would be nice. but I’m mainly slowed down by productivity, things like linq makes a huge difference.

[=dzodzu;486941]
I don’t see problems with it being artists oriented.

No problem with that, the problem is that instead of making life easier to code, they try to make artists do programming.
It would be the same if they tried to make me paint something.

None of the teams I’ve seen working let artists code anything.
If you’re working on UE4 all alone, there is your real problem right there; this engine is not designed for that.

[= ;487090]
None of the teams I’ve seen working let artists code anything.
If you’re working on UE4 all alone, there is your real problem right there; this engine is not designed for that.

So you do agree with me.
all the “you can make a game without even know how to code” is false cause as you said “None of the teams I’ve seen working let artists code anything”,
and you cannot make indie games with unreal cause “this engine is not designed for that”.

btw, I’m just complaining about productivity from a developer point of view. This is a feedback, I want more, that’s it.

I would like to see intellisense a little more intelligent… great point! Build times aren’t so bad, at least for me. But, the API… the “stuff” they make available for folks is amazing. No doubt things could stand improvement… but that’s for any engine.

[=MaxiHori;487093]
So you do agree with me.
all the “you can make a game without even know how to code” is false cause as you said “None of the teams I’ve seen working let artists code anything”,
and you cannot make indie games with unreal cause “this engine is not designed for that”.

btw, I’m just complaining about productivity from a developer point of view. This is a feedback, I want more, that’s it.

No; you can make indie games with it. You just will suffer to make large games if making it alone, but that is not engine’s fault.
I’ve never worked on AAA, all teams I went into were/are indie. Still is a lot of work to build a game, no matter which engine you use; that marketing phrase isn’t entirely true but isn’t entirely false also.
You can make many games by yourself, but most likely none of them will have any market value.

[=teak421;487108]
I would like to see intellisense a little more intelligent… great point! Build times aren’t so bad, at least for me. But, the API… the “stuff” they make available for folks is amazing. No doubt things could stand improvement… but that’s for any engine.

Intellisense is not Epic’s fault; try Visual Assist plugin for Visual ; or try other IDEs…