Designing the exposed surface: reflection macros, meta specifiers, and structuring a system that is both fast and tunable.
It happens through the reflection macros. They are how C++ becomes visible and editable to designers.
| Specifier | Effect |
|---|---|
| EditAnywhere | Editable in the details panel, on both defaults and instances |
| EditDefaultsOnly | Restricts editing to the class defaults — the CDO (Chapter 6) |
| BlueprintReadWrite | Blueprints can get and set it |
| Category="..." | Organizes it into a labelled section of the panel |
| Specifier | Effect |
|---|---|
| BlueprintCallable | Designers can call it from a graph |
| BlueprintPure | Marks a side-effect-free getter (no exec pins) |
| BlueprintImplementableEvent | Declared in C++, implemented entirely in Blueprint |
| BlueprintNativeEvent | C++ provides a default that Blueprint can override |
BlueprintPure nodes have no execution pins, which also means you cannot place a breakpoint on one — see Chapter 18.
Safety and polish come from the meta specifiers:
ClampMin and ClampMax constrain the value itself — a designer physically cannot enter something outside the range.UIMin and UIMax set the slider range, without hard-limiting typed input.EditCondition gates one field on another, so irrelevant options grey out instead of confusing people.When a system has to be both, split it by kind of work rather than trying to compromise:
UPROPERTY fields, Data Assets and Data Tables that designers edit without recompiling (Chapter 8).BlueprintImplementableEvent or dispatchers — so designers can attach behavior at key moments without ever touching the hot loop.Designers tune numbers and compose responses in Blueprint and data. They never run expensive per-tick logic in Blueprint.
"Gameplay logic in C++, tuning and composition in Blueprints" is the typical pattern because it puts each kind of work where it belongs.
What you get out of it:
Answer each out loud before re-reading the chapter.