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
[=;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]
- No, my point is, blueprints must die.
- Also my point is, to make better high-level interfaces for C++ classes, so it should be very easy to use, easier than blueprints.
- 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…
[=;198249]
- No, my point is, blueprints must die. (Except for material editor ;d)
- Also my point is, to make better high-level interfaces for C++ classes, so it should be very easy to use, easier than blueprints.
- Non-programmers MUST not programm in any form, also blueprint form. (there must be ready to use component blocks with properties and complete implemented logic with variaty of choises).
I know this is an old thread, but I just wanted to come here and chime in my two cents.
-
Give some reasoning… What make the mat editor so special? Think about how a actor could be a material, you do operations and return some result. it’s the same thing. just saves you typing your ideas not visualizing them.
-
Never going to happen, have you ever programmed C++? It will never be as easy to use as bp. Never. I think you’re looking at this wrong. The fundamental problem is learning a library, that’s what UE4 is, a gigantic library with tons of books and manuscripts that all have names, a description hopefully, and the actual contents. BP,C++,X,high-level interfaces for c++, everything will have those three things and you will inevitability have the same problem. Ease of use comes from both a well designed and documented apparatus, plus most importantly, familiarity.
-
Never going to happen, I don’t think you understand what “programming” is. It’s problem solving. If you think non-programmers must not problem solve in video game development, then you are sadly mistaken and have no idea what game dev is, or rather what the job of any person working really is, your job is to solve problems. tools are given to help facilitate your ability to solve problems the same is for artists, programmers, designers, managers, ceos, is doing what people “programming” are. its just “how” you solve problems. Your example of component blocks with properties and complete implemented logic with a variety of choices is exactly blueprint. furthermore, that would be programming.