- from [Oskar Kogut](https://github.com/kretoskar): if you change a `BlueprintCallable` function to `const` (or otherwise make it pure,) the editor will automatically correct the `Exec` pin flow for you
+ the design of Blueprint the Language is pretty dated - it is still an imperative language and has a concept similar to statements (`Exec` pins), which breaks the entire idea of pure data
+ this results in weird edge cases like needing two separate node types to handle branching (one that can have side effects - `Branch`, and another that can't - `Select`)
- however it is quite annoying because you can only switch on enums (and other stuff that has a finite set of values,) whereas with `Branch` you can use any `Bool` condition you want
- this isn't an unsolvable problem but it illustrates the pure vs impure issue pretty well - you'd have to duplicate the implementation of `Switch on Gameplay Tag` to have
+ except where it usually applies to the `async` concept found in most modern programming languages, here it applies to the concept of control flow vs data flow
- since control flow is based on those `Exec` pins, you can easily map your classic concept of callbacks to simply firing off the appropriate `Exec` pin
% id = "01H8Y427B05AER1R4XK1GZ6A0M"
- for example the node for playing animations (`Play AnimMontage`) has a few pins coming out of it that signal playback events like `On Ended`, `On Blend Out`, `On Interrupted`
% id = "01H8Y427B01SE52ZYA410QKWDQ"
- and you wouldn't even know these are implemented as delegates in C++landia. it just feels like a first-class feature
% id = "01H8Y427B0V2Y76JJ3Z229PD15"
- the only gripe I have is that you can only have latent nodes in the main event graph (you cannot have them within functions)
% id = "01H8Y427B0SPJ3NJCFS7S4YGR9"
- which is annoying but not terrible, since most of that latent, high level gameplay logic happens inside the main event graph anyways
- which means that when you first load a Blueprint, some of the wires will be bent in weird ways, and will fall into place as you zoom out and explore the graph more
- there's a `Straighten Connection` feature, which you can use to make your graphs look more aesthetically pleasing, but it only straightens the nodes such that they look good on the current zoom level
- so what'll happen with it sometimes is you'll straighten a connection, then zoom in, and the connection won't be quite straight because of the aforementioned layout shift
- refactoring your nodes is a hell of a pain. Blueprint is kind of write-only
% id = "01HA4HJKRVBSRB5T1GM0TBE1C7"
- say you're calling `ApplyGameplayEffectToTarget` a bunch of times and you want to replace those occurrences with a custom function that wraps `ApplyGameplayEffectToTarget`
with some extra semantic information, to make it more discoverable, searchable, and easy to use
% id = "01HA4HJKRVGD7CW6T3MHRKNJS7"
- well then good luck :hueh:
% id = "01HA4HJKRVBN3RR32Q9WHMKVFY"
- in a text-based language you could use a dumb search and replace to accomplish this task, but there is no such thing in Blueprint. :cry:
- thus you can add a Mesh Component to your Blueprint and it'll load *the entire mesh with all the textures and skeleton and everything* when you wanna tweak a variable or some logic in the event graph
- the VM isn't implemented in the most optimal way
% id = "01H8Y427B1JJD3EK24DCG76GR0"
- I've analyzed this in my [`dispatchers` repository][def:dispatchers/repo] if you wanna have a read
% id = "01H8Y427B1T148Y0T8E48DKJ3N"
- and that hard reference thing can make gameplay stutter when you're loading in new assets, but that's a more widespread issue than just with Blueprints
% id = "01H8Y427B15BD0HJWM2Y3EZBSZ"
- but in reality most of the logic you're implementing in Blueprints (high-level gameplay stuff) shouldn't be that performance sensitive
% id = "01H8Y427B1G7ZYE3S8RRHG5WRQ"
- and it's not hard to extract the performance sensitive parts to C++ because Blueprint offers tools for refactoring your code