Unreal Engine 5.7 — 当前最佳实践¶
最后验证: 2026-02-13
本文件介绍 UE5 的一些现代模式,这些内容可能不在 LLM 的训练数据中。 以下为截至 UE 5.7 的生产就绪建议。
项目设置¶
新项目请使用 UE 5.7¶
- 最新功能:Megalights、可用于生产的 Substrate 和 PCG
- 更好的性能和稳定性
选择正确的渲染功能¶
- Lumen:实时全局光照(推荐用于大多数项目)
- Nanite:用于高多边形网格的虚拟化几何体(推荐用于精细环境)
- Megalights:数百万个动态光源(推荐用于复杂光照)
- Substrate:模块化材质系统(推荐用于新项目)
C++ 编码¶
使用现代 C++ 特性(UE5.7 中的 C++20)¶
// ✅ Use TObjectPtr<T> (UE5 type-safe pointers)
UPROPERTY()
TObjectPtr<UStaticMeshComponent> MeshComp;
// ✅ Structured bindings
if (auto [bSuccess, Value] = TryGetValue(); bSuccess) {
// Use Value
}
// ✅ Concepts and constraints (C++20)
template<typename T>
concept Damageable = requires(T t, float damage) {
{ t.TakeDamage(damage) } -> std::same_as<void>;
};
使用 UPROPERTY() 进行垃圾回收¶
// ✅ UPROPERTY ensures GC doesn't delete this
UPROPERTY()
TObjectPtr<AActor> MyActor;
// ❌ Raw pointers can become dangling
AActor* MyActor; // Dangerous! May be garbage collected
使用 UFUNCTION() 向蓝图公开¶
// ✅ Callable from Blueprint
UFUNCTION(BlueprintCallable, Category="Combat")
void TakeDamage(float Damage);
// ✅ Implementable in Blueprint
UFUNCTION(BlueprintImplementableEvent, Category="Combat")
void OnDeath();
蓝图最佳实践¶
在蓝图与 C++ 之间做选择¶
- C++:核心玩法系统、性能关键代码、底层引擎交互
- 蓝图:快速原型、内容创建、数据驱动逻辑、设计师工作流
蓝图性能提示¶
// ✅ Use Event Tick sparingly (expensive)
// Prefer timers or events
// ✅ Use Blueprint Nativization (Blueprints → C++)
// Project Settings > Packaging > Blueprint Nativization
// ✅ Cache frequently accessed components
// Don't call GetComponent every tick
渲染(UE 5.7)¶
使用 Lumen 进行全局光照¶
// Enable: Project Settings > Engine > Rendering > Dynamic Global Illumination Method = Lumen
// Real-time GI, no lightmap baking needed (RECOMMENDED)
将 Nanite 用于高多边形网格¶
// Enable on Static Mesh: Details > Nanite Settings > Enable Nanite Support
// Automatically LODs millions of triangles (RECOMMENDED for detailed meshes)
将 Megalights 用于复杂光照(UE 5.5+)¶
// Enable: Project Settings > Engine > Rendering > Megalights = Enabled
// Supports millions of dynamic lights with minimal cost
使用 Substrate 材质(在 5.7 中可用于生产)¶
// Enable: Project Settings > Engine > Substrate > Enable Substrate
// Modular, physically accurate materials (RECOMMENDED for new projects)
Enhanced Input 系统¶
设置 Enhanced Input¶
// 1. Create Input Action (IA_Jump)
// 2. Create Input Mapping Context (IMC_Default)
// 3. Add mapping: IA_Jump → Space Bar
// C++ Setup:
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
void AMyCharacter::BeginPlay() {
Super::BeginPlay();
if (APlayerController* PC = Cast<APlayerController>(GetController())) {
if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer())) {
Subsystem->AddMappingContext(DefaultMappingContext, 0);
}
}
}
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) {
UEnhancedInputComponent* EIC = Cast<UEnhancedInputComponent>(PlayerInputComponent);
EIC->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
EIC->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
}
void AMyCharacter::Move(const FInputActionValue& Value) {
FVector2D MoveVector = Value.Get<FVector2D>();
AddMovementInput(GetActorForwardVector(), MoveVector.Y);
AddMovementInput(GetActorRightVector(), MoveVector.X);
}
Gameplay Ability System(GAS)¶
将 GAS 用于复杂玩法¶
- ✅ 使用 GAS 实现:技能、增益、伤害计算、冷却
- 模块化、可扩展、支持多人游戏
// Install: Enable "Gameplay Abilities" plugin
// Example Ability:
UCLASS()
class UGA_Fireball : public UGameplayAbility {
GENERATED_BODY()
public:
virtual void ActivateAbility(...) override {
// Ability logic
SpawnFireball();
CommitAbility(); // Commit cost/cooldown
}
};
World Partition(大型世界)¶
将 World Partition 用于开放世界¶
// Enable: World Settings > Enable World Partition
// Automatically streams world cells based on player location
// Data Layers: Organize content (e.g., "Gameplay", "Audio", "Lighting")
// Runtime Data Layers: Load/unload at runtime
Niagara(VFX)¶
使用 Niagara(而非 Cascade)¶
// Create: Content Browser > Right Click > FX > Niagara System
// GPU-accelerated, node-based particle system (RECOMMENDED)
// Spawn particles:
UNiagaraComponent* NiagaraComp = UNiagaraFunctionLibrary::SpawnSystemAtLocation(
GetWorld(),
ExplosionSystem,
GetActorLocation()
);
MetaSounds(音频)¶
将 MetaSounds 用于程序化音频¶
// Create: Content Browser > Right Click > Sounds > MetaSound Source
// Node-based audio, replaces Sound Cue for complex logic (RECOMMENDED)
// Play MetaSound:
UAudioComponent* AudioComp = UGameplayStatics::SpawnSound2D(
GetWorld(),
MetaSoundSource
);
Replication(多人游戏)¶
服务器权威模式¶
// ✅ Client sends input, server validates and replicates
UFUNCTION(Server, Reliable)
void Server_Move(FVector Direction);
void AMyCharacter::Server_Move_Implementation(FVector Direction) {
// Server validates and applies movement
AddMovementInput(Direction);
}
// ✅ Replicate important state
UPROPERTY(Replicated)
int32 Health;
void AMyCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const {
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AMyCharacter, Health);
}
性能优化¶
使用对象池¶
// ✅ Reuse objects instead of Spawn/Destroy
//
// ⚠ INCONSISTENT WITH THIS FILE'S OWN RULE (flagged 2026-08-10).
// The GC section above states that an unmarked raw UObject pointer is
// "Dangerous! May be garbage collected" and requires UPROPERTY() +
// TObjectPtr<T>. This pooling example then holds raw AActor* in a bare TArray,
// which is exactly the shape that section forbids. FOLLOW THE RULE, NOT THIS
// SNIPPET: declare the pool UPROPERTY() TArray<TObjectPtr<AActor>>.
//
// Left visible rather than silently rewritten: the corrected form has not been
// verified against Epic's docs for 5.7, and this directory is the offline
// substitute for them -- editing a code sample here from memory is the failure
// mode the whole reference exists to prevent. Re-verify, then fix both together.
TArray<AActor*> ProjectilePool;
AActor* GetPooledProjectile() {
for (AActor* Proj : ProjectilePool) {
if (!Proj->IsActive()) {
Proj->SetActive(true);
return Proj;
}
}
// Pool exhausted, spawn new
return SpawnNewProjectile();
}
使用实例化静态网格体¶
// ✅ Hierarchical Instanced Static Mesh Component (HISM)
// Render thousands of identical meshes in one draw call
UHierarchicalInstancedStaticMeshComponent* HISM = CreateDefaultSubobject<UHierarchicalInstancedStaticMeshComponent>(TEXT("Trees"));
for (int i = 0; i < 1000; i++) {
HISM->AddInstance(FTransform(RandomLocation));
}
调试¶
使用日志¶
// ✅ Structured logging
UE_LOG(LogTemp, Warning, TEXT("Player health: %d"), Health);
// Custom log category
DECLARE_LOG_CATEGORY_EXTERN(LogMyGame, Log, All);
DEFINE_LOG_CATEGORY(LogMyGame);
UE_LOG(LogMyGame, Error, TEXT("Critical error!"));
使用可视化日志¶
// ✅ Visual debugging
#include "VisualLogger/VisualLogger.h"
UE_VLOG_SEGMENT(this, LogTemp, Log, StartPos, EndPos, FColor::Red, TEXT("Raycast"));
UE_VLOG_LOCATION(this, LogTemp, Log, TargetLocation, 50.f, FColor::Green, TEXT("Target"));
总结:UE 5.7 推荐技术栈¶
| 功能 | 使用方案(2026) | 说明 |
|---|---|---|
| 光照 | Lumen + Megalights | 实时全局光照(GI),数百万盏灯光 |
| 几何体 | Nanite | 高多边形网格体,自动 LOD |
| 材质 | Substrate | 模块化,物理精确 |
| 输入 | Enhanced Input | 可重新绑定,模块化 |
| VFX | Niagara | GPU 加速 |
| 音频 | MetaSounds | 程序化音频 |
| 世界流送 | World Partition | 大型开放世界 |
| 游戏玩法 | Gameplay Ability System | 复杂技能与增益效果 |
来源:
- https://docs.unrealengine.com/5.7/en-US/
- https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-5-7-release-notes
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/Claude-Code-Game-Studios