Reflection Discipline
Annotate only stable interfaces. Avoid exposing transient internals that may break serialized assets.
Аннотируйте только стабильные интерфейсы. Не открывайте transient-внутренности, которые ломают сериализованные ассеты.
C++ Integration
C++ Integration
Define authoritative systems in C++, then expose constrained APIs through `UFUNCTION` and `UPROPERTY` metadata.
Интеграция C++
Определяйте authoritative-системы в C++, а затем открывайте ограниченные API через метаданные `UFUNCTION` и `UPROPERTY`.
Video Walkthrough
Видеообзор
Shared UE5 explainer video for this section.
Общее объясняющее видео по UE5 для этого раздела.
Annotate only stable interfaces. Avoid exposing transient internals that may break serialized assets.
Аннотируйте только стабильные интерфейсы. Не открывайте transient-внутренности, которые ломают сериализованные ассеты.
Use reliable RPC for critical game state, unreliable RPC for frequent non-critical cosmetic updates.
Применяйте reliable RPC для критичного игрового состояния, unreliable RPC для частых некритичных косметических обновлений.
BlueprintNativeEvent is useful when designers need override points without touching engine-level logic.
BlueprintNativeEvent полезен, когда дизайнерам нужны точки переопределения без изменения engine-уровня логики.
Never trust client-originated values in Server RPC without validation.
Никогда не доверяйте значениям от клиента в Server RPC без валидации.
Expose intent APIs, not transport details. Keep replication strategy internal to C++.
Экспортируйте intent-API, а не детали транспорта. Стратегию репликации держите внутри C++.
UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class UCombatAbilityComponent : public UActorComponent
{
GENERATED_BODY()
public:
UFUNCTION(Server, Reliable)
void ServerActivateAbility(int32 AbilityId, FVector_NetQuantize TargetPoint);
UFUNCTION(NetMulticast, Unreliable)
void MulticastPlayAbilityFX(int32 AbilityId);
UPROPERTY(ReplicatedUsing=OnRep_CooldownState, BlueprintReadOnly)
TMap<int32, float> CooldownByAbility;
private:
UFUNCTION()
void OnRep_CooldownState();
};