RPG64.制作敌人攻击波数四:优化
1。优化:当前处于最后一波袭击时,在生成敌人前倒计时结束后,会显示最后一波袭击的提示。
为此,我们需要知道倒计时的总动画长度,并以此为延迟生成最后一波袭击的ui提示。
所以我们需要计算两个动画的总时长,稍作调整
然后打开BP_SurvialGamemode
在枚举的第二个引脚后设置
2。添加难度设置,根据gamamode的不同难度,将会对玩家的技能等级和属性等级、敌人的技能等级和属性等级造成不一样的影响。
打开WarriorEnumTypes.添加难度枚举
UENUM(BlueprintType)
enum class EXMBGameDifficulty : uint8
{Easy,Normal,Hard,VeryHard
};
然后打开XMBGameModeBase
public://FORCEINLINE EXMBGameDifficulty GetCurrentGameDifficulty() const { return CurrentGameDifficulty; }protected:UPROPERTY(EditDefaultsOnly,BlueprintReadOnly,Category = "Game Settings")EXMBGameDifficulty CurrentGameDifficulty;
然后再WarriorPlayer.cpp的PossessedBy函数内,这个函数式对玩家的属性和技能进行等级定义,所以要根据难度来设置定义的等级。
void AWarriorPlayer::PossessedBy(AController* NewController)
{Super::PossessedBy(NewController);//if (!CharacterStartUpData.IsNull()){//使用同步加载的方式尝试加载数据if (UDataAsset_PlayerStartUpData* LoadedData = Cast<UDataAsset_PlayerStartUpData>(CharacterStartUpData.LoadSynchronous())){//根据游戏难度设置等级int32 AbilityApplyLevel = 1;if (AXMBGameModeBase* BaseGameMode = GetWorld()->GetAuthGameMode<AXMBGameModeBase>()){switch (BaseGameMode->GetCurrentGameDifficulty()){case EXMBGameDifficulty::Easy:AbilityApplyLevel = 4;break;case EXMBGameDifficulty::Normal:AbilityApplyLevel = 3;break;case EXMBGameDifficulty::Hard:AbilityApplyLevel = 2;break;case EXMBGameDifficulty::VeryHard:AbilityApplyLevel = 1;break;default:break;}}LoadedData->GiveToAbilitySystemComponent(XMBAbilitySystemComponent,AbilityApplyLevel);}}
}
在EnemyBase.cpp的InitEnemyStartUpData函数内
void AEnemyBase::InitEnemyStartUpData()
{if (CharacterStartUpData.IsNull()){return;}//根据游戏难度设置等级int32 AbilityApplyLevel = 1;if (AXMBGameModeBase* BaseGameMode = GetWorld()->GetAuthGameMode<AXMBGameModeBase>()){switch (BaseGameMode->GetCurrentGameDifficulty()){case EXMBGameDifficulty::Easy:AbilityApplyLevel = 1;break;case EXMBGameDifficulty::Normal:AbilityApplyLevel = 2;break;case EXMBGameDifficulty::Hard:AbilityApplyLevel = 3;break;case EXMBGameDifficulty::VeryHard:AbilityApplyLevel = 4;break;default:break;}}//使用异步加载资产UAssetManager::GetStreamableManager().RequestAsyncLoad(CharacterStartUpData.ToSoftObjectPath(),// 将 TSoftObjectPtr 转换为 FSoftObjectPath,供异步加载系统使用FStreamableDelegate::CreateLambda([this,AbilityApplyLevel ](){if (UDataAsset_EnemyStartUpData* LoadedData = Cast<UDataAsset_EnemyStartUpData>(CharacterStartUpData.Get())){// 将加载的数据传递给能力系统组件LoadedData->GiveToAbilitySystemComponent(XMBAbilitySystemComponent,AbilityApplyLevel);}}));
}
启动项目后,在BaseGamemode内进行设置,运行时输入debugabilitysystem将进行查看属性内容是否对得上。