整体方案总结(AMyLevelManager)
架构目标
BeginPlay在 C++ 完成初始化逻辑,获取 GameInstance、PostProcessVolume、播放背景音乐、开启定时器。TimeCount 是纯 C++ 普通成员函数,不暴露给蓝图,定时器触发 TimeCount。
TimeCount(C++ 内部)调用子函数
TimerSubLogic;仅子函数支持蓝图重写,C++ 提供默认实现。背景音乐资源
StageLevelSound暴露到蓝图细节面板,编辑器直接选音效,无需改代码。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = “Audio”)
USoundBase* StageLevelSound = nullptr;
UPROPERTY(BlueprintReadWrite, Category = “LevelManager”)
UMyGameInstance* gameIns = nullptr;UPROPERTY(BlueprintReadWrite, Category = “LevelManager”)
APostProcessVolume* pp = nullptr;
FTimerHandle TimerHandle_level;
void TimeCount();
// 扩展入口:蓝图 / C++ 均可重写,
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = “LevelManager”)
void TimerSubLogic();
virtual void TimerSubLogic_Implementation() {}
// Called when the game starts or when spawned
void AMyLevelManager::BeginPlay()
{
Super::BeginPlay();
gameIns = Cast<UMyGameInstance>(UGameplayStatics::GetGameInstance(GetWorld())); if (!gameIns) { return; } pp = Cast<APostProcessVolume>(UGameplayStatics::GetActorOfClass(GetWorld(), APostProcessVolume::StaticClass())); SoundManagement(StageLevelSound); GetWorldTimerManager().SetTimer(TimerHandle_level, this, &AMyLevelManager::TimeCount, 1.0f, true);}
// Called every frame
void AMyLevelManager::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void AMyLevelManager::TimeCount()
{
TimerSubLogic();
}